From b33bf15cd82a1312e9f0c4528418644c81c9b339 Mon Sep 17 00:00:00 2001 From: GTrush Date: Wed, 4 Aug 2021 17:25:52 +0800 Subject: [PATCH 1/8] Update README.md, added npm install command --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 930f42ae..9ccc1270 100644 --- a/README.md +++ b/README.md @@ -73,6 +73,7 @@ git clone https://gitee.com/myems/myems.git # for generate the static direction: 'build' cd myems/web +npm install npm run build cd myems From fb6576ab368a2a11b4b01fc253af4aa769fac69b Mon Sep 17 00:00:00 2001 From: "13621160019@163.com" <13621160019@163.com> Date: Thu, 5 Aug 2021 10:21:58 +0800 Subject: [PATCH 2/8] added roadmap to README --- README.md | 5 +++++ README_DE.md | 6 ++++++ README_EN.md | 5 +++++ 3 files changed, 16 insertions(+) diff --git a/README.md b/README.md index 9ccc1270..7aa674cf 100644 --- a/README.md +++ b/README.md @@ -219,6 +219,11 @@ docker-compose up -d ![MyEMS Space EnergyCategory3](/docs/images/myems-space-energycategory3.gif) ![MyEMS Large Screen Dashboard](/docs/images/myems-large-screen-dashboard.gif) + +## MyEMS路线图 + +社区版[路线图](https://github.com/orgs/MyEMS/projects) + ## MyEMS镜像 [1]. http://github.com/MyEMS/myems diff --git a/README_DE.md b/README_DE.md index 868850eb..6d0f833c 100644 --- a/README_DE.md +++ b/README_DE.md @@ -206,6 +206,12 @@ Dieses Projekt besteht aus folgenden Komponenten: ![MyEMS Space EnergyCategory3](/docs/images/myems-space-energycategory3.gif) ![MyEMS Großbild-Dashboard](/docs/images/myems-large-screen-dashboard.gif) + +## MyEMS Straßenkarte + +Community Edition [Straßenkarte](https://github.com/orgs/MyEMS/projects) + + ## MyEMS Spiegel [1]. http://github.com/MyEMS/myems diff --git a/README_EN.md b/README_EN.md index 215d9495..5293829b 100644 --- a/README_EN.md +++ b/README_EN.md @@ -209,6 +209,11 @@ This project is compose of following components: ![MyEMS Large Screen Dashboard](/docs/images/myems-large-screen-dashboard.gif) +## MyEMS Roadmap + +Community Edition [Roadmap](https://github.com/orgs/MyEMS/projects) + + ## MyEMS Mirrors [1]. http://github.com/MyEMS/myems From b6c6659106e7bd07e04cc4d2bd6618fa7fb949e8 Mon Sep 17 00:00:00 2001 From: "13621160019@163.com" <13621160019@163.com> Date: Thu, 5 Aug 2021 10:52:00 +0800 Subject: [PATCH 3/8] replaced every_day_* to periodic_* in excelexporters of API --- .../excelexporters/combinedequipmentincome.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/myems-api/excelexporters/combinedequipmentincome.py b/myems-api/excelexporters/combinedequipmentincome.py index 9b585da9..1359c008 100644 --- a/myems-api/excelexporters/combinedequipmentincome.py +++ b/myems-api/excelexporters/combinedequipmentincome.py @@ -434,9 +434,9 @@ def generate_excel(report, row = str(table_row + 1 + j) ws[col + row].font = title_font ws[col + row].alignment = c_c_alignment - every_day_sum = reporting_period_values_every_day_sum(reporting_period_data, j, ca_len) - total_sum += every_day_sum - ws[col + row] = round(every_day_sum, 2) + periodic_sum = reporting_period_values_periodic_sum(reporting_period_data, j, ca_len) + total_sum += periodic_sum + ws[col + row] = round(periodic_sum, 2) ws[col + row].border = f_border row = str(table_row + 1 + len(time)) @@ -713,12 +713,12 @@ def generate_excel(report, return filename -def reporting_period_values_every_day_sum(reporting_period_data, every_day_index, ca_len): - every_day_sum = 0 +def reporting_period_values_periodic_sum(reporting_period_data, periodic_index, ca_len): + periodic_sum = 0 for i in range(0, ca_len): - every_day_sum += reporting_period_data['values'][i][every_day_index] + periodic_sum += reporting_period_data['values'][i][periodic_index] - return every_day_sum + return periodic_sum def get_parameters_timestamps_lists_max_len(parameters_timestamps_lists): From 8fbf1559607c1a38198c0a40294ab5f31b4dda2f Mon Sep 17 00:00:00 2001 From: "13621160019@163.com" <13621160019@163.com> Date: Thu, 5 Aug 2021 10:52:05 +0800 Subject: [PATCH 4/8] replaced every_day_* to periodic_* in excelexporters of API --- .../excelexporters/combinedequipmentcost.py | 8 +++---- .../excelexporters/combinedequipmentincome.py | 1 - myems-api/excelexporters/equipmentincome.py | 14 ++++++------ myems-api/excelexporters/shopfloorcost.py | 6 ++--- myems-api/excelexporters/spacecost.py | 22 +++++++++---------- myems-api/excelexporters/spaceincome.py | 20 ++++++++--------- myems-api/excelexporters/storecost.py | 6 ++--- myems-api/excelexporters/tenantcost.py | 6 ++--- 8 files changed, 40 insertions(+), 43 deletions(-) diff --git a/myems-api/excelexporters/combinedequipmentcost.py b/myems-api/excelexporters/combinedequipmentcost.py index 34e609e3..f40896cb 100644 --- a/myems-api/excelexporters/combinedequipmentcost.py +++ b/myems-api/excelexporters/combinedequipmentcost.py @@ -2,11 +2,9 @@ import base64 import uuid import os from decimal import Decimal - from openpyxl.chart import ( PieChart, LineChart, - BarChart, Reference, ) from openpyxl.styles import PatternFill, Border, Side, Alignment, Font @@ -511,7 +509,7 @@ def generate_excel(report, col = 'B' - every_day_total = Decimal(0.0) + periodic_sum = Decimal(0.0) for j in range(0, ca_len): col = chr(ord('C') + j) @@ -519,14 +517,14 @@ def generate_excel(report, ws[col + str(current_row_number)].font = title_font ws[col + str(current_row_number)].alignment = c_c_alignment value = round(reporting_period_data['values'][j][i], 2) - every_day_total += value + periodic_sum += value ws[col + str(current_row_number)] = value ws[col + str(current_row_number)].border = f_border end_col = chr(ord(col) + 1) ws[end_col + str(current_row_number)].font = title_font ws[end_col + str(current_row_number)].alignment = c_c_alignment - ws[end_col + str(current_row_number)] = round(every_day_total, 2) + ws[end_col + str(current_row_number)] = round(periodic_sum, 2) ws[end_col + str(current_row_number)].border = f_border current_row_number += 1 diff --git a/myems-api/excelexporters/combinedequipmentincome.py b/myems-api/excelexporters/combinedequipmentincome.py index 1359c008..6c7dbf0f 100644 --- a/myems-api/excelexporters/combinedequipmentincome.py +++ b/myems-api/excelexporters/combinedequipmentincome.py @@ -6,7 +6,6 @@ from decimal import Decimal from openpyxl.chart import ( PieChart, LineChart, - BarChart, Reference, ) from openpyxl.styles import PatternFill, Border, Side, Alignment, Font diff --git a/myems-api/excelexporters/equipmentincome.py b/myems-api/excelexporters/equipmentincome.py index e01d84a2..0ab13693 100644 --- a/myems-api/excelexporters/equipmentincome.py +++ b/myems-api/excelexporters/equipmentincome.py @@ -432,9 +432,9 @@ def generate_excel(report, row = str(table_row + 1 + j) ws[col + row].font = title_font ws[col + row].alignment = c_c_alignment - every_day_sum = reporting_period_values_every_day_sum(reporting_period_data, j, ca_len) - total_sum += every_day_sum - ws[col + row] = round(every_day_sum, 2) + periodic_sum = reporting_period_values_periodic_sum(reporting_period_data, j, ca_len) + total_sum += periodic_sum + ws[col + row] = round(periodic_sum, 2) ws[col + row].border = f_border row = str(table_row + 1 + len(time)) @@ -637,12 +637,12 @@ def generate_excel(report, return filename -def reporting_period_values_every_day_sum(reporting_period_data, every_day_index, ca_len): - every_day_sum = 0 +def reporting_period_values_periodic_sum(reporting_period_data, periodic_index, ca_len): + periodic_sum = 0.0 for i in range(0, ca_len): - every_day_sum += reporting_period_data['values'][i][every_day_index] + periodic_sum += reporting_period_data['values'][i][periodic_index] - return every_day_sum + return periodic_sum def timestamps_data_all_equal_0(lists): diff --git a/myems-api/excelexporters/shopfloorcost.py b/myems-api/excelexporters/shopfloorcost.py index f97b6866..2c9a524b 100644 --- a/myems-api/excelexporters/shopfloorcost.py +++ b/myems-api/excelexporters/shopfloorcost.py @@ -522,7 +522,7 @@ def generate_excel(report, col = 'B' - every_day_total = 0 + periodic_sum = 0.0 for j in range(0, ca_len): col = chr(ord('C') + j) @@ -530,14 +530,14 @@ def generate_excel(report, ws[col + str(current_row_number)].font = title_font ws[col + str(current_row_number)].alignment = c_c_alignment value = round(reporting_period_data['values'][j][i], 2) - every_day_total += value + periodic_sum += value ws[col + str(current_row_number)] = value ws[col + str(current_row_number)].border = f_border end_col = chr(ord(col) + 1) ws[end_col + str(current_row_number)].font = title_font ws[end_col + str(current_row_number)].alignment = c_c_alignment - ws[end_col + str(current_row_number)] = round(every_day_total, 2) + ws[end_col + str(current_row_number)] = round(periodic_sum, 2) ws[end_col + str(current_row_number)].border = f_border current_row_number += 1 diff --git a/myems-api/excelexporters/spacecost.py b/myems-api/excelexporters/spacecost.py index ccbf31e5..3cbdc0ba 100644 --- a/myems-api/excelexporters/spacecost.py +++ b/myems-api/excelexporters/spacecost.py @@ -1,10 +1,10 @@ import base64 import uuid import os +from decimal import Decimal from openpyxl.chart import ( PieChart, LineChart, - BarChart, Reference, ) from openpyxl.styles import PatternFill, Border, Side, Alignment, Font @@ -520,9 +520,9 @@ def generate_excel(report, row = str(table_row + 1 + j) ws[col + row].font = title_font ws[col + row].alignment = c_c_alignment - every_day_sum = reporting_period_values_every_day_sum(reporting_period_data, j, ca_len) - total_sum += every_day_sum - ws[col + row] = round(every_day_sum, 2) + periodic_sum = reporting_period_values_periodic_sum(reporting_period_data, j, ca_len) + total_sum += periodic_sum + ws[col + row] = round(periodic_sum, 2) ws[col + row].border = f_border row = str(table_row + 1 + len(time)) @@ -591,20 +591,20 @@ def generate_excel(report, ws['B' + row].border = f_border col = '' - every_day_sum = 0 + periodic_sum = 0 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 - every_day_sum += child['subtotals_array'][j][i] + periodic_sum += child['subtotals_array'][j][i] ws[col + row] = round(child['subtotals_array'][j][i], 2) ws[col + row].border = f_border col = chr(ord(col) + 1) ws[col + row].font = name_font ws[col + row].alignment = c_c_alignment - ws[col + row] = round(every_day_sum, 2) + ws[col + row] = round(periodic_sum, 2) ws[col + row].border = f_border table_end_row_number = current_row_number @@ -831,12 +831,12 @@ def generate_excel(report, return filename -def reporting_period_values_every_day_sum(reporting_period_data, every_day_index, ca_len): - every_day_sum = 0 +def reporting_period_values_periodic_sum(reporting_period_data, periodic_index, ca_len): + periodic_sum = Decimal(0.0) for i in range(0, ca_len): - every_day_sum += reporting_period_data['values'][i][every_day_index] + periodic_sum += reporting_period_data['values'][i][periodic_index] - return every_day_sum + return periodic_sum def timestamps_data_all_equal_0(lists): diff --git a/myems-api/excelexporters/spaceincome.py b/myems-api/excelexporters/spaceincome.py index b2d280bd..b116f431 100644 --- a/myems-api/excelexporters/spaceincome.py +++ b/myems-api/excelexporters/spaceincome.py @@ -449,9 +449,9 @@ def generate_excel(report, row = str(table_row + 1 + j) ws[col + row].font = title_font ws[col + row].alignment = c_c_alignment - every_day_sum = reporting_period_values_every_day_sum(reporting_period_data, j, ca_len) - total_sum += every_day_sum - ws[col + row] = round(every_day_sum, 2) + periodic_sum = reporting_period_values_periodic_sum(reporting_period_data, j, ca_len) + total_sum += periodic_sum + ws[col + row] = round(periodic_sum, 2) ws[col + row].border = f_border row = str(table_row + 1 + len(time)) @@ -520,20 +520,20 @@ def generate_excel(report, ws['B' + row].border = f_border col = '' - every_day_sum = Decimal(0.0) + periodic_sum = Decimal(0.0) 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 - every_day_sum += child['subtotals_array'][j][i] + periodic_sum += child['subtotals_array'][j][i] ws[col + row] = round(child['subtotals_array'][j][i], 2) ws[col + row].border = f_border col = chr(ord(col) + 1) ws[col + row].font = name_font ws[col + row].alignment = c_c_alignment - ws[col + row] = round(every_day_sum, 2) + ws[col + row] = round(periodic_sum, 2) ws[col + row].border = f_border table_end_row_number = current_row_number @@ -763,12 +763,12 @@ def generate_excel(report, return filename -def reporting_period_values_every_day_sum(reporting_period_data, every_day_index, ca_len): - every_day_sum = Decimal(0.0) +def reporting_period_values_periodic_sum(reporting_period_data, periodic_index, ca_len): + periodic_sum = Decimal(0.0) for i in range(0, ca_len): - every_day_sum += reporting_period_data['values'][i][every_day_index] + periodic_sum += reporting_period_data['values'][i][periodic_index] - return every_day_sum + return periodic_sum def timestamps_data_all_equal_0(lists): diff --git a/myems-api/excelexporters/storecost.py b/myems-api/excelexporters/storecost.py index 8948f31a..42613f3e 100644 --- a/myems-api/excelexporters/storecost.py +++ b/myems-api/excelexporters/storecost.py @@ -467,7 +467,7 @@ def generate_excel(report, col = 'B' - every_day_total = 0 + periodic_sum = 0.0 for j in range(0, ca_len): col = chr(ord('C') + j) @@ -475,14 +475,14 @@ def generate_excel(report, ws[col + str(current_row_number)].font = title_font ws[col + str(current_row_number)].alignment = c_c_alignment value = round(reporting_period_data['values'][j][i], 2) - every_day_total += value + periodic_sum += value ws[col + str(current_row_number)] = value ws[col + str(current_row_number)].border = f_border end_col = chr(ord(col) + 1) ws[end_col + str(current_row_number)].font = title_font ws[end_col + str(current_row_number)].alignment = c_c_alignment - ws[end_col + str(current_row_number)] = round(every_day_total, 2) + ws[end_col + str(current_row_number)] = round(periodic_sum, 2) ws[end_col + str(current_row_number)].border = f_border current_row_number += 1 diff --git a/myems-api/excelexporters/tenantcost.py b/myems-api/excelexporters/tenantcost.py index f5e5784e..83baa0e3 100644 --- a/myems-api/excelexporters/tenantcost.py +++ b/myems-api/excelexporters/tenantcost.py @@ -471,7 +471,7 @@ def generate_excel(report, col = 'B' - every_day_total = 0 + periodic_sum = 0.0 for j in range(0, ca_len): col = chr(ord('C') + j) @@ -479,14 +479,14 @@ def generate_excel(report, ws[col + str(current_row_number)].font = title_font ws[col + str(current_row_number)].alignment = c_c_alignment value = round(reporting_period_data['values'][j][i], 2) - every_day_total += value + periodic_sum += value ws[col + str(current_row_number)] = value ws[col + str(current_row_number)].border = f_border end_col = chr(ord(col) + 1) ws[end_col + str(current_row_number)].font = title_font ws[end_col + str(current_row_number)].alignment = c_c_alignment - ws[end_col + str(current_row_number)] = round(every_day_total, 2) + ws[end_col + str(current_row_number)] = round(periodic_sum, 2) ws[end_col + str(current_row_number)].border = f_border current_row_number += 1 From 7270b1cdbbeed11c6012182811c2c71114fbbef4 Mon Sep 17 00:00:00 2001 From: "13621160019@163.com" <13621160019@163.com> Date: Thu, 5 Aug 2021 16:27:05 +0800 Subject: [PATCH 5/8] fixed warnings of excelexporters in API --- .../excelexporters/combinedequipmentbatch.py | 8 +- .../excelexporters/combinedequipmentcost.py | 17 +- .../combinedequipmentefficiency.py | 7 +- .../combinedequipmentenergycategory.py | 7 +- .../combinedequipmentenergyitem.py | 6 +- .../excelexporters/combinedequipmentincome.py | 7 +- .../excelexporters/combinedequipmentload.py | 141 +++--- .../excelexporters/combinedequipmentoutput.py | 7 +- .../excelexporters/combinedequipmentsaving.py | 8 +- .../combinedequipmentstatistics.py | 231 +++++----- myems-api/excelexporters/equipmentbatch.py | 2 +- myems-api/excelexporters/equipmentcost.py | 13 +- .../excelexporters/equipmentefficiency.py | 18 +- .../excelexporters/equipmentenergycategory.py | 12 +- .../excelexporters/equipmentenergyitem.py | 11 +- myems-api/excelexporters/equipmentincome.py | 11 +- myems-api/excelexporters/equipmentload.py | 145 +++---- myems-api/excelexporters/equipmentoutput.py | 11 +- myems-api/excelexporters/equipmentsaving.py | 14 +- .../excelexporters/equipmentstatistics.py | 231 +++++----- myems-api/excelexporters/equipmenttracking.py | 7 +- myems-api/excelexporters/meterbatch.py | 8 +- myems-api/excelexporters/metercost.py | 7 +- myems-api/excelexporters/meterenergy.py | 8 +- .../excelexporters/metersubmetersbalance.py | 8 +- myems-api/excelexporters/metertracking.py | 7 +- myems-api/excelexporters/metertrend.py | 7 +- myems-api/excelexporters/myems.png | Bin 254393 -> 154095 bytes myems-api/excelexporters/offlinemetercost.py | 7 +- .../excelexporters/offlinemeterenergy.py | 8 +- myems-api/excelexporters/shopfloorbatch.py | 2 +- myems-api/excelexporters/shopfloorcost.py | 6 +- .../excelexporters/shopfloorenergycategory.py | 6 +- .../excelexporters/shopfloorenergyitem.py | 12 +- myems-api/excelexporters/shopfloorload.py | 226 +++++----- myems-api/excelexporters/shopfloorsaving.py | 9 +- .../excelexporters/shopfloorstatistics.py | 404 +++++++++-------- myems-api/excelexporters/spacecost.py | 6 +- myems-api/excelexporters/spaceefficiency.py | 7 +- .../excelexporters/spaceenergycategory.py | 13 +- myems-api/excelexporters/spaceenergyitem.py | 7 +- myems-api/excelexporters/spaceincome.py | 7 +- myems-api/excelexporters/spaceload.py | 7 +- myems-api/excelexporters/spaceoutput.py | 7 +- myems-api/excelexporters/spacesaving.py | 10 +- myems-api/excelexporters/spacestatistics.py | 408 +++++++++--------- myems-api/excelexporters/storebatch.py | 2 +- myems-api/excelexporters/storecost.py | 8 +- .../excelexporters/storeenergycategory.py | 6 +- myems-api/excelexporters/storeenergyitem.py | 6 +- myems-api/excelexporters/storeload.py | 226 +++++----- myems-api/excelexporters/storesaving.py | 11 +- myems-api/excelexporters/storestatistics.py | 405 +++++++++-------- myems-api/excelexporters/tenantbatch.py | 2 +- myems-api/excelexporters/tenantbill.py | 9 - myems-api/excelexporters/tenantcost.py | 7 +- .../excelexporters/tenantenergycategory.py | 7 +- myems-api/excelexporters/tenantenergyitem.py | 7 +- myems-api/excelexporters/tenantload.py | 7 +- myems-api/excelexporters/tenantsaving.py | 10 +- myems-api/excelexporters/tenantstatistics.py | 404 +++++++++-------- myems-api/excelexporters/virtualmetercost.py | 7 +- .../excelexporters/virtualmeterenergy.py | 8 +- 63 files changed, 1432 insertions(+), 1811 deletions(-) diff --git a/myems-api/excelexporters/combinedequipmentbatch.py b/myems-api/excelexporters/combinedequipmentbatch.py index 5a55dbfa..fcc253da 100644 --- a/myems-api/excelexporters/combinedequipmentbatch.py +++ b/myems-api/excelexporters/combinedequipmentbatch.py @@ -1,7 +1,7 @@ import base64 import uuid import os -from openpyxl.styles import PatternFill, Border, Side, Alignment, Protection, Font +from openpyxl.styles import PatternFill, Border, Side, Alignment, Font from openpyxl.drawing.image import Image from openpyxl import Workbook @@ -103,12 +103,6 @@ def generate_excel(report, space_name, reporting_start_datetime_local, reporting 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") diff --git a/myems-api/excelexporters/combinedequipmentcost.py b/myems-api/excelexporters/combinedequipmentcost.py index f40896cb..73b93e96 100644 --- a/myems-api/excelexporters/combinedequipmentcost.py +++ b/myems-api/excelexporters/combinedequipmentcost.py @@ -2,11 +2,7 @@ import base64 import uuid import os from decimal import Decimal -from openpyxl.chart import ( - PieChart, - LineChart, - Reference, -) +from openpyxl.chart import PieChart, LineChart, Reference from openpyxl.styles import PatternFill, Border, Side, Alignment, Font from openpyxl.drawing.image import Image from openpyxl import Workbook @@ -117,18 +113,11 @@ def generate_excel(report, 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 @@ -165,8 +154,6 @@ def generate_excel(report, return filename - ################################################# - reporting_period_data = report['reporting_period'] has_energy_data_flag = True @@ -239,8 +226,6 @@ def generate_excel(report, for i in range(6, 9 + 1): ws.row_dimensions[i].height = 0.1 - ################################################# - has_ele_peak_flag = True if "toppeaks" not in reporting_period_data.keys() or \ reporting_period_data['toppeaks'] is None or \ diff --git a/myems-api/excelexporters/combinedequipmentefficiency.py b/myems-api/excelexporters/combinedequipmentefficiency.py index 712d5a46..5754f5a9 100644 --- a/myems-api/excelexporters/combinedequipmentefficiency.py +++ b/myems-api/excelexporters/combinedequipmentefficiency.py @@ -1,12 +1,7 @@ import base64 import uuid import os -from openpyxl.chart import ( - PieChart, - LineChart, - BarChart, - Reference, -) +from openpyxl.chart import LineChart, Reference from openpyxl.styles import PatternFill, Border, Side, Alignment, Font from openpyxl.drawing.image import Image from openpyxl import Workbook diff --git a/myems-api/excelexporters/combinedequipmentenergycategory.py b/myems-api/excelexporters/combinedequipmentenergycategory.py index 5466d80b..fc94cb1c 100644 --- a/myems-api/excelexporters/combinedequipmentenergycategory.py +++ b/myems-api/excelexporters/combinedequipmentenergycategory.py @@ -1,12 +1,7 @@ import base64 import uuid import os -from openpyxl.chart import ( - PieChart, - LineChart, - BarChart, - Reference, - ) +from openpyxl.chart import PieChart, LineChart, Reference from openpyxl.styles import PatternFill, Border, Side, Alignment, Font from openpyxl.drawing.image import Image from openpyxl import Workbook diff --git a/myems-api/excelexporters/combinedequipmentenergyitem.py b/myems-api/excelexporters/combinedequipmentenergyitem.py index 3dffad35..c1962e7f 100644 --- a/myems-api/excelexporters/combinedequipmentenergyitem.py +++ b/myems-api/excelexporters/combinedequipmentenergyitem.py @@ -1,11 +1,7 @@ import base64 import uuid import os -from openpyxl.chart import ( - PieChart, - LineChart, - Reference, -) +from openpyxl.chart import PieChart, LineChart, Reference from openpyxl.styles import PatternFill, Border, Side, Alignment, Font from openpyxl.drawing.image import Image from openpyxl import Workbook diff --git a/myems-api/excelexporters/combinedequipmentincome.py b/myems-api/excelexporters/combinedequipmentincome.py index 6c7dbf0f..cde96e0c 100644 --- a/myems-api/excelexporters/combinedequipmentincome.py +++ b/myems-api/excelexporters/combinedequipmentincome.py @@ -2,12 +2,7 @@ import base64 import uuid import os from decimal import Decimal - -from openpyxl.chart import ( - PieChart, - LineChart, - Reference, -) +from openpyxl.chart import PieChart, LineChart, Reference from openpyxl.styles import PatternFill, Border, Side, Alignment, Font from openpyxl.drawing.image import Image from openpyxl import Workbook diff --git a/myems-api/excelexporters/combinedequipmentload.py b/myems-api/excelexporters/combinedequipmentload.py index 36ed4005..5fe4a2ce 100644 --- a/myems-api/excelexporters/combinedequipmentload.py +++ b/myems-api/excelexporters/combinedequipmentload.py @@ -1,10 +1,7 @@ import base64 import uuid import os -from openpyxl.chart import ( - LineChart, - Reference, -) +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 @@ -85,7 +82,6 @@ def generate_excel(report, # 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'), @@ -162,98 +158,93 @@ def generate_excel(report, #################################################################################################################### 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 + ' 负荷分析' + ws['B6'].font = title_font + ws['B6'] = name + ' 负荷分析' - category = reporting_period_data['names'] + 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 + # 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['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['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 + ws['E7'].font = title_font + ws['E7'].alignment = c_c_alignment + ws['E7'] = '负荷系数' + ws['E7'].border = f_border - # table_data + # 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 + 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['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)].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['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)].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['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)].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 + 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: 详细数据 diff --git a/myems-api/excelexporters/combinedequipmentoutput.py b/myems-api/excelexporters/combinedequipmentoutput.py index 6584c092..9cd67dc2 100644 --- a/myems-api/excelexporters/combinedequipmentoutput.py +++ b/myems-api/excelexporters/combinedequipmentoutput.py @@ -1,12 +1,7 @@ import base64 import uuid import os -from openpyxl.chart import ( - PieChart, - LineChart, - BarChart, - Reference, -) +from openpyxl.chart import LineChart, Reference from openpyxl.styles import PatternFill, Border, Side, Alignment, Font from openpyxl.drawing.image import Image from openpyxl import Workbook diff --git a/myems-api/excelexporters/combinedequipmentsaving.py b/myems-api/excelexporters/combinedequipmentsaving.py index fd94cefa..1ab26d64 100644 --- a/myems-api/excelexporters/combinedequipmentsaving.py +++ b/myems-api/excelexporters/combinedequipmentsaving.py @@ -2,13 +2,7 @@ import base64 import uuid import os from decimal import Decimal - -from openpyxl.chart import ( - PieChart, - LineChart, - BarChart, - Reference, -) +from openpyxl.chart import PieChart, LineChart, Reference from openpyxl.styles import PatternFill, Border, Side, Alignment, Font from openpyxl.drawing.image import Image from openpyxl import Workbook diff --git a/myems-api/excelexporters/combinedequipmentstatistics.py b/myems-api/excelexporters/combinedequipmentstatistics.py index 085e11d7..2b212ed9 100644 --- a/myems-api/excelexporters/combinedequipmentstatistics.py +++ b/myems-api/excelexporters/combinedequipmentstatistics.py @@ -1,10 +1,7 @@ import base64 import uuid import os -from openpyxl.chart import ( - LineChart, - Reference, -) +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 @@ -162,152 +159,146 @@ def generate_excel(report, #################################################################################################################### 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 + ' 统计分析' + ws['B6'].font = title_font + ws['B6'] = name + ' 统计分析' - category = reporting_period_data['names'] + 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 + # 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['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['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 + ws['E7'].font = title_font + ws['E7'].alignment = c_c_alignment + ws['E7'] = '最小值' + ws['E7'].border = f_border - ws['F7'].font = title_font - ws['F7'].alignment = c_c_alignment - ws['F7'] = '最大值' - ws['F7'].border = f_border + ws['F7'].font = title_font + ws['F7'].alignment = c_c_alignment + ws['F7'] = '最大值' + ws['F7'].border = f_border - ws['G7'].font = title_font - ws['G7'].alignment = c_c_alignment - ws['G7'] = '样本标准差' - ws['G7'].border = f_border + ws['G7'].font = title_font + ws['G7'].alignment = c_c_alignment + ws['G7'] = '样本标准差' + ws['G7'].border = f_border - ws['H7'].font = title_font - ws['H7'].alignment = c_c_alignment - ws['H7'] = '样本方差' - ws['H7'].border = f_border + ws['H7'].font = title_font + ws['H7'].alignment = c_c_alignment + ws['H7'] = '样本方差' + ws['H7'].border = f_border - # table_data + # 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] + " )" - ws['B' + str(row)].border = f_border + 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] + " )" + 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['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)] = reporting_period_data['means'][i] \ - if reporting_period_data['means'][i] is not None else '' - ws['C' + str(row)].border = f_border - ws['C' + str(row)].number_format = '0.00' + ws['C' + str(row)].font = name_font + ws['C' + str(row)].alignment = c_c_alignment + ws['C' + str(row)] = reporting_period_data['means'][i] \ + if reporting_period_data['means'][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['means_increment_rate'][i] * 100, 2)) + "%" \ - if reporting_period_data['means_increment_rate'][i] is not None else '0.00%' - ws['C' + str(row + 1)].border = f_border + 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['means_increment_rate'][i] * 100, 2)) + "%" \ + if reporting_period_data['means_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)] = reporting_period_data['medians'][i] \ - if reporting_period_data['medians'][i] is not None else '' - ws['D' + str(row)].border = f_border - ws['D' + str(row)].number_format = '0.00' + ws['D' + str(row)].font = name_font + ws['D' + str(row)].alignment = c_c_alignment + ws['D' + str(row)] = reporting_period_data['medians'][i] \ + if reporting_period_data['medians'][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['medians_increment_rate'][i] * 100, 2)) + "%" \ - if reporting_period_data['medians_increment_rate'][i] is not None else '0.00%' - ws['D' + str(row + 1)].border = f_border + 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['medians_increment_rate'][i] * 100, 2)) + "%" \ + if reporting_period_data['medians_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)] = reporting_period_data['minimums'][i] \ - if reporting_period_data['minimums'][i] is not None else '' - ws['E' + str(row)].border = f_border - ws['E' + str(row)].number_format = '0.00' + ws['E' + str(row)].font = name_font + ws['E' + str(row)].alignment = c_c_alignment + ws['E' + str(row)] = reporting_period_data['minimums'][i] \ + if reporting_period_data['minimums'][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['minimums_increment_rate'][i] * 100, 2)) + "%" \ - if reporting_period_data['minimums_increment_rate'][i] is not None else '0.00%' - ws['E' + str(row + 1)].border = f_border + 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['minimums_increment_rate'][i] * 100, 2)) + "%" \ + if reporting_period_data['minimums_increment_rate'][i] is not None else '0.00%' + ws['E' + str(row + 1)].border = f_border - ws['F' + str(row)].font = name_font - ws['F' + str(row)].alignment = c_c_alignment - ws['F' + str(row)] = reporting_period_data['maximums'][i] \ - if reporting_period_data['maximums'][i] is not None else '' - ws['F' + str(row)].border = f_border - ws['F' + str(row)].number_format = '0.00' + ws['F' + str(row)].font = name_font + ws['F' + str(row)].alignment = c_c_alignment + ws['F' + str(row)] = reporting_period_data['maximums'][i] \ + if reporting_period_data['maximums'][i] is not None else '' + ws['F' + str(row)].border = f_border + ws['F' + str(row)].number_format = '0.00' - ws['F' + str(row + 1)].font = name_font - ws['F' + str(row + 1)].alignment = c_c_alignment - ws['F' + 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['F' + str(row + 1)].border = f_border + ws['F' + str(row + 1)].font = name_font + ws['F' + str(row + 1)].alignment = c_c_alignment + ws['F' + 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['F' + str(row + 1)].border = f_border - ws['G' + str(row)].font = name_font - ws['G' + str(row)].alignment = c_c_alignment - ws['G' + str(row)] = reporting_period_data['stdevs'][i] \ - if reporting_period_data['stdevs'][i] is not None else '' - ws['G' + str(row)].border = f_border - ws['G' + str(row)].number_format = '0.00' + ws['G' + str(row)].font = name_font + ws['G' + str(row)].alignment = c_c_alignment + ws['G' + str(row)] = reporting_period_data['stdevs'][i] \ + if reporting_period_data['stdevs'][i] is not None else '' + ws['G' + str(row)].border = f_border + ws['G' + str(row)].number_format = '0.00' - ws['G' + str(row + 1)].font = name_font - ws['G' + str(row + 1)].alignment = c_c_alignment - ws['G' + str(row + 1)] = str(round(reporting_period_data['stdevs_increment_rate'][i] * 100, 2)) + "%" \ - if reporting_period_data['stdevs_increment_rate'][i] is not None else '0.00%' - ws['G' + str(row + 1)].border = f_border + ws['G' + str(row + 1)].font = name_font + ws['G' + str(row + 1)].alignment = c_c_alignment + ws['G' + str(row + 1)] = str(round(reporting_period_data['stdevs_increment_rate'][i] * 100, 2)) + "%" \ + if reporting_period_data['stdevs_increment_rate'][i] is not None else '0.00%' + ws['G' + str(row + 1)].border = f_border - ws['H' + str(row)].font = name_font - ws['H' + str(row)].alignment = c_c_alignment - ws['H' + str(row)] = reporting_period_data['variances'][i] \ - if reporting_period_data['variances'][i] is not None else '' - ws['H' + str(row)].border = f_border - ws['H' + str(row)].number_format = '0.00' + ws['H' + str(row)].font = name_font + ws['H' + str(row)].alignment = c_c_alignment + ws['H' + str(row)] = reporting_period_data['variances'][i] \ + if reporting_period_data['variances'][i] is not None else '' + ws['H' + str(row)].border = f_border + ws['H' + str(row)].number_format = '0.00' - ws['H' + str(row + 1)].font = name_font - ws['H' + str(row + 1)].alignment = c_c_alignment - ws['H' + str(row + 1)] = str(round(reporting_period_data['variances_increment_rate'][i] * 100, 2)) + "%" \ - if reporting_period_data['variances_increment_rate'][i] is not None else '0.00%' - ws['H' + str(row + 1)].border = f_border + ws['H' + str(row + 1)].font = name_font + ws['H' + str(row + 1)].alignment = c_c_alignment + ws['H' + str(row + 1)] = str(round(reporting_period_data['variances_increment_rate'][i] * 100, 2)) + "%" \ + if reporting_period_data['variances_increment_rate'][i] is not None else '0.00%' + ws['H' + str(row + 1)].border = f_border #################################################################################################################### # Second: 详细数据 diff --git a/myems-api/excelexporters/equipmentbatch.py b/myems-api/excelexporters/equipmentbatch.py index 9a794fac..21d88f68 100644 --- a/myems-api/excelexporters/equipmentbatch.py +++ b/myems-api/excelexporters/equipmentbatch.py @@ -1,7 +1,7 @@ import base64 import uuid import os -from openpyxl.styles import PatternFill, Border, Side, Alignment, Protection, Font +from openpyxl.styles import PatternFill, Border, Side, Alignment, Font from openpyxl.drawing.image import Image from openpyxl import Workbook diff --git a/myems-api/excelexporters/equipmentcost.py b/myems-api/excelexporters/equipmentcost.py index bbf5e808..c08ec647 100644 --- a/myems-api/excelexporters/equipmentcost.py +++ b/myems-api/excelexporters/equipmentcost.py @@ -1,12 +1,7 @@ import base64 import uuid import os -from openpyxl.chart import ( - PieChart, - LineChart, - BarChart, - Reference, - ) +from openpyxl.chart import PieChart, LineChart, Reference from openpyxl.styles import PatternFill, Border, Side, Alignment, Font from openpyxl.drawing.image import Image from openpyxl import Workbook @@ -90,7 +85,6 @@ def generate_excel(report, # 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'), @@ -98,9 +92,7 @@ def generate_excel(report, 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_border = Border(bottom=Side(border_style='medium', color='00000000'),) b_c_alignment = Alignment(vertical='bottom', horizontal='center', @@ -445,7 +437,6 @@ def generate_excel(report, for i in range(0, len(time)): col = 'B' row = str(table_row+1 + i) - # col = chr(ord('B') + i) ws[col + row].font = title_font ws[col + row].alignment = c_c_alignment ws[col + row] = time[i] diff --git a/myems-api/excelexporters/equipmentefficiency.py b/myems-api/excelexporters/equipmentefficiency.py index 88fa80c3..9f669828 100644 --- a/myems-api/excelexporters/equipmentefficiency.py +++ b/myems-api/excelexporters/equipmentefficiency.py @@ -1,12 +1,7 @@ import base64 import uuid import os -from openpyxl.chart import ( - PieChart, - LineChart, - BarChart, - Reference, -) +from openpyxl.chart import LineChart, Reference from openpyxl.styles import PatternFill, Border, Side, Alignment, Font from openpyxl.drawing.image import Image from openpyxl import Workbook @@ -88,7 +83,6 @@ def generate_excel(report, # 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'), @@ -96,9 +90,7 @@ def generate_excel(report, 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_border = Border(bottom=Side(border_style='medium', color='00000000'),) b_c_alignment = Alignment(vertical='bottom', horizontal='center', @@ -118,12 +110,6 @@ def generate_excel(report, 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 diff --git a/myems-api/excelexporters/equipmentenergycategory.py b/myems-api/excelexporters/equipmentenergycategory.py index ac207d72..3c172e44 100644 --- a/myems-api/excelexporters/equipmentenergycategory.py +++ b/myems-api/excelexporters/equipmentenergycategory.py @@ -1,12 +1,7 @@ import base64 import uuid import os -from openpyxl.chart import ( - PieChart, - LineChart, - BarChart, - Reference, - ) +from openpyxl.chart import PieChart, LineChart, Reference from openpyxl.styles import PatternFill, Border, Side, Alignment, Font from openpyxl.drawing.image import Image from openpyxl import Workbook @@ -90,7 +85,6 @@ def generate_excel(report, # 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'), @@ -98,9 +92,7 @@ def generate_excel(report, 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_border = Border(bottom=Side(border_style='medium', color='00000000'), ) b_c_alignment = Alignment(vertical='bottom', horizontal='center', diff --git a/myems-api/excelexporters/equipmentenergyitem.py b/myems-api/excelexporters/equipmentenergyitem.py index dc454a56..9502b505 100644 --- a/myems-api/excelexporters/equipmentenergyitem.py +++ b/myems-api/excelexporters/equipmentenergyitem.py @@ -1,12 +1,7 @@ import base64 import uuid import os -from openpyxl.chart import ( - PieChart, - LineChart, - BarChart, - Reference, -) +from openpyxl.chart import PieChart, LineChart, Reference from openpyxl.styles import PatternFill, Border, Side, Alignment, Font from openpyxl.drawing.image import Image from openpyxl import Workbook @@ -95,9 +90,7 @@ def generate_excel(report, 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_border = Border(bottom=Side(border_style='medium', color='00000000'), ) b_c_alignment = Alignment(vertical='bottom', horizontal='center', diff --git a/myems-api/excelexporters/equipmentincome.py b/myems-api/excelexporters/equipmentincome.py index 0ab13693..eb8dc492 100644 --- a/myems-api/excelexporters/equipmentincome.py +++ b/myems-api/excelexporters/equipmentincome.py @@ -1,12 +1,7 @@ import base64 import uuid import os -from openpyxl.chart import ( - PieChart, - LineChart, - BarChart, - Reference, -) +from openpyxl.chart import PieChart, LineChart, Reference from decimal import * from openpyxl.styles import PatternFill, Border, Side, Alignment, Font from openpyxl.drawing.image import Image @@ -95,9 +90,7 @@ def generate_excel(report, 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_border = Border(bottom=Side(border_style='medium', color='00000000'), ) b_c_alignment = Alignment(vertical='bottom', horizontal='center', diff --git a/myems-api/excelexporters/equipmentload.py b/myems-api/excelexporters/equipmentload.py index 998ad8b9..1695c698 100644 --- a/myems-api/excelexporters/equipmentload.py +++ b/myems-api/excelexporters/equipmentload.py @@ -1,10 +1,7 @@ import base64 import uuid import os -from openpyxl.chart import ( - LineChart, - Reference, -) +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 @@ -92,9 +89,7 @@ def generate_excel(report, 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_border = Border(bottom=Side(border_style='medium', color='00000000'), ) b_c_alignment = Alignment(vertical='bottom', horizontal='center', @@ -161,98 +156,92 @@ def generate_excel(report, #################################################################################################################### 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 + ' 统计分析' + ws['B6'].font = title_font + ws['B6'] = name + ' 统计分析' - category = reporting_period_data['names'] + 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 + # 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['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['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 + ws['E7'].font = title_font + ws['E7'].alignment = c_c_alignment + ws['E7'] = '负荷系数' + ws['E7'].border = f_border - # table_data + # 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 + 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['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)].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['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)].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['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)].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 + 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: 详细数据 diff --git a/myems-api/excelexporters/equipmentoutput.py b/myems-api/excelexporters/equipmentoutput.py index 9fbbf077..b7b3b55b 100644 --- a/myems-api/excelexporters/equipmentoutput.py +++ b/myems-api/excelexporters/equipmentoutput.py @@ -1,12 +1,7 @@ import base64 import uuid import os -from openpyxl.chart import ( - PieChart, - LineChart, - BarChart, - Reference, -) +from openpyxl.chart import LineChart, Reference from openpyxl.styles import PatternFill, Border, Side, Alignment, Font from openpyxl.drawing.image import Image from openpyxl import Workbook @@ -95,9 +90,7 @@ def generate_excel(report, 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_border = Border(bottom=Side(border_style='medium', color='00000000'), ) b_c_alignment = Alignment(vertical='bottom', horizontal='center', diff --git a/myems-api/excelexporters/equipmentsaving.py b/myems-api/excelexporters/equipmentsaving.py index 5ee81bf7..fa178a42 100644 --- a/myems-api/excelexporters/equipmentsaving.py +++ b/myems-api/excelexporters/equipmentsaving.py @@ -1,12 +1,8 @@ import base64 import uuid import os -from openpyxl.chart import ( - PieChart, - LineChart, - BarChart, - Reference, -) +from decimal import Decimal +from openpyxl.chart import PieChart, LineChart, Reference from openpyxl.styles import PatternFill, Border, Side, Alignment, Font from openpyxl.drawing.image import Image from openpyxl import Workbook @@ -95,9 +91,7 @@ def generate_excel(report, 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_border = Border(bottom=Side(border_style='medium', color='00000000'), ) b_c_alignment = Alignment(vertical='bottom', horizontal='center', @@ -743,7 +737,7 @@ def generate_excel(report, def sum_list(lists): - total = 0 + total = Decimal(0.0) for i in range(0, len(lists)): total += lists[i] diff --git a/myems-api/excelexporters/equipmentstatistics.py b/myems-api/excelexporters/equipmentstatistics.py index 011caa43..b4157a53 100644 --- a/myems-api/excelexporters/equipmentstatistics.py +++ b/myems-api/excelexporters/equipmentstatistics.py @@ -1,10 +1,7 @@ import base64 import uuid import os -from openpyxl.chart import ( - LineChart, - Reference, -) +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 @@ -160,152 +157,146 @@ def generate_excel(report, #################################################################################################################### 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 + ' 统计分析' + ws['B6'].font = title_font + ws['B6'] = name + ' 统计分析' - category = reporting_period_data['names'] + 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 + # 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['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['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 + ws['E7'].font = title_font + ws['E7'].alignment = c_c_alignment + ws['E7'] = '最小值' + ws['E7'].border = f_border - ws['F7'].font = title_font - ws['F7'].alignment = c_c_alignment - ws['F7'] = '最大值' - ws['F7'].border = f_border + ws['F7'].font = title_font + ws['F7'].alignment = c_c_alignment + ws['F7'] = '最大值' + ws['F7'].border = f_border - ws['G7'].font = title_font - ws['G7'].alignment = c_c_alignment - ws['G7'] = '样本标准差' - ws['G7'].border = f_border + ws['G7'].font = title_font + ws['G7'].alignment = c_c_alignment + ws['G7'] = '样本标准差' + ws['G7'].border = f_border - ws['H7'].font = title_font - ws['H7'].alignment = c_c_alignment - ws['H7'] = '样本方差' - ws['H7'].border = f_border + ws['H7'].font = title_font + ws['H7'].alignment = c_c_alignment + ws['H7'] = '样本方差' + ws['H7'].border = f_border - # table_data + # 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] + " )" - ws['B' + str(row)].border = f_border + 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] + " )" + 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['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)] = reporting_period_data['means'][i] \ - if reporting_period_data['means'][i] is not None else '' - ws['C' + str(row)].border = f_border - ws['C' + str(row)].number_format = '0.00' + ws['C' + str(row)].font = name_font + ws['C' + str(row)].alignment = c_c_alignment + ws['C' + str(row)] = reporting_period_data['means'][i] \ + if reporting_period_data['means'][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['means_increment_rate'][i] * 100, 2)) + "%" \ - if reporting_period_data['means_increment_rate'][i] is not None else '0.00%' - ws['C' + str(row + 1)].border = f_border + 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['means_increment_rate'][i] * 100, 2)) + "%" \ + if reporting_period_data['means_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)] = reporting_period_data['medians'][i] \ - if reporting_period_data['medians'][i] is not None else '' - ws['D' + str(row)].border = f_border - ws['D' + str(row)].number_format = '0.00' + ws['D' + str(row)].font = name_font + ws['D' + str(row)].alignment = c_c_alignment + ws['D' + str(row)] = reporting_period_data['medians'][i] \ + if reporting_period_data['medians'][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['medians_increment_rate'][i] * 100, 2)) + "%" \ - if reporting_period_data['medians_increment_rate'][i] is not None else '0.00%' - ws['D' + str(row + 1)].border = f_border + 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['medians_increment_rate'][i] * 100, 2)) + "%" \ + if reporting_period_data['medians_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)] = reporting_period_data['minimums'][i] \ - if reporting_period_data['minimums'][i] is not None else '' - ws['E' + str(row)].border = f_border - ws['E' + str(row)].number_format = '0.00' + ws['E' + str(row)].font = name_font + ws['E' + str(row)].alignment = c_c_alignment + ws['E' + str(row)] = reporting_period_data['minimums'][i] \ + if reporting_period_data['minimums'][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['minimums_increment_rate'][i] * 100, 2)) + "%" \ - if reporting_period_data['minimums_increment_rate'][i] is not None else '0.00%' - ws['E' + str(row + 1)].border = f_border + 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['minimums_increment_rate'][i] * 100, 2)) + "%" \ + if reporting_period_data['minimums_increment_rate'][i] is not None else '0.00%' + ws['E' + str(row + 1)].border = f_border - ws['F' + str(row)].font = name_font - ws['F' + str(row)].alignment = c_c_alignment - ws['F' + str(row)] = reporting_period_data['maximums'][i] \ - if reporting_period_data['maximums'][i] is not None else '' - ws['F' + str(row)].border = f_border - ws['F' + str(row)].number_format = '0.00' + ws['F' + str(row)].font = name_font + ws['F' + str(row)].alignment = c_c_alignment + ws['F' + str(row)] = reporting_period_data['maximums'][i] \ + if reporting_period_data['maximums'][i] is not None else '' + ws['F' + str(row)].border = f_border + ws['F' + str(row)].number_format = '0.00' - ws['F' + str(row + 1)].font = name_font - ws['F' + str(row + 1)].alignment = c_c_alignment - ws['F' + 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['F' + str(row + 1)].border = f_border + ws['F' + str(row + 1)].font = name_font + ws['F' + str(row + 1)].alignment = c_c_alignment + ws['F' + 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['F' + str(row + 1)].border = f_border - ws['G' + str(row)].font = name_font - ws['G' + str(row)].alignment = c_c_alignment - ws['G' + str(row)] = reporting_period_data['stdevs'][i] \ - if reporting_period_data['stdevs'][i] is not None else '' - ws['G' + str(row)].border = f_border - ws['G' + str(row)].number_format = '0.00' + ws['G' + str(row)].font = name_font + ws['G' + str(row)].alignment = c_c_alignment + ws['G' + str(row)] = reporting_period_data['stdevs'][i] \ + if reporting_period_data['stdevs'][i] is not None else '' + ws['G' + str(row)].border = f_border + ws['G' + str(row)].number_format = '0.00' - ws['G' + str(row + 1)].font = name_font - ws['G' + str(row + 1)].alignment = c_c_alignment - ws['G' + str(row + 1)] = str(round(reporting_period_data['stdevs_increment_rate'][i] * 100, 2)) + "%" \ - if reporting_period_data['stdevs_increment_rate'][i] is not None else '0.00%' - ws['G' + str(row + 1)].border = f_border + ws['G' + str(row + 1)].font = name_font + ws['G' + str(row + 1)].alignment = c_c_alignment + ws['G' + str(row + 1)] = str(round(reporting_period_data['stdevs_increment_rate'][i] * 100, 2)) + "%" \ + if reporting_period_data['stdevs_increment_rate'][i] is not None else '0.00%' + ws['G' + str(row + 1)].border = f_border - ws['H' + str(row)].font = name_font - ws['H' + str(row)].alignment = c_c_alignment - ws['H' + str(row)] = reporting_period_data['variances'][i] \ - if reporting_period_data['variances'][i] is not None else '' - ws['H' + str(row)].border = f_border - ws['H' + str(row)].number_format = '0.00' + ws['H' + str(row)].font = name_font + ws['H' + str(row)].alignment = c_c_alignment + ws['H' + str(row)] = reporting_period_data['variances'][i] \ + if reporting_period_data['variances'][i] is not None else '' + ws['H' + str(row)].border = f_border + ws['H' + str(row)].number_format = '0.00' - ws['H' + str(row + 1)].font = name_font - ws['H' + str(row + 1)].alignment = c_c_alignment - ws['H' + str(row + 1)] = str(round(reporting_period_data['variances_increment_rate'][i] * 100, 2)) + "%" \ - if reporting_period_data['variances_increment_rate'][i] is not None else '0.00%' - ws['H' + str(row + 1)].border = f_border + ws['H' + str(row + 1)].font = name_font + ws['H' + str(row + 1)].alignment = c_c_alignment + ws['H' + str(row + 1)] = str(round(reporting_period_data['variances_increment_rate'][i] * 100, 2)) + "%" \ + if reporting_period_data['variances_increment_rate'][i] is not None else '0.00%' + ws['H' + str(row + 1)].border = f_border #################################################################################################################### # Second: 详细数据 diff --git a/myems-api/excelexporters/equipmenttracking.py b/myems-api/excelexporters/equipmenttracking.py index cc2a7808..b4b8a79b 100644 --- a/myems-api/excelexporters/equipmenttracking.py +++ b/myems-api/excelexporters/equipmenttracking.py @@ -1,14 +1,9 @@ import base64 import uuid import os -from openpyxl.chart import ( - BarChart, - Reference, -) -from openpyxl.styles import PatternFill, Border, Side, Alignment, Protection, Font +from openpyxl.styles import Border, Side, Alignment, Font from openpyxl.drawing.image import Image from openpyxl import Workbook -from openpyxl.chart.label import DataLabelList ######################################################################################################################## diff --git a/myems-api/excelexporters/meterbatch.py b/myems-api/excelexporters/meterbatch.py index 04c31f7f..b7d4c3b6 100644 --- a/myems-api/excelexporters/meterbatch.py +++ b/myems-api/excelexporters/meterbatch.py @@ -1,7 +1,7 @@ import base64 import uuid import os -from openpyxl.styles import PatternFill, Border, Side, Alignment, Protection, Font +from openpyxl.styles import PatternFill, Border, Side, Alignment, Font from openpyxl.drawing.image import Image from openpyxl import Workbook @@ -103,12 +103,6 @@ def generate_excel(report, space_name, reporting_start_datetime_local, reporting 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") diff --git a/myems-api/excelexporters/metercost.py b/myems-api/excelexporters/metercost.py index ba0892e4..8d2ba216 100644 --- a/myems-api/excelexporters/metercost.py +++ b/myems-api/excelexporters/metercost.py @@ -1,12 +1,7 @@ import base64 import uuid import os -from openpyxl.chart import ( - BarChart, - LineChart, - Reference, - Series -) +from openpyxl.chart import LineChart, Reference, Series from openpyxl.styles import PatternFill, Border, Side, Alignment, Font from openpyxl.drawing.image import Image from openpyxl import Workbook diff --git a/myems-api/excelexporters/meterenergy.py b/myems-api/excelexporters/meterenergy.py index 1f78af32..eca930c9 100644 --- a/myems-api/excelexporters/meterenergy.py +++ b/myems-api/excelexporters/meterenergy.py @@ -1,12 +1,8 @@ import base64 import uuid import os -from openpyxl.chart import ( - BarChart, - LineChart, - Reference, -) -from openpyxl.styles import PatternFill, Border, Side, Alignment, Protection, Font +from openpyxl.chart import LineChart, 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 diff --git a/myems-api/excelexporters/metersubmetersbalance.py b/myems-api/excelexporters/metersubmetersbalance.py index 5074cd49..2a8e0646 100644 --- a/myems-api/excelexporters/metersubmetersbalance.py +++ b/myems-api/excelexporters/metersubmetersbalance.py @@ -1,12 +1,8 @@ import base64 import uuid import os -from openpyxl.chart import ( - BarChart, - LineChart, - Reference, -) -from openpyxl.styles import PatternFill, Border, Side, Alignment, Protection, Font +from openpyxl.chart import LineChart, 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 diff --git a/myems-api/excelexporters/metertracking.py b/myems-api/excelexporters/metertracking.py index d9065dce..346404ca 100644 --- a/myems-api/excelexporters/metertracking.py +++ b/myems-api/excelexporters/metertracking.py @@ -1,14 +1,9 @@ import base64 import uuid import os -from openpyxl.chart import ( - BarChart, - Reference, -) -from openpyxl.styles import PatternFill, Border, Side, Alignment, Protection, Font +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 ######################################################################################################################## diff --git a/myems-api/excelexporters/metertrend.py b/myems-api/excelexporters/metertrend.py index 6fe7b004..6429bc84 100644 --- a/myems-api/excelexporters/metertrend.py +++ b/myems-api/excelexporters/metertrend.py @@ -1,12 +1,7 @@ import base64 import uuid import os -from openpyxl.chart import ( - PieChart, - LineChart, - BarChart, - Reference, -) +from openpyxl.chart import LineChart, Reference from openpyxl.styles import PatternFill, Border, Side, Alignment, Font from openpyxl.drawing.image import Image from openpyxl import Workbook diff --git a/myems-api/excelexporters/myems.png b/myems-api/excelexporters/myems.png index df17679a24210977248f2109150edcc19cd7b736..89343f6ebf2b99e318de86af7f026de08fd8a05f 100644 GIT binary patch literal 154095 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 QKTN=xA0T(c&!-oJ4i)ss9(bLpG2?1 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∈wrL2)8@jmw6sKl$UeG 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

;=*m#Gmnbnf{y!)b+d2!%@N~6FU!T- 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 z%0A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 bx%htp;Y8`+4swK;00000NkvXXu0mjfI|8qx diff --git a/myems-api/excelexporters/offlinemetercost.py b/myems-api/excelexporters/offlinemetercost.py index a7753006..e390cf6c 100644 --- a/myems-api/excelexporters/offlinemetercost.py +++ b/myems-api/excelexporters/offlinemetercost.py @@ -1,12 +1,7 @@ import base64 import uuid import os -from openpyxl.chart import ( - BarChart, - LineChart, - Reference, - Series -) +from openpyxl.chart import LineChart, Reference, Series from openpyxl.styles import PatternFill, Border, Side, Alignment, Font from openpyxl.drawing.image import Image from openpyxl import Workbook diff --git a/myems-api/excelexporters/offlinemeterenergy.py b/myems-api/excelexporters/offlinemeterenergy.py index 2cee35b0..6b76a26a 100644 --- a/myems-api/excelexporters/offlinemeterenergy.py +++ b/myems-api/excelexporters/offlinemeterenergy.py @@ -1,12 +1,8 @@ import base64 import uuid import os -from openpyxl.chart import ( - BarChart, - LineChart, - Reference, -) -from openpyxl.styles import PatternFill, Border, Side, Alignment, Protection, Font +from openpyxl.chart import LineChart, 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 diff --git a/myems-api/excelexporters/shopfloorbatch.py b/myems-api/excelexporters/shopfloorbatch.py index 7f7c3ff9..c8c1ec13 100644 --- a/myems-api/excelexporters/shopfloorbatch.py +++ b/myems-api/excelexporters/shopfloorbatch.py @@ -1,7 +1,7 @@ import base64 import uuid import os -from openpyxl.styles import PatternFill, Border, Side, Alignment, Protection, Font +from openpyxl.styles import PatternFill, Border, Side, Alignment, Font from openpyxl.drawing.image import Image from openpyxl import Workbook diff --git a/myems-api/excelexporters/shopfloorcost.py b/myems-api/excelexporters/shopfloorcost.py index 2c9a524b..864bd3fc 100644 --- a/myems-api/excelexporters/shopfloorcost.py +++ b/myems-api/excelexporters/shopfloorcost.py @@ -1,11 +1,7 @@ import base64 import uuid import os -from openpyxl.chart import ( - PieChart, - LineChart, - Reference, -) +from openpyxl.chart import PieChart, LineChart, Reference from openpyxl.styles import PatternFill, Border, Side, Alignment, Font from openpyxl.drawing.image import Image from openpyxl import Workbook diff --git a/myems-api/excelexporters/shopfloorenergycategory.py b/myems-api/excelexporters/shopfloorenergycategory.py index 8ad2428e..71083f4d 100644 --- a/myems-api/excelexporters/shopfloorenergycategory.py +++ b/myems-api/excelexporters/shopfloorenergycategory.py @@ -1,11 +1,7 @@ import base64 import uuid import os -from openpyxl.chart import ( - PieChart, - LineChart, - Reference, - ) +from openpyxl.chart import PieChart, LineChart, Reference from openpyxl.styles import PatternFill, Border, Side, Alignment, Font from openpyxl.drawing.image import Image from openpyxl import Workbook diff --git a/myems-api/excelexporters/shopfloorenergyitem.py b/myems-api/excelexporters/shopfloorenergyitem.py index 94a905fd..0474b821 100644 --- a/myems-api/excelexporters/shopfloorenergyitem.py +++ b/myems-api/excelexporters/shopfloorenergyitem.py @@ -1,11 +1,7 @@ import base64 import uuid import os -from openpyxl.chart import ( - PieChart, - LineChart, - Reference, -) +from openpyxl.chart import PieChart, LineChart, Reference from openpyxl.styles import PatternFill, Border, Side, Alignment, Font from openpyxl.drawing.image import Image from openpyxl import Workbook @@ -116,12 +112,6 @@ def generate_excel(report, 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 diff --git a/myems-api/excelexporters/shopfloorload.py b/myems-api/excelexporters/shopfloorload.py index 5ba01f90..5cedfbcf 100644 --- a/myems-api/excelexporters/shopfloorload.py +++ b/myems-api/excelexporters/shopfloorload.py @@ -1,10 +1,7 @@ import base64 import uuid import os -from openpyxl.chart import ( - LineChart, - Reference, -) +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 @@ -161,98 +158,92 @@ def generate_excel(report, #################################################################################################################### 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 + ' 统计分析' + ws['B6'].font = title_font + ws['B6'] = name + ' 统计分析' - category = reporting_period_data['names'] + 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 + # 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['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['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 + ws['E7'].font = title_font + ws['E7'].alignment = c_c_alignment + ws['E7'] = '负荷系数' + ws['E7'].border = f_border - # table_data + # 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 + 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['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)].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['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)].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['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)].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 + 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 #################################################################################################################### # Second: 报告期单位面积消耗 @@ -261,58 +252,57 @@ def generate_excel(report, # per_unit_area_start_row_number + 2 ~ per_unit_area_start_row_number + 2 + ca_len : table_data #################################################################################################################### - if has_energy_data_flag: - names = reporting_period_data['names'] - ca_len = len(names) - per_unit_area_start_row_number = 9 + ca_len * 2 + names = reporting_period_data['names'] + ca_len = len(names) + per_unit_area_start_row_number = 9 + ca_len * 2 - ws['B' + str(per_unit_area_start_row_number)].font = title_font - ws['B' + str(per_unit_area_start_row_number)] = name + ' 单位面积值' + str(report['shopfloor']['area']) + 'M²' + ws['B' + str(per_unit_area_start_row_number)].font = title_font + ws['B' + str(per_unit_area_start_row_number)] = name + ' 单位面积值' + str(report['shopfloor']['area']) + 'M²' - category = reporting_period_data['names'] + category = reporting_period_data['names'] - # table_title - ws['B' + str(per_unit_area_start_row_number + 1)].fill = table_fill - ws['B' + str(per_unit_area_start_row_number + 1)].font = title_font - ws['B' + str(per_unit_area_start_row_number + 1)].alignment = c_c_alignment - ws['B' + str(per_unit_area_start_row_number + 1)] = '报告期' - ws['B' + str(per_unit_area_start_row_number + 1)].border = f_border + # table_title + ws['B' + str(per_unit_area_start_row_number + 1)].fill = table_fill + ws['B' + str(per_unit_area_start_row_number + 1)].font = title_font + ws['B' + str(per_unit_area_start_row_number + 1)].alignment = c_c_alignment + ws['B' + str(per_unit_area_start_row_number + 1)] = '报告期' + ws['B' + str(per_unit_area_start_row_number + 1)].border = f_border - ws['C' + str(per_unit_area_start_row_number + 1)].font = title_font - ws['C' + str(per_unit_area_start_row_number + 1)].alignment = c_c_alignment - ws['C' + str(per_unit_area_start_row_number + 1)] = '平均负荷' - ws['C' + str(per_unit_area_start_row_number + 1)].border = f_border + ws['C' + str(per_unit_area_start_row_number + 1)].font = title_font + ws['C' + str(per_unit_area_start_row_number + 1)].alignment = c_c_alignment + ws['C' + str(per_unit_area_start_row_number + 1)] = '平均负荷' + ws['C' + str(per_unit_area_start_row_number + 1)].border = f_border - ws['D' + str(per_unit_area_start_row_number + 1)].font = title_font - ws['D' + str(per_unit_area_start_row_number + 1)].alignment = c_c_alignment - ws['D' + str(per_unit_area_start_row_number + 1)] = '最大负荷' - ws['D' + str(per_unit_area_start_row_number + 1)].border = f_border + ws['D' + str(per_unit_area_start_row_number + 1)].font = title_font + ws['D' + str(per_unit_area_start_row_number + 1)].alignment = c_c_alignment + ws['D' + str(per_unit_area_start_row_number + 1)] = '最大负荷' + ws['D' + str(per_unit_area_start_row_number + 1)].border = f_border - # table_data + # table_data - for i, value in enumerate(category): - row_data = per_unit_area_start_row_number + 2 + i - ws['B' + str(row_data)].font = name_font - ws['B' + str(row_data)].alignment = c_c_alignment - ws['B' + str(row_data)] = reporting_period_data['names'][i] + " (" + reporting_period_data['units'][ - i] + "/H/M²)" - ws['B' + str(row_data)].border = f_border + for i, value in enumerate(category): + row_data = per_unit_area_start_row_number + 2 + i + ws['B' + str(row_data)].font = name_font + ws['B' + str(row_data)].alignment = c_c_alignment + ws['B' + str(row_data)] = reporting_period_data['names'][i] + " (" + reporting_period_data['units'][ + i] + "/H/M²)" + ws['B' + str(row_data)].border = f_border - ws['C' + str(row_data)].font = name_font - ws['C' + str(row_data)].alignment = c_c_alignment - if reporting_period_data['averages_per_unit_area'][i] \ - or reporting_period_data['averages_per_unit_area'][i] == 0: - ws['C' + str(row_data)] = round(reporting_period_data['averages_per_unit_area'][i], 2) - ws['C' + str(row_data)].border = f_border - ws['C' + str(row_data)].number_format = '0.00' + ws['C' + str(row_data)].font = name_font + ws['C' + str(row_data)].alignment = c_c_alignment + if reporting_period_data['averages_per_unit_area'][i] \ + or reporting_period_data['averages_per_unit_area'][i] == 0: + ws['C' + str(row_data)] = round(reporting_period_data['averages_per_unit_area'][i], 2) + ws['C' + str(row_data)].border = f_border + ws['C' + str(row_data)].number_format = '0.00' - ws['D' + str(row_data)].font = name_font - ws['D' + str(row_data)].alignment = c_c_alignment - if reporting_period_data['maximums_per_unit_area'][i] \ - or reporting_period_data['maximums_per_unit_area'][i] == 0: - ws['D' + str(row_data)] = round(reporting_period_data['maximums_per_unit_area'][i], 2) - ws['D' + str(row_data)].border = f_border - ws['D' + str(row_data)].number_format = '0.00' + ws['D' + str(row_data)].font = name_font + ws['D' + str(row_data)].alignment = c_c_alignment + if reporting_period_data['maximums_per_unit_area'][i] \ + or reporting_period_data['maximums_per_unit_area'][i] == 0: + ws['D' + str(row_data)] = round(reporting_period_data['maximums_per_unit_area'][i], 2) + ws['D' + str(row_data)].border = f_border + ws['D' + str(row_data)].number_format = '0.00' #################################################################################################################### # Third: 详细数据 diff --git a/myems-api/excelexporters/shopfloorsaving.py b/myems-api/excelexporters/shopfloorsaving.py index b83f4811..61025b36 100644 --- a/myems-api/excelexporters/shopfloorsaving.py +++ b/myems-api/excelexporters/shopfloorsaving.py @@ -1,11 +1,8 @@ import base64 import uuid import os -from openpyxl.chart import ( - PieChart, - LineChart, - Reference, -) +from decimal import Decimal +from openpyxl.chart import PieChart, LineChart, Reference from openpyxl.styles import PatternFill, Border, Side, Alignment, Font from openpyxl.drawing.image import Image from openpyxl import Workbook @@ -782,7 +779,7 @@ def generate_excel(report, def sum_list(lists): - total = 0 + total = Decimal(0) for i in range(0, len(lists)): total += lists[i] diff --git a/myems-api/excelexporters/shopfloorstatistics.py b/myems-api/excelexporters/shopfloorstatistics.py index 43e925a9..0f201519 100644 --- a/myems-api/excelexporters/shopfloorstatistics.py +++ b/myems-api/excelexporters/shopfloorstatistics.py @@ -1,10 +1,7 @@ import base64 import uuid import os -from openpyxl.chart import ( - LineChart, - Reference, -) +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 @@ -160,152 +157,146 @@ def generate_excel(report, #################################################################################################################### 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 + ' 统计分析' + ws['B6'].font = title_font + ws['B6'] = name + ' 统计分析' - category = reporting_period_data['names'] + 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 + # 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['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['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 + ws['E7'].font = title_font + ws['E7'].alignment = c_c_alignment + ws['E7'] = '最小值' + ws['E7'].border = f_border - ws['F7'].font = title_font - ws['F7'].alignment = c_c_alignment - ws['F7'] = '最大值' - ws['F7'].border = f_border + ws['F7'].font = title_font + ws['F7'].alignment = c_c_alignment + ws['F7'] = '最大值' + ws['F7'].border = f_border - ws['G7'].font = title_font - ws['G7'].alignment = c_c_alignment - ws['G7'] = '样本标准差' - ws['G7'].border = f_border + ws['G7'].font = title_font + ws['G7'].alignment = c_c_alignment + ws['G7'] = '样本标准差' + ws['G7'].border = f_border - ws['H7'].font = title_font - ws['H7'].alignment = c_c_alignment - ws['H7'] = '样本方差' - ws['H7'].border = f_border + ws['H7'].font = title_font + ws['H7'].alignment = c_c_alignment + ws['H7'] = '样本方差' + ws['H7'].border = f_border - # table_data + # 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] + " )" - ws['B' + str(row)].border = f_border + 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] + " )" + 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['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['means'][i], 2) \ - if reporting_period_data['means'][i] is not None else '' - ws['C' + str(row)].border = f_border - ws['C' + str(row)].number_format = '0.00' + ws['C' + str(row)].font = name_font + ws['C' + str(row)].alignment = c_c_alignment + ws['C' + str(row)] = round(reporting_period_data['means'][i], 2) \ + if reporting_period_data['means'][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['means_increment_rate'][i] * 100, 2)) + "%" \ - if reporting_period_data['means_increment_rate'][i] is not None else '0.00%' - ws['C' + str(row + 1)].border = f_border + 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['means_increment_rate'][i] * 100, 2)) + "%" \ + if reporting_period_data['means_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['medians'][i], 2) \ - if reporting_period_data['medians'][i] is not None else '' - ws['D' + str(row)].border = f_border - ws['D' + str(row)].number_format = '0.00' + ws['D' + str(row)].font = name_font + ws['D' + str(row)].alignment = c_c_alignment + ws['D' + str(row)] = round(reporting_period_data['medians'][i], 2) \ + if reporting_period_data['medians'][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['medians_increment_rate'][i] * 100, 2)) + "%" \ - if reporting_period_data['medians_increment_rate'][i] is not None else '0.00%' - ws['D' + str(row + 1)].border = f_border + 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['medians_increment_rate'][i] * 100, 2)) + "%" \ + if reporting_period_data['medians_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['minimums'][i], 2) \ - if reporting_period_data['minimums'][i] is not None else '' - ws['E' + str(row)].border = f_border - ws['E' + str(row)].number_format = '0.00' + ws['E' + str(row)].font = name_font + ws['E' + str(row)].alignment = c_c_alignment + ws['E' + str(row)] = round(reporting_period_data['minimums'][i], 2) \ + if reporting_period_data['minimums'][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['minimums_increment_rate'][i] * 100, 2)) + "%" \ - if reporting_period_data['minimums_increment_rate'][i] is not None else '0.00%' - ws['E' + str(row + 1)].border = f_border + 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['minimums_increment_rate'][i] * 100, 2)) + "%" \ + if reporting_period_data['minimums_increment_rate'][i] is not None else '0.00%' + ws['E' + str(row + 1)].border = f_border - ws['F' + str(row)].font = name_font - ws['F' + str(row)].alignment = c_c_alignment - ws['F' + str(row)] = round(reporting_period_data['maximums'][i], 2) \ - if reporting_period_data['maximums'][i] is not None else '' - ws['F' + str(row)].border = f_border - ws['F' + str(row)].number_format = '0.00' + ws['F' + str(row)].font = name_font + ws['F' + str(row)].alignment = c_c_alignment + ws['F' + str(row)] = round(reporting_period_data['maximums'][i], 2) \ + if reporting_period_data['maximums'][i] is not None else '' + ws['F' + str(row)].border = f_border + ws['F' + str(row)].number_format = '0.00' - ws['F' + str(row + 1)].font = name_font - ws['F' + str(row + 1)].alignment = c_c_alignment - ws['F' + 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['F' + str(row + 1)].border = f_border + ws['F' + str(row + 1)].font = name_font + ws['F' + str(row + 1)].alignment = c_c_alignment + ws['F' + 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['F' + str(row + 1)].border = f_border - ws['G' + str(row)].font = name_font - ws['G' + str(row)].alignment = c_c_alignment - ws['G' + str(row)] = round(reporting_period_data['stdevs'][i], 2) \ - if reporting_period_data['stdevs'][i] is not None else '' - ws['G' + str(row)].border = f_border - ws['G' + str(row)].number_format = '0.00' + ws['G' + str(row)].font = name_font + ws['G' + str(row)].alignment = c_c_alignment + ws['G' + str(row)] = round(reporting_period_data['stdevs'][i], 2) \ + if reporting_period_data['stdevs'][i] is not None else '' + ws['G' + str(row)].border = f_border + ws['G' + str(row)].number_format = '0.00' - ws['G' + str(row + 1)].font = name_font - ws['G' + str(row + 1)].alignment = c_c_alignment - ws['G' + str(row + 1)] = str(round(reporting_period_data['stdevs_increment_rate'][i] * 100, 2)) + "%" \ - if reporting_period_data['stdevs_increment_rate'][i] is not None else '0.00%' - ws['G' + str(row + 1)].border = f_border + ws['G' + str(row + 1)].font = name_font + ws['G' + str(row + 1)].alignment = c_c_alignment + ws['G' + str(row + 1)] = str(round(reporting_period_data['stdevs_increment_rate'][i] * 100, 2)) + "%" \ + if reporting_period_data['stdevs_increment_rate'][i] is not None else '0.00%' + ws['G' + str(row + 1)].border = f_border - ws['H' + str(row)].font = name_font - ws['H' + str(row)].alignment = c_c_alignment - ws['H' + str(row)] = round(reporting_period_data['variances'][i], 2) \ - if reporting_period_data['variances'][i] is not None else '' - ws['H' + str(row)].border = f_border - ws['H' + str(row)].number_format = '0.00' + ws['H' + str(row)].font = name_font + ws['H' + str(row)].alignment = c_c_alignment + ws['H' + str(row)] = round(reporting_period_data['variances'][i], 2) \ + if reporting_period_data['variances'][i] is not None else '' + ws['H' + str(row)].border = f_border + ws['H' + str(row)].number_format = '0.00' - ws['H' + str(row + 1)].font = name_font - ws['H' + str(row + 1)].alignment = c_c_alignment - ws['H' + str(row + 1)] = str(round(reporting_period_data['variances_increment_rate'][i] * 100, 2)) + "%" \ - if reporting_period_data['variances_increment_rate'][i] is not None else '0.00%' - ws['H' + str(row + 1)].border = f_border + ws['H' + str(row + 1)].font = name_font + ws['H' + str(row + 1)].alignment = c_c_alignment + ws['H' + str(row + 1)] = str(round(reporting_period_data['variances_increment_rate'][i] * 100, 2)) + "%" \ + if reporting_period_data['variances_increment_rate'][i] is not None else '0.00%' + ws['H' + str(row + 1)].border = f_border #################################################################################################################### # Second: 报告期消耗 # 9 + ca_len * 2: title @@ -313,111 +304,110 @@ def generate_excel(report, # per_unit_area_start_row_number + 2 ~ per_unit_area_start_row_number + 2 + ca_len : table_data #################################################################################################################### - if has_energy_data_flag: - names = reporting_period_data['names'] - ca_len = len(names) + names = reporting_period_data['names'] + ca_len = len(names) - per_unit_area_start_row_number = 9 + ca_len * 2 + per_unit_area_start_row_number = 9 + ca_len * 2 - ws['B' + str(per_unit_area_start_row_number)].font = title_font - ws['B' + str(per_unit_area_start_row_number)] = name + ' 单位面积值' + str(report['shopfloor']['area']) + 'M²' + ws['B' + str(per_unit_area_start_row_number)].font = title_font + ws['B' + str(per_unit_area_start_row_number)] = name + ' 单位面积值' + str(report['shopfloor']['area']) + 'M²' - category = reporting_period_data['names'] + category = reporting_period_data['names'] - # table_title - ws['B' + str(per_unit_area_start_row_number + 1)].fill = table_fill - ws['B' + str(per_unit_area_start_row_number + 1)].font = title_font - ws['B' + str(per_unit_area_start_row_number + 1)].alignment = c_c_alignment - ws['B' + str(per_unit_area_start_row_number + 1)] = '报告期' - ws['B' + str(per_unit_area_start_row_number + 1)].border = f_border + # table_title + ws['B' + str(per_unit_area_start_row_number + 1)].fill = table_fill + ws['B' + str(per_unit_area_start_row_number + 1)].font = title_font + ws['B' + str(per_unit_area_start_row_number + 1)].alignment = c_c_alignment + ws['B' + str(per_unit_area_start_row_number + 1)] = '报告期' + ws['B' + str(per_unit_area_start_row_number + 1)].border = f_border - ws['C' + str(per_unit_area_start_row_number + 1)].font = title_font - ws['C' + str(per_unit_area_start_row_number + 1)].alignment = c_c_alignment - ws['C' + str(per_unit_area_start_row_number + 1)] = '算术平均数' - ws['C' + str(per_unit_area_start_row_number + 1)].border = f_border + ws['C' + str(per_unit_area_start_row_number + 1)].font = title_font + ws['C' + str(per_unit_area_start_row_number + 1)].alignment = c_c_alignment + ws['C' + str(per_unit_area_start_row_number + 1)] = '算术平均数' + ws['C' + str(per_unit_area_start_row_number + 1)].border = f_border - ws['D' + str(per_unit_area_start_row_number + 1)].font = title_font - ws['D' + str(per_unit_area_start_row_number + 1)].alignment = c_c_alignment - ws['D' + str(per_unit_area_start_row_number + 1)] = '中位数' - ws['D' + str(per_unit_area_start_row_number + 1)].border = f_border + ws['D' + str(per_unit_area_start_row_number + 1)].font = title_font + ws['D' + str(per_unit_area_start_row_number + 1)].alignment = c_c_alignment + ws['D' + str(per_unit_area_start_row_number + 1)] = '中位数' + ws['D' + str(per_unit_area_start_row_number + 1)].border = f_border - ws['E' + str(per_unit_area_start_row_number + 1)].font = title_font - ws['E' + str(per_unit_area_start_row_number + 1)].alignment = c_c_alignment - ws['E' + str(per_unit_area_start_row_number + 1)] = '最小值' - ws['E' + str(per_unit_area_start_row_number + 1)].border = f_border + ws['E' + str(per_unit_area_start_row_number + 1)].font = title_font + ws['E' + str(per_unit_area_start_row_number + 1)].alignment = c_c_alignment + ws['E' + str(per_unit_area_start_row_number + 1)] = '最小值' + ws['E' + str(per_unit_area_start_row_number + 1)].border = f_border - ws['F' + str(per_unit_area_start_row_number + 1)].font = title_font - ws['F' + str(per_unit_area_start_row_number + 1)].alignment = c_c_alignment - ws['F' + str(per_unit_area_start_row_number + 1)] = '最大值' - ws['F' + str(per_unit_area_start_row_number + 1)].border = f_border + ws['F' + str(per_unit_area_start_row_number + 1)].font = title_font + ws['F' + str(per_unit_area_start_row_number + 1)].alignment = c_c_alignment + ws['F' + str(per_unit_area_start_row_number + 1)] = '最大值' + ws['F' + str(per_unit_area_start_row_number + 1)].border = f_border - ws['G' + str(per_unit_area_start_row_number + 1)].font = title_font - ws['G' + str(per_unit_area_start_row_number + 1)].alignment = c_c_alignment - ws['G' + str(per_unit_area_start_row_number + 1)] = '样本标准差' - ws['G' + str(per_unit_area_start_row_number + 1)].border = f_border + ws['G' + str(per_unit_area_start_row_number + 1)].font = title_font + ws['G' + str(per_unit_area_start_row_number + 1)].alignment = c_c_alignment + ws['G' + str(per_unit_area_start_row_number + 1)] = '样本标准差' + ws['G' + str(per_unit_area_start_row_number + 1)].border = f_border - ws['H' + str(per_unit_area_start_row_number + 1)].font = title_font - ws['H' + str(per_unit_area_start_row_number + 1)].alignment = c_c_alignment - ws['H' + str(per_unit_area_start_row_number + 1)] = '样本方差' - ws['H' + str(per_unit_area_start_row_number + 1)].border = f_border + ws['H' + str(per_unit_area_start_row_number + 1)].font = title_font + ws['H' + str(per_unit_area_start_row_number + 1)].alignment = c_c_alignment + ws['H' + str(per_unit_area_start_row_number + 1)] = '样本方差' + ws['H' + str(per_unit_area_start_row_number + 1)].border = f_border - # table_data + # table_data - for i, value in enumerate(category): - row_data = per_unit_area_start_row_number + 2 + i - ws['B' + str(row_data)].font = name_font - ws['B' + str(row_data)].alignment = c_c_alignment - ws['B' + str(row_data)] = reporting_period_data['names'][i] + " (" + reporting_period_data['units'][ - i] + "/M²)" - ws['B' + str(row_data)].border = f_border + for i, value in enumerate(category): + row_data = per_unit_area_start_row_number + 2 + i + ws['B' + str(row_data)].font = name_font + ws['B' + str(row_data)].alignment = c_c_alignment + ws['B' + str(row_data)] = reporting_period_data['names'][i] + " (" + reporting_period_data['units'][ + i] + "/M²)" + ws['B' + str(row_data)].border = f_border - ws['C' + str(row_data)].font = name_font - ws['C' + str(row_data)].alignment = c_c_alignment - if reporting_period_data['means_per_unit_area'][i] \ - or reporting_period_data['means_per_unit_area'][i] == 0: - ws['C' + str(row_data)] = round(reporting_period_data['means_per_unit_area'][i], 2) - ws['C' + str(row_data)].border = f_border - ws['C' + str(row_data)].number_format = '0.00' + ws['C' + str(row_data)].font = name_font + ws['C' + str(row_data)].alignment = c_c_alignment + if reporting_period_data['means_per_unit_area'][i] \ + or reporting_period_data['means_per_unit_area'][i] == 0: + ws['C' + str(row_data)] = round(reporting_period_data['means_per_unit_area'][i], 2) + ws['C' + str(row_data)].border = f_border + ws['C' + str(row_data)].number_format = '0.00' - ws['D' + str(row_data)].font = name_font - ws['D' + str(row_data)].alignment = c_c_alignment - if reporting_period_data['medians_per_unit_area'][i] \ - or reporting_period_data['medians_per_unit_area'][i] == 0: - ws['D' + str(row_data)] = round(reporting_period_data['medians_per_unit_area'][i], 2) - ws['D' + str(row_data)].border = f_border - ws['D' + str(row_data)].number_format = '0.00' + ws['D' + str(row_data)].font = name_font + ws['D' + str(row_data)].alignment = c_c_alignment + if reporting_period_data['medians_per_unit_area'][i] \ + or reporting_period_data['medians_per_unit_area'][i] == 0: + ws['D' + str(row_data)] = round(reporting_period_data['medians_per_unit_area'][i], 2) + ws['D' + str(row_data)].border = f_border + ws['D' + str(row_data)].number_format = '0.00' - ws['E' + str(row_data)].font = name_font - ws['E' + str(row_data)].alignment = c_c_alignment - if reporting_period_data['minimums_per_unit_area'][i] \ - or reporting_period_data['minimums_per_unit_area'][i] == 0: - ws['E' + str(row_data)] = round(reporting_period_data['minimums_per_unit_area'][i], 2) - ws['E' + str(row_data)].border = f_border - ws['E' + str(row_data)].number_format = '0.00' + ws['E' + str(row_data)].font = name_font + ws['E' + str(row_data)].alignment = c_c_alignment + if reporting_period_data['minimums_per_unit_area'][i] \ + or reporting_period_data['minimums_per_unit_area'][i] == 0: + ws['E' + str(row_data)] = round(reporting_period_data['minimums_per_unit_area'][i], 2) + ws['E' + str(row_data)].border = f_border + ws['E' + str(row_data)].number_format = '0.00' - ws['F' + str(row_data)].font = name_font - ws['F' + str(row_data)].alignment = c_c_alignment - if reporting_period_data['maximums_per_unit_area'][i] \ - or reporting_period_data['maximums_per_unit_area'][i] == 0: - ws['F' + str(row_data)] = round(reporting_period_data['maximums_per_unit_area'][i], 2) - ws['F' + str(row_data)].border = f_border - ws['F' + str(row_data)].number_format = '0.00' + ws['F' + str(row_data)].font = name_font + ws['F' + str(row_data)].alignment = c_c_alignment + if reporting_period_data['maximums_per_unit_area'][i] \ + or reporting_period_data['maximums_per_unit_area'][i] == 0: + ws['F' + str(row_data)] = round(reporting_period_data['maximums_per_unit_area'][i], 2) + ws['F' + str(row_data)].border = f_border + ws['F' + str(row_data)].number_format = '0.00' - ws['G' + str(row_data)].font = name_font - ws['G' + str(row_data)].alignment = c_c_alignment - if (reporting_period_data['stdevs_per_unit_area'][i]) \ - or reporting_period_data['stdevs_per_unit_area'][i] == 0: - ws['G' + str(row_data)] = round(reporting_period_data['stdevs_per_unit_area'][i], 2) - ws['G' + str(row_data)].border = f_border - ws['G' + str(row_data)].number_format = '0.00' + ws['G' + str(row_data)].font = name_font + ws['G' + str(row_data)].alignment = c_c_alignment + if (reporting_period_data['stdevs_per_unit_area'][i]) \ + or reporting_period_data['stdevs_per_unit_area'][i] == 0: + ws['G' + str(row_data)] = round(reporting_period_data['stdevs_per_unit_area'][i], 2) + ws['G' + str(row_data)].border = f_border + ws['G' + str(row_data)].number_format = '0.00' - ws['H' + str(row_data)].font = name_font - ws['H' + str(row_data)].alignment = c_c_alignment - if reporting_period_data['variances_per_unit_area'][i] \ - or reporting_period_data['variances_per_unit_area'][i] == 0: - ws['H' + str(row_data)] = round(reporting_period_data['variances_per_unit_area'][i], 2) - ws['H' + str(row_data)].border = f_border - ws['H' + str(row_data)].number_format = '0.00' + ws['H' + str(row_data)].font = name_font + ws['H' + str(row_data)].alignment = c_c_alignment + if reporting_period_data['variances_per_unit_area'][i] \ + or reporting_period_data['variances_per_unit_area'][i] == 0: + ws['H' + str(row_data)] = round(reporting_period_data['variances_per_unit_area'][i], 2) + ws['H' + str(row_data)].border = f_border + ws['H' + str(row_data)].number_format = '0.00' #################################################################################################################### # Third: 详细数据 diff --git a/myems-api/excelexporters/spacecost.py b/myems-api/excelexporters/spacecost.py index 3cbdc0ba..4f9cc231 100644 --- a/myems-api/excelexporters/spacecost.py +++ b/myems-api/excelexporters/spacecost.py @@ -2,11 +2,7 @@ import base64 import uuid import os from decimal import Decimal -from openpyxl.chart import ( - PieChart, - LineChart, - Reference, -) +from openpyxl.chart import PieChart, LineChart, Reference from openpyxl.styles import PatternFill, Border, Side, Alignment, Font from openpyxl.drawing.image import Image from openpyxl import Workbook diff --git a/myems-api/excelexporters/spaceefficiency.py b/myems-api/excelexporters/spaceefficiency.py index 4f860aab..f7eb898f 100644 --- a/myems-api/excelexporters/spaceefficiency.py +++ b/myems-api/excelexporters/spaceefficiency.py @@ -1,12 +1,7 @@ import base64 import uuid import os -from openpyxl.chart import ( - PieChart, - LineChart, - BarChart, - Reference, -) +from openpyxl.chart import LineChart, Reference from openpyxl.styles import PatternFill, Border, Side, Alignment, Font from openpyxl.drawing.image import Image from openpyxl import Workbook diff --git a/myems-api/excelexporters/spaceenergycategory.py b/myems-api/excelexporters/spaceenergycategory.py index 95ce2b2e..1a1b1750 100644 --- a/myems-api/excelexporters/spaceenergycategory.py +++ b/myems-api/excelexporters/spaceenergycategory.py @@ -1,12 +1,7 @@ import base64 import uuid import os -from openpyxl.chart import ( - PieChart, - LineChart, - BarChart, - Reference, - ) +from openpyxl.chart import PieChart, LineChart, Reference from openpyxl.styles import PatternFill, Border, Side, Alignment, Font from openpyxl.drawing.image import Image from openpyxl import Workbook @@ -119,12 +114,6 @@ def generate_excel(report, 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") diff --git a/myems-api/excelexporters/spaceenergyitem.py b/myems-api/excelexporters/spaceenergyitem.py index 927eb683..95312e78 100644 --- a/myems-api/excelexporters/spaceenergyitem.py +++ b/myems-api/excelexporters/spaceenergyitem.py @@ -1,12 +1,7 @@ import base64 import uuid import os -from openpyxl.chart import ( - PieChart, - LineChart, - BarChart, - Reference, -) +from openpyxl.chart import PieChart, LineChart, Reference from openpyxl.styles import PatternFill, Border, Side, Alignment, Font from openpyxl.drawing.image import Image from openpyxl import Workbook diff --git a/myems-api/excelexporters/spaceincome.py b/myems-api/excelexporters/spaceincome.py index b116f431..13416705 100644 --- a/myems-api/excelexporters/spaceincome.py +++ b/myems-api/excelexporters/spaceincome.py @@ -2,12 +2,7 @@ import base64 import uuid import os from decimal import Decimal -from openpyxl.chart import ( - PieChart, - LineChart, - BarChart, - Reference, -) +from openpyxl.chart import PieChart, LineChart, Reference from openpyxl.styles import PatternFill, Border, Side, Alignment, Font from openpyxl.drawing.image import Image from openpyxl import Workbook diff --git a/myems-api/excelexporters/spaceload.py b/myems-api/excelexporters/spaceload.py index a1cce7f3..9e2a167c 100644 --- a/myems-api/excelexporters/spaceload.py +++ b/myems-api/excelexporters/spaceload.py @@ -1,12 +1,7 @@ import base64 import uuid import os -from openpyxl.chart import ( - PieChart, - LineChart, - BarChart, - Reference, -) +from openpyxl.chart import LineChart, Reference from openpyxl.styles import PatternFill, Border, Side, Alignment, Font from openpyxl.drawing.image import Image from openpyxl import Workbook diff --git a/myems-api/excelexporters/spaceoutput.py b/myems-api/excelexporters/spaceoutput.py index 4df47bc5..aaf0ba47 100644 --- a/myems-api/excelexporters/spaceoutput.py +++ b/myems-api/excelexporters/spaceoutput.py @@ -1,12 +1,7 @@ import base64 import uuid import os -from openpyxl.chart import ( - PieChart, - LineChart, - BarChart, - Reference, -) +from openpyxl.chart import PieChart, LineChart, Reference from openpyxl.styles import PatternFill, Border, Side, Alignment, Font from openpyxl.drawing.image import Image from openpyxl import Workbook diff --git a/myems-api/excelexporters/spacesaving.py b/myems-api/excelexporters/spacesaving.py index d8ecd53c..812ba358 100644 --- a/myems-api/excelexporters/spacesaving.py +++ b/myems-api/excelexporters/spacesaving.py @@ -1,12 +1,8 @@ import base64 import uuid import os -from openpyxl.chart import ( - PieChart, - LineChart, - BarChart, - Reference, -) +from decimal import Decimal +from openpyxl.chart import PieChart, LineChart, Reference from openpyxl.styles import PatternFill, Border, Side, Alignment, Font from openpyxl.drawing.image import Image from openpyxl import Workbook @@ -868,7 +864,7 @@ def generate_excel(report, def sum_list(lists): - total = 0 + total = Decimal(0) for i in range(0, len(lists)): total += lists[i] diff --git a/myems-api/excelexporters/spacestatistics.py b/myems-api/excelexporters/spacestatistics.py index b88b2637..c9f56d0e 100644 --- a/myems-api/excelexporters/spacestatistics.py +++ b/myems-api/excelexporters/spacestatistics.py @@ -1,10 +1,7 @@ import base64 import uuid import os -from openpyxl.chart import ( - LineChart, - Reference, -) +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 @@ -160,152 +157,146 @@ def generate_excel(report, #################################################################################################################### 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 + ' 统计分析' + ws['B6'].font = title_font + ws['B6'] = name + ' 统计分析' - category = reporting_period_data['names'] + 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 + # 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['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['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 + ws['E7'].font = title_font + ws['E7'].alignment = c_c_alignment + ws['E7'] = '最小值' + ws['E7'].border = f_border - ws['F7'].font = title_font - ws['F7'].alignment = c_c_alignment - ws['F7'] = '最大值' - ws['F7'].border = f_border + ws['F7'].font = title_font + ws['F7'].alignment = c_c_alignment + ws['F7'] = '最大值' + ws['F7'].border = f_border - ws['G7'].font = title_font - ws['G7'].alignment = c_c_alignment - ws['G7'] = '样本标准差' - ws['G7'].border = f_border + ws['G7'].font = title_font + ws['G7'].alignment = c_c_alignment + ws['G7'] = '样本标准差' + ws['G7'].border = f_border - ws['H7'].font = title_font - ws['H7'].alignment = c_c_alignment - ws['H7'] = '样本方差' - ws['H7'].border = f_border + ws['H7'].font = title_font + ws['H7'].alignment = c_c_alignment + ws['H7'] = '样本方差' + ws['H7'].border = f_border - # table_data + # 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] + " )" - ws['B' + str(row)].border = f_border + 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] + " )" + 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['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['means'][i], 2) \ - if reporting_period_data['means'][i] is not None else '' - ws['C' + str(row)].border = f_border - ws['C' + str(row)].number_format = '0.00' + ws['C' + str(row)].font = name_font + ws['C' + str(row)].alignment = c_c_alignment + ws['C' + str(row)] = round(reporting_period_data['means'][i], 2) \ + if reporting_period_data['means'][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['means_increment_rate'][i] * 100, 2)) + "%" \ - if reporting_period_data['means_increment_rate'][i] is not None else '0.00%' - ws['C' + str(row + 1)].border = f_border + 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['means_increment_rate'][i] * 100, 2)) + "%" \ + if reporting_period_data['means_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['medians'][i], 2) \ - if reporting_period_data['medians'][i] is not None else '' - ws['D' + str(row)].border = f_border - ws['D' + str(row)].number_format = '0.00' + ws['D' + str(row)].font = name_font + ws['D' + str(row)].alignment = c_c_alignment + ws['D' + str(row)] = round(reporting_period_data['medians'][i], 2) \ + if reporting_period_data['medians'][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['medians_increment_rate'][i] * 100, 2)) + "%" \ - if reporting_period_data['medians_increment_rate'][i] is not None else '0.00%' - ws['D' + str(row + 1)].border = f_border + 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['medians_increment_rate'][i] * 100, 2)) + "%" \ + if reporting_period_data['medians_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['minimums'][i], 2) \ - if reporting_period_data['minimums'][i] is not None else '' - ws['E' + str(row)].border = f_border - ws['E' + str(row)].number_format = '0.00' + ws['E' + str(row)].font = name_font + ws['E' + str(row)].alignment = c_c_alignment + ws['E' + str(row)] = round(reporting_period_data['minimums'][i], 2) \ + if reporting_period_data['minimums'][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['minimums_increment_rate'][i] * 100, 2)) + "%" \ - if reporting_period_data['minimums_increment_rate'][i] is not None else '0.00%' - ws['E' + str(row + 1)].border = f_border + 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['minimums_increment_rate'][i] * 100, 2)) + "%" \ + if reporting_period_data['minimums_increment_rate'][i] is not None else '0.00%' + ws['E' + str(row + 1)].border = f_border - ws['F' + str(row)].font = name_font - ws['F' + str(row)].alignment = c_c_alignment - ws['F' + str(row)] = round(reporting_period_data['maximums'][i], 2) \ - if reporting_period_data['maximums'][i] is not None else '' - ws['F' + str(row)].border = f_border - ws['F' + str(row)].number_format = '0.00' + ws['F' + str(row)].font = name_font + ws['F' + str(row)].alignment = c_c_alignment + ws['F' + str(row)] = round(reporting_period_data['maximums'][i], 2) \ + if reporting_period_data['maximums'][i] is not None else '' + ws['F' + str(row)].border = f_border + ws['F' + str(row)].number_format = '0.00' - ws['F' + str(row + 1)].font = name_font - ws['F' + str(row + 1)].alignment = c_c_alignment - ws['F' + 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['F' + str(row + 1)].border = f_border + ws['F' + str(row + 1)].font = name_font + ws['F' + str(row + 1)].alignment = c_c_alignment + ws['F' + 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['F' + str(row + 1)].border = f_border - ws['G' + str(row)].font = name_font - ws['G' + str(row)].alignment = c_c_alignment - ws['G' + str(row)] = round(reporting_period_data['stdevs'][i], 2) \ - if reporting_period_data['stdevs'][i] is not None else '' - ws['G' + str(row)].border = f_border - ws['G' + str(row)].number_format = '0.00' + ws['G' + str(row)].font = name_font + ws['G' + str(row)].alignment = c_c_alignment + ws['G' + str(row)] = round(reporting_period_data['stdevs'][i], 2) \ + if reporting_period_data['stdevs'][i] is not None else '' + ws['G' + str(row)].border = f_border + ws['G' + str(row)].number_format = '0.00' - ws['G' + str(row + 1)].font = name_font - ws['G' + str(row + 1)].alignment = c_c_alignment - ws['G' + str(row + 1)] = str(round(reporting_period_data['stdevs_increment_rate'][i] * 100, 2)) + "%" \ - if reporting_period_data['stdevs_increment_rate'][i] is not None else '0.00%' - ws['G' + str(row + 1)].border = f_border + ws['G' + str(row + 1)].font = name_font + ws['G' + str(row + 1)].alignment = c_c_alignment + ws['G' + str(row + 1)] = str(round(reporting_period_data['stdevs_increment_rate'][i] * 100, 2)) + "%" \ + if reporting_period_data['stdevs_increment_rate'][i] is not None else '0.00%' + ws['G' + str(row + 1)].border = f_border - ws['H' + str(row)].font = name_font - ws['H' + str(row)].alignment = c_c_alignment - ws['H' + str(row)] = round(reporting_period_data['variances'][i], 2) \ - if reporting_period_data['variances'][i] is not None else '' - ws['H' + str(row)].border = f_border - ws['H' + str(row)].number_format = '0.00' + ws['H' + str(row)].font = name_font + ws['H' + str(row)].alignment = c_c_alignment + ws['H' + str(row)] = round(reporting_period_data['variances'][i], 2) \ + if reporting_period_data['variances'][i] is not None else '' + ws['H' + str(row)].border = f_border + ws['H' + str(row)].number_format = '0.00' - ws['H' + str(row + 1)].font = name_font - ws['H' + str(row + 1)].alignment = c_c_alignment - ws['H' + str(row + 1)] = str(round(reporting_period_data['variances_increment_rate'][i] * 100, 2)) + "%" \ - if reporting_period_data['variances_increment_rate'][i] is not None else '0.00%' - ws['H' + str(row + 1)].border = f_border + ws['H' + str(row + 1)].font = name_font + ws['H' + str(row + 1)].alignment = c_c_alignment + ws['H' + str(row + 1)] = str(round(reporting_period_data['variances_increment_rate'][i] * 100, 2)) + "%" \ + if reporting_period_data['variances_increment_rate'][i] is not None else '0.00%' + ws['H' + str(row + 1)].border = f_border #################################################################################################################### # Second: 报告期消耗 # 9 + ca_len * 2: title @@ -313,113 +304,112 @@ def generate_excel(report, # per_unit_area_start_row_number + 2 ~ per_unit_area_start_row_number + 2 + ca_len : table_data #################################################################################################################### - if has_energy_data_flag: - names = reporting_period_data['names'] - ca_len = len(names) + names = reporting_period_data['names'] + ca_len = len(names) - per_unit_area_start_row_number = 9 + ca_len * 2 + per_unit_area_start_row_number = 9 + ca_len * 2 - ws['B' + str(per_unit_area_start_row_number)].font = title_font - ws['B' + str(per_unit_area_start_row_number)] = name + ' 单位面积值' - ws['D' + str(per_unit_area_start_row_number)].font = title_font - ws['D' + str(per_unit_area_start_row_number)] = str(report['space']['area']) + 'M²' + ws['B' + str(per_unit_area_start_row_number)].font = title_font + ws['B' + str(per_unit_area_start_row_number)] = name + ' 单位面积值' + ws['D' + str(per_unit_area_start_row_number)].font = title_font + ws['D' + str(per_unit_area_start_row_number)] = str(report['space']['area']) + 'M²' - category = reporting_period_data['names'] + category = reporting_period_data['names'] - # table_title - ws['B' + str(per_unit_area_start_row_number + 1)].fill = table_fill - ws['B' + str(per_unit_area_start_row_number + 1)].font = title_font - ws['B' + str(per_unit_area_start_row_number + 1)].alignment = c_c_alignment - ws['B' + str(per_unit_area_start_row_number + 1)] = '报告期' - ws['B' + str(per_unit_area_start_row_number + 1)].border = f_border + # table_title + ws['B' + str(per_unit_area_start_row_number + 1)].fill = table_fill + ws['B' + str(per_unit_area_start_row_number + 1)].font = title_font + ws['B' + str(per_unit_area_start_row_number + 1)].alignment = c_c_alignment + ws['B' + str(per_unit_area_start_row_number + 1)] = '报告期' + ws['B' + str(per_unit_area_start_row_number + 1)].border = f_border - ws['C' + str(per_unit_area_start_row_number + 1)].font = title_font - ws['C' + str(per_unit_area_start_row_number + 1)].alignment = c_c_alignment - ws['C' + str(per_unit_area_start_row_number + 1)] = '算术平均数' - ws['C' + str(per_unit_area_start_row_number + 1)].border = f_border + ws['C' + str(per_unit_area_start_row_number + 1)].font = title_font + ws['C' + str(per_unit_area_start_row_number + 1)].alignment = c_c_alignment + ws['C' + str(per_unit_area_start_row_number + 1)] = '算术平均数' + ws['C' + str(per_unit_area_start_row_number + 1)].border = f_border - ws['D' + str(per_unit_area_start_row_number + 1)].font = title_font - ws['D' + str(per_unit_area_start_row_number + 1)].alignment = c_c_alignment - ws['D' + str(per_unit_area_start_row_number + 1)] = '中位数' - ws['D' + str(per_unit_area_start_row_number + 1)].border = f_border + ws['D' + str(per_unit_area_start_row_number + 1)].font = title_font + ws['D' + str(per_unit_area_start_row_number + 1)].alignment = c_c_alignment + ws['D' + str(per_unit_area_start_row_number + 1)] = '中位数' + ws['D' + str(per_unit_area_start_row_number + 1)].border = f_border - ws['E' + str(per_unit_area_start_row_number + 1)].font = title_font - ws['E' + str(per_unit_area_start_row_number + 1)].alignment = c_c_alignment - ws['E' + str(per_unit_area_start_row_number + 1)] = '最小值' - ws['E' + str(per_unit_area_start_row_number + 1)].border = f_border + ws['E' + str(per_unit_area_start_row_number + 1)].font = title_font + ws['E' + str(per_unit_area_start_row_number + 1)].alignment = c_c_alignment + ws['E' + str(per_unit_area_start_row_number + 1)] = '最小值' + ws['E' + str(per_unit_area_start_row_number + 1)].border = f_border - ws['F' + str(per_unit_area_start_row_number + 1)].font = title_font - ws['F' + str(per_unit_area_start_row_number + 1)].alignment = c_c_alignment - ws['F' + str(per_unit_area_start_row_number + 1)] = '最大值' - ws['F' + str(per_unit_area_start_row_number + 1)].border = f_border + ws['F' + str(per_unit_area_start_row_number + 1)].font = title_font + ws['F' + str(per_unit_area_start_row_number + 1)].alignment = c_c_alignment + ws['F' + str(per_unit_area_start_row_number + 1)] = '最大值' + ws['F' + str(per_unit_area_start_row_number + 1)].border = f_border - ws['G' + str(per_unit_area_start_row_number + 1)].font = title_font - ws['G' + str(per_unit_area_start_row_number + 1)].alignment = c_c_alignment - ws['G' + str(per_unit_area_start_row_number + 1)] = '样本标准差' - ws['G' + str(per_unit_area_start_row_number + 1)].border = f_border + ws['G' + str(per_unit_area_start_row_number + 1)].font = title_font + ws['G' + str(per_unit_area_start_row_number + 1)].alignment = c_c_alignment + ws['G' + str(per_unit_area_start_row_number + 1)] = '样本标准差' + ws['G' + str(per_unit_area_start_row_number + 1)].border = f_border - ws['H' + str(per_unit_area_start_row_number + 1)].font = title_font - ws['H' + str(per_unit_area_start_row_number + 1)].alignment = c_c_alignment - ws['H' + str(per_unit_area_start_row_number + 1)] = '样本方差' - ws['H' + str(per_unit_area_start_row_number + 1)].border = f_border + ws['H' + str(per_unit_area_start_row_number + 1)].font = title_font + ws['H' + str(per_unit_area_start_row_number + 1)].alignment = c_c_alignment + ws['H' + str(per_unit_area_start_row_number + 1)] = '样本方差' + ws['H' + str(per_unit_area_start_row_number + 1)].border = f_border - # table_data + # table_data - for i, value in enumerate(category): - row_data = per_unit_area_start_row_number + 2 + i - ws['B' + str(row_data)].font = name_font - ws['B' + str(row_data)].alignment = c_c_alignment - ws['B' + str(row_data)] = reporting_period_data['names'][i] + " (" + reporting_period_data['units'][ - i] + "/M²)" - ws['B' + str(row_data)].border = f_border + for i, value in enumerate(category): + row_data = per_unit_area_start_row_number + 2 + i + ws['B' + str(row_data)].font = name_font + ws['B' + str(row_data)].alignment = c_c_alignment + ws['B' + str(row_data)] = reporting_period_data['names'][i] + " (" + reporting_period_data['units'][ + i] + "/M²)" + ws['B' + str(row_data)].border = f_border - ws['C' + str(row_data)].font = name_font - ws['C' + str(row_data)].alignment = c_c_alignment - if reporting_period_data['means_per_unit_area'][i] \ - or reporting_period_data['means_per_unit_area'][i] == 0: - ws['C' + str(row_data)] = round(reporting_period_data['means_per_unit_area'][i], 2) - ws['C' + str(row_data)].border = f_border - ws['C' + str(row_data)].number_format = '0.00' + ws['C' + str(row_data)].font = name_font + ws['C' + str(row_data)].alignment = c_c_alignment + if reporting_period_data['means_per_unit_area'][i] \ + or reporting_period_data['means_per_unit_area'][i] == 0: + ws['C' + str(row_data)] = round(reporting_period_data['means_per_unit_area'][i], 2) + ws['C' + str(row_data)].border = f_border + ws['C' + str(row_data)].number_format = '0.00' - ws['D' + str(row_data)].font = name_font - ws['D' + str(row_data)].alignment = c_c_alignment - if reporting_period_data['medians_per_unit_area'][i] \ - or reporting_period_data['medians_per_unit_area'][i] == 0: - ws['D' + str(row_data)] = round(reporting_period_data['medians_per_unit_area'][i], 2) - ws['D' + str(row_data)].border = f_border - ws['D' + str(row_data)].number_format = '0.00' + ws['D' + str(row_data)].font = name_font + ws['D' + str(row_data)].alignment = c_c_alignment + if reporting_period_data['medians_per_unit_area'][i] \ + or reporting_period_data['medians_per_unit_area'][i] == 0: + ws['D' + str(row_data)] = round(reporting_period_data['medians_per_unit_area'][i], 2) + ws['D' + str(row_data)].border = f_border + ws['D' + str(row_data)].number_format = '0.00' - ws['E' + str(row_data)].font = name_font - ws['E' + str(row_data)].alignment = c_c_alignment - if reporting_period_data['minimums_per_unit_area'][i] \ - or reporting_period_data['minimums_per_unit_area'][i] == 0: - ws['E' + str(row_data)] = round(reporting_period_data['minimums_per_unit_area'][i], 2) - ws['E' + str(row_data)].border = f_border - ws['E' + str(row_data)].number_format = '0.00' + ws['E' + str(row_data)].font = name_font + ws['E' + str(row_data)].alignment = c_c_alignment + if reporting_period_data['minimums_per_unit_area'][i] \ + or reporting_period_data['minimums_per_unit_area'][i] == 0: + ws['E' + str(row_data)] = round(reporting_period_data['minimums_per_unit_area'][i], 2) + ws['E' + str(row_data)].border = f_border + ws['E' + str(row_data)].number_format = '0.00' - ws['F' + str(row_data)].font = name_font - ws['F' + str(row_data)].alignment = c_c_alignment - if reporting_period_data['maximums_per_unit_area'][i] \ - or reporting_period_data['maximums_per_unit_area'][i] == 0: - ws['F' + str(row_data)] = round(reporting_period_data['maximums_per_unit_area'][i], 2) - ws['F' + str(row_data)].border = f_border - ws['F' + str(row_data)].number_format = '0.00' + ws['F' + str(row_data)].font = name_font + ws['F' + str(row_data)].alignment = c_c_alignment + if reporting_period_data['maximums_per_unit_area'][i] \ + or reporting_period_data['maximums_per_unit_area'][i] == 0: + ws['F' + str(row_data)] = round(reporting_period_data['maximums_per_unit_area'][i], 2) + ws['F' + str(row_data)].border = f_border + ws['F' + str(row_data)].number_format = '0.00' - ws['G' + str(row_data)].font = name_font - ws['G' + str(row_data)].alignment = c_c_alignment - if (reporting_period_data['stdevs_per_unit_area'][i]) \ - or reporting_period_data['stdevs_per_unit_area'][i] == 0: - ws['G' + str(row_data)] = round(reporting_period_data['stdevs_per_unit_area'][i], 2) - ws['G' + str(row_data)].border = f_border - ws['G' + str(row_data)].number_format = '0.00' + ws['G' + str(row_data)].font = name_font + ws['G' + str(row_data)].alignment = c_c_alignment + if (reporting_period_data['stdevs_per_unit_area'][i]) \ + or reporting_period_data['stdevs_per_unit_area'][i] == 0: + ws['G' + str(row_data)] = round(reporting_period_data['stdevs_per_unit_area'][i], 2) + ws['G' + str(row_data)].border = f_border + ws['G' + str(row_data)].number_format = '0.00' - ws['H' + str(row_data)].font = name_font - ws['H' + str(row_data)].alignment = c_c_alignment - if reporting_period_data['variances_per_unit_area'][i] \ - or reporting_period_data['variances_per_unit_area'][i] == 0: - ws['H' + str(row_data)] = round(reporting_period_data['variances_per_unit_area'][i], 2) - ws['H' + str(row_data)].border = f_border - ws['H' + str(row_data)].number_format = '0.00' + ws['H' + str(row_data)].font = name_font + ws['H' + str(row_data)].alignment = c_c_alignment + if reporting_period_data['variances_per_unit_area'][i] \ + or reporting_period_data['variances_per_unit_area'][i] == 0: + ws['H' + str(row_data)] = round(reporting_period_data['variances_per_unit_area'][i], 2) + ws['H' + str(row_data)].border = f_border + ws['H' + str(row_data)].number_format = '0.00' #################################################################################################################### # Third: 详细数据 diff --git a/myems-api/excelexporters/storebatch.py b/myems-api/excelexporters/storebatch.py index b3c2e6a1..cce3aa6b 100644 --- a/myems-api/excelexporters/storebatch.py +++ b/myems-api/excelexporters/storebatch.py @@ -1,7 +1,7 @@ import base64 import uuid import os -from openpyxl.styles import PatternFill, Border, Side, Alignment, Protection, Font +from openpyxl.styles import PatternFill, Border, Side, Alignment, Font from openpyxl.drawing.image import Image from openpyxl import Workbook diff --git a/myems-api/excelexporters/storecost.py b/myems-api/excelexporters/storecost.py index 42613f3e..947081ac 100644 --- a/myems-api/excelexporters/storecost.py +++ b/myems-api/excelexporters/storecost.py @@ -1,12 +1,7 @@ import base64 import uuid import os -from openpyxl.chart import ( - PieChart, - BarChart, - Reference, - LineChart, - ) +from openpyxl.chart import PieChart, Reference, LineChart from openpyxl.styles import PatternFill, Border, Side, Alignment, Font from openpyxl.drawing.image import Image from openpyxl import Workbook @@ -153,7 +148,6 @@ def generate_excel(report, "names" not in report['reporting_period'].keys() or len(report['reporting_period']['names']) == 0: filename = str(uuid.uuid4()) + '.xlsx' wb.save(filename) - return filename #################################################################################################################### diff --git a/myems-api/excelexporters/storeenergycategory.py b/myems-api/excelexporters/storeenergycategory.py index e35fb6e5..2a7021de 100644 --- a/myems-api/excelexporters/storeenergycategory.py +++ b/myems-api/excelexporters/storeenergycategory.py @@ -1,11 +1,7 @@ import base64 import uuid import os -from openpyxl.chart import ( - PieChart, - LineChart, - Reference, - ) +from openpyxl.chart import PieChart, LineChart, Reference from openpyxl.styles import PatternFill, Border, Side, Alignment, Font from openpyxl.drawing.image import Image from openpyxl import Workbook diff --git a/myems-api/excelexporters/storeenergyitem.py b/myems-api/excelexporters/storeenergyitem.py index 0ac20a0c..aab8d393 100644 --- a/myems-api/excelexporters/storeenergyitem.py +++ b/myems-api/excelexporters/storeenergyitem.py @@ -1,11 +1,7 @@ import base64 import uuid import os -from openpyxl.chart import ( - PieChart, - LineChart, - Reference, -) +from openpyxl.chart import PieChart, LineChart, Reference from openpyxl.styles import PatternFill, Border, Side, Alignment, Font from openpyxl.drawing.image import Image from openpyxl import Workbook diff --git a/myems-api/excelexporters/storeload.py b/myems-api/excelexporters/storeload.py index 5de1bb93..2afd9e8f 100644 --- a/myems-api/excelexporters/storeload.py +++ b/myems-api/excelexporters/storeload.py @@ -1,10 +1,7 @@ import base64 import uuid import os -from openpyxl.chart import ( - LineChart, - Reference, -) +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 @@ -161,98 +158,92 @@ def generate_excel(report, #################################################################################################################### 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 + ' 统计分析' + ws['B6'].font = title_font + ws['B6'] = name + ' 统计分析' - category = reporting_period_data['names'] + 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 + # 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['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['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 + ws['E7'].font = title_font + ws['E7'].alignment = c_c_alignment + ws['E7'] = '负荷系数' + ws['E7'].border = f_border - # table_data + # 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 + 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['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)].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['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)].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['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)].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 + 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 #################################################################################################################### # Second: 报告期单位面积消耗 @@ -261,58 +252,57 @@ def generate_excel(report, # per_unit_area_start_row_number + 2 ~ per_unit_area_start_row_number + 2 + ca_len : table_data #################################################################################################################### - if has_energy_data_flag: - names = reporting_period_data['names'] - ca_len = len(names) - per_unit_area_start_row_number = 9 + ca_len * 2 + names = reporting_period_data['names'] + ca_len = len(names) + per_unit_area_start_row_number = 9 + ca_len * 2 - ws['B' + str(per_unit_area_start_row_number)].font = title_font - ws['B' + str(per_unit_area_start_row_number)] = name + ' 单位面积值' + str(report['store']['area']) + 'M²' + ws['B' + str(per_unit_area_start_row_number)].font = title_font + ws['B' + str(per_unit_area_start_row_number)] = name + ' 单位面积值' + str(report['store']['area']) + 'M²' - category = reporting_period_data['names'] + category = reporting_period_data['names'] - # table_title - ws['B' + str(per_unit_area_start_row_number + 1)].fill = table_fill - ws['B' + str(per_unit_area_start_row_number + 1)].font = title_font - ws['B' + str(per_unit_area_start_row_number + 1)].alignment = c_c_alignment - ws['B' + str(per_unit_area_start_row_number + 1)] = '报告期' - ws['B' + str(per_unit_area_start_row_number + 1)].border = f_border + # table_title + ws['B' + str(per_unit_area_start_row_number + 1)].fill = table_fill + ws['B' + str(per_unit_area_start_row_number + 1)].font = title_font + ws['B' + str(per_unit_area_start_row_number + 1)].alignment = c_c_alignment + ws['B' + str(per_unit_area_start_row_number + 1)] = '报告期' + ws['B' + str(per_unit_area_start_row_number + 1)].border = f_border - ws['C' + str(per_unit_area_start_row_number + 1)].font = title_font - ws['C' + str(per_unit_area_start_row_number + 1)].alignment = c_c_alignment - ws['C' + str(per_unit_area_start_row_number + 1)] = '平均负荷' - ws['C' + str(per_unit_area_start_row_number + 1)].border = f_border + ws['C' + str(per_unit_area_start_row_number + 1)].font = title_font + ws['C' + str(per_unit_area_start_row_number + 1)].alignment = c_c_alignment + ws['C' + str(per_unit_area_start_row_number + 1)] = '平均负荷' + ws['C' + str(per_unit_area_start_row_number + 1)].border = f_border - ws['D' + str(per_unit_area_start_row_number + 1)].font = title_font - ws['D' + str(per_unit_area_start_row_number + 1)].alignment = c_c_alignment - ws['D' + str(per_unit_area_start_row_number + 1)] = '最大负荷' - ws['D' + str(per_unit_area_start_row_number + 1)].border = f_border + ws['D' + str(per_unit_area_start_row_number + 1)].font = title_font + ws['D' + str(per_unit_area_start_row_number + 1)].alignment = c_c_alignment + ws['D' + str(per_unit_area_start_row_number + 1)] = '最大负荷' + ws['D' + str(per_unit_area_start_row_number + 1)].border = f_border - # table_data + # table_data - for i, value in enumerate(category): - row_data = per_unit_area_start_row_number + 2 + i - ws['B' + str(row_data)].font = name_font - ws['B' + str(row_data)].alignment = c_c_alignment - ws['B' + str(row_data)] = reporting_period_data['names'][i] + " (" + reporting_period_data['units'][ - i] + "/H/M²)" - ws['B' + str(row_data)].border = f_border + for i, value in enumerate(category): + row_data = per_unit_area_start_row_number + 2 + i + ws['B' + str(row_data)].font = name_font + ws['B' + str(row_data)].alignment = c_c_alignment + ws['B' + str(row_data)] = reporting_period_data['names'][i] + " (" + reporting_period_data['units'][ + i] + "/H/M²)" + ws['B' + str(row_data)].border = f_border - ws['C' + str(row_data)].font = name_font - ws['C' + str(row_data)].alignment = c_c_alignment - if reporting_period_data['averages_per_unit_area'][i] \ - or reporting_period_data['averages_per_unit_area'][i] == 0: - ws['C' + str(row_data)] = round(reporting_period_data['averages_per_unit_area'][i], 2) - ws['C' + str(row_data)].border = f_border - ws['C' + str(row_data)].number_format = '0.00' + ws['C' + str(row_data)].font = name_font + ws['C' + str(row_data)].alignment = c_c_alignment + if reporting_period_data['averages_per_unit_area'][i] \ + or reporting_period_data['averages_per_unit_area'][i] == 0: + ws['C' + str(row_data)] = round(reporting_period_data['averages_per_unit_area'][i], 2) + ws['C' + str(row_data)].border = f_border + ws['C' + str(row_data)].number_format = '0.00' - ws['D' + str(row_data)].font = name_font - ws['D' + str(row_data)].alignment = c_c_alignment - if reporting_period_data['maximums_per_unit_area'][i] \ - or reporting_period_data['maximums_per_unit_area'][i] == 0: - ws['D' + str(row_data)] = round(reporting_period_data['maximums_per_unit_area'][i], 2) - ws['D' + str(row_data)].border = f_border - ws['D' + str(row_data)].number_format = '0.00' + ws['D' + str(row_data)].font = name_font + ws['D' + str(row_data)].alignment = c_c_alignment + if reporting_period_data['maximums_per_unit_area'][i] \ + or reporting_period_data['maximums_per_unit_area'][i] == 0: + ws['D' + str(row_data)] = round(reporting_period_data['maximums_per_unit_area'][i], 2) + ws['D' + str(row_data)].border = f_border + ws['D' + str(row_data)].number_format = '0.00' #################################################################################################################### # Third: 详细数据 diff --git a/myems-api/excelexporters/storesaving.py b/myems-api/excelexporters/storesaving.py index 5bd56efb..b88eb0b9 100644 --- a/myems-api/excelexporters/storesaving.py +++ b/myems-api/excelexporters/storesaving.py @@ -1,11 +1,8 @@ import base64 import uuid import os -from openpyxl.chart import ( - PieChart, - LineChart, - Reference, -) +from decimal import Decimal +from openpyxl.chart import PieChart, LineChart, Reference from openpyxl.styles import PatternFill, Border, Side, Alignment, Font from openpyxl.drawing.image import Image from openpyxl import Workbook @@ -781,11 +778,9 @@ def generate_excel(report, def sum_list(lists): - total = 0 - + total = Decimal(0) for i in range(0, len(lists)): total += lists[i] - return total diff --git a/myems-api/excelexporters/storestatistics.py b/myems-api/excelexporters/storestatistics.py index 76cc1bb9..625a00bf 100644 --- a/myems-api/excelexporters/storestatistics.py +++ b/myems-api/excelexporters/storestatistics.py @@ -1,12 +1,8 @@ import base64 import os import uuid - from openpyxl import Workbook -from openpyxl.chart import ( - LineChart, - Reference, -) +from openpyxl.chart import LineChart, Reference from openpyxl.chart.label import DataLabelList from openpyxl.drawing.image import Image from openpyxl.styles import PatternFill, Border, Side, Alignment, Font @@ -160,152 +156,146 @@ def generate_excel(report, #################################################################################################################### 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 + ' 统计分析' + ws['B6'].font = title_font + ws['B6'] = name + ' 统计分析' - category = reporting_period_data['names'] + 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 + # 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['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['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 + ws['E7'].font = title_font + ws['E7'].alignment = c_c_alignment + ws['E7'] = '最小值' + ws['E7'].border = f_border - ws['F7'].font = title_font - ws['F7'].alignment = c_c_alignment - ws['F7'] = '最大值' - ws['F7'].border = f_border + ws['F7'].font = title_font + ws['F7'].alignment = c_c_alignment + ws['F7'] = '最大值' + ws['F7'].border = f_border - ws['G7'].font = title_font - ws['G7'].alignment = c_c_alignment - ws['G7'] = '样本标准差' - ws['G7'].border = f_border + ws['G7'].font = title_font + ws['G7'].alignment = c_c_alignment + ws['G7'] = '样本标准差' + ws['G7'].border = f_border - ws['H7'].font = title_font - ws['H7'].alignment = c_c_alignment - ws['H7'] = '样本方差' - ws['H7'].border = f_border + ws['H7'].font = title_font + ws['H7'].alignment = c_c_alignment + ws['H7'] = '样本方差' + ws['H7'].border = f_border - # table_data + # 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] + " )" - ws['B' + str(row)].border = f_border + 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] + " )" + 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['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['means'][i], 2) \ - if reporting_period_data['means'][i] is not None else '' - ws['C' + str(row)].border = f_border - ws['C' + str(row)].number_format = '0.00' + ws['C' + str(row)].font = name_font + ws['C' + str(row)].alignment = c_c_alignment + ws['C' + str(row)] = round(reporting_period_data['means'][i], 2) \ + if reporting_period_data['means'][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['means_increment_rate'][i] * 100, 2)) + "%" \ - if reporting_period_data['means_increment_rate'][i] is not None else '0.00%' - ws['C' + str(row + 1)].border = f_border + 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['means_increment_rate'][i] * 100, 2)) + "%" \ + if reporting_period_data['means_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['medians'][i], 2) \ - if reporting_period_data['medians'][i] is not None else '' - ws['D' + str(row)].border = f_border - ws['D' + str(row)].number_format = '0.00' + ws['D' + str(row)].font = name_font + ws['D' + str(row)].alignment = c_c_alignment + ws['D' + str(row)] = round(reporting_period_data['medians'][i], 2) \ + if reporting_period_data['medians'][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['medians_increment_rate'][i] * 100, 2)) + "%" \ - if reporting_period_data['medians_increment_rate'][i] is not None else '0.00%' - ws['D' + str(row + 1)].border = f_border + 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['medians_increment_rate'][i] * 100, 2)) + "%" \ + if reporting_period_data['medians_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['minimums'][i], 2) \ - if reporting_period_data['minimums'][i] is not None else '' - ws['E' + str(row)].border = f_border - ws['E' + str(row)].number_format = '0.00' + ws['E' + str(row)].font = name_font + ws['E' + str(row)].alignment = c_c_alignment + ws['E' + str(row)] = round(reporting_period_data['minimums'][i], 2) \ + if reporting_period_data['minimums'][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['minimums_increment_rate'][i] * 100, 2)) + "%" \ - if reporting_period_data['minimums_increment_rate'][i] is not None else '0.00%' - ws['E' + str(row + 1)].border = f_border + 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['minimums_increment_rate'][i] * 100, 2)) + "%" \ + if reporting_period_data['minimums_increment_rate'][i] is not None else '0.00%' + ws['E' + str(row + 1)].border = f_border - ws['F' + str(row)].font = name_font - ws['F' + str(row)].alignment = c_c_alignment - ws['F' + str(row)] = round(reporting_period_data['maximums'][i], 2) \ - if reporting_period_data['maximums'][i] is not None else '' - ws['F' + str(row)].border = f_border - ws['F' + str(row)].number_format = '0.00' + ws['F' + str(row)].font = name_font + ws['F' + str(row)].alignment = c_c_alignment + ws['F' + str(row)] = round(reporting_period_data['maximums'][i], 2) \ + if reporting_period_data['maximums'][i] is not None else '' + ws['F' + str(row)].border = f_border + ws['F' + str(row)].number_format = '0.00' - ws['F' + str(row + 1)].font = name_font - ws['F' + str(row + 1)].alignment = c_c_alignment - ws['F' + 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['F' + str(row + 1)].border = f_border + ws['F' + str(row + 1)].font = name_font + ws['F' + str(row + 1)].alignment = c_c_alignment + ws['F' + 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['F' + str(row + 1)].border = f_border - ws['G' + str(row)].font = name_font - ws['G' + str(row)].alignment = c_c_alignment - ws['G' + str(row)] = round(reporting_period_data['stdevs'][i], 2) \ - if reporting_period_data['stdevs'][i] is not None else '' - ws['G' + str(row)].border = f_border - ws['G' + str(row)].number_format = '0.00' + ws['G' + str(row)].font = name_font + ws['G' + str(row)].alignment = c_c_alignment + ws['G' + str(row)] = round(reporting_period_data['stdevs'][i], 2) \ + if reporting_period_data['stdevs'][i] is not None else '' + ws['G' + str(row)].border = f_border + ws['G' + str(row)].number_format = '0.00' - ws['G' + str(row + 1)].font = name_font - ws['G' + str(row + 1)].alignment = c_c_alignment - ws['G' + str(row + 1)] = str(round(reporting_period_data['stdevs_increment_rate'][i] * 100, 2)) + "%" \ - if reporting_period_data['stdevs_increment_rate'][i] is not None else '0.00%' - ws['G' + str(row + 1)].border = f_border + ws['G' + str(row + 1)].font = name_font + ws['G' + str(row + 1)].alignment = c_c_alignment + ws['G' + str(row + 1)] = str(round(reporting_period_data['stdevs_increment_rate'][i] * 100, 2)) + "%" \ + if reporting_period_data['stdevs_increment_rate'][i] is not None else '0.00%' + ws['G' + str(row + 1)].border = f_border - ws['H' + str(row)].font = name_font - ws['H' + str(row)].alignment = c_c_alignment - ws['H' + str(row)] = round(reporting_period_data['variances'][i], 2) \ - if reporting_period_data['variances'][i] is not None else '' - ws['H' + str(row)].border = f_border - ws['H' + str(row)].number_format = '0.00' + ws['H' + str(row)].font = name_font + ws['H' + str(row)].alignment = c_c_alignment + ws['H' + str(row)] = round(reporting_period_data['variances'][i], 2) \ + if reporting_period_data['variances'][i] is not None else '' + ws['H' + str(row)].border = f_border + ws['H' + str(row)].number_format = '0.00' - ws['H' + str(row + 1)].font = name_font - ws['H' + str(row + 1)].alignment = c_c_alignment - ws['H' + str(row + 1)] = str(round(reporting_period_data['variances_increment_rate'][i] * 100, 2)) + "%" \ - if reporting_period_data['variances_increment_rate'][i] is not None else '0.00%' - ws['H' + str(row + 1)].border = f_border + ws['H' + str(row + 1)].font = name_font + ws['H' + str(row + 1)].alignment = c_c_alignment + ws['H' + str(row + 1)] = str(round(reporting_period_data['variances_increment_rate'][i] * 100, 2)) + "%" \ + if reporting_period_data['variances_increment_rate'][i] is not None else '0.00%' + ws['H' + str(row + 1)].border = f_border #################################################################################################################### # Second: 报告期消耗 # 9 + ca_len * 2: title @@ -313,111 +303,110 @@ def generate_excel(report, # per_unit_area_start_row_number + 2 ~ per_unit_area_start_row_number + 2 + ca_len : table_data #################################################################################################################### - if has_energy_data_flag: - names = reporting_period_data['names'] - ca_len = len(names) + names = reporting_period_data['names'] + ca_len = len(names) - per_unit_area_start_row_number = 9 + ca_len * 2 + per_unit_area_start_row_number = 9 + ca_len * 2 - ws['B' + str(per_unit_area_start_row_number)].font = title_font - ws['B' + str(per_unit_area_start_row_number)] = name + ' 单位面积值' + str(report['store']['area']) + 'M²' + ws['B' + str(per_unit_area_start_row_number)].font = title_font + ws['B' + str(per_unit_area_start_row_number)] = name + ' 单位面积值' + str(report['store']['area']) + 'M²' - category = reporting_period_data['names'] + category = reporting_period_data['names'] - # table_title - ws['B' + str(per_unit_area_start_row_number + 1)].fill = table_fill - ws['B' + str(per_unit_area_start_row_number + 1)].font = title_font - ws['B' + str(per_unit_area_start_row_number + 1)].alignment = c_c_alignment - ws['B' + str(per_unit_area_start_row_number + 1)] = '报告期' - ws['B' + str(per_unit_area_start_row_number + 1)].border = f_border + # table_title + ws['B' + str(per_unit_area_start_row_number + 1)].fill = table_fill + ws['B' + str(per_unit_area_start_row_number + 1)].font = title_font + ws['B' + str(per_unit_area_start_row_number + 1)].alignment = c_c_alignment + ws['B' + str(per_unit_area_start_row_number + 1)] = '报告期' + ws['B' + str(per_unit_area_start_row_number + 1)].border = f_border - ws['C' + str(per_unit_area_start_row_number + 1)].font = title_font - ws['C' + str(per_unit_area_start_row_number + 1)].alignment = c_c_alignment - ws['C' + str(per_unit_area_start_row_number + 1)] = '算术平均数' - ws['C' + str(per_unit_area_start_row_number + 1)].border = f_border + ws['C' + str(per_unit_area_start_row_number + 1)].font = title_font + ws['C' + str(per_unit_area_start_row_number + 1)].alignment = c_c_alignment + ws['C' + str(per_unit_area_start_row_number + 1)] = '算术平均数' + ws['C' + str(per_unit_area_start_row_number + 1)].border = f_border - ws['D' + str(per_unit_area_start_row_number + 1)].font = title_font - ws['D' + str(per_unit_area_start_row_number + 1)].alignment = c_c_alignment - ws['D' + str(per_unit_area_start_row_number + 1)] = '中位数' - ws['D' + str(per_unit_area_start_row_number + 1)].border = f_border + ws['D' + str(per_unit_area_start_row_number + 1)].font = title_font + ws['D' + str(per_unit_area_start_row_number + 1)].alignment = c_c_alignment + ws['D' + str(per_unit_area_start_row_number + 1)] = '中位数' + ws['D' + str(per_unit_area_start_row_number + 1)].border = f_border - ws['E' + str(per_unit_area_start_row_number + 1)].font = title_font - ws['E' + str(per_unit_area_start_row_number + 1)].alignment = c_c_alignment - ws['E' + str(per_unit_area_start_row_number + 1)] = '最小值' - ws['E' + str(per_unit_area_start_row_number + 1)].border = f_border + ws['E' + str(per_unit_area_start_row_number + 1)].font = title_font + ws['E' + str(per_unit_area_start_row_number + 1)].alignment = c_c_alignment + ws['E' + str(per_unit_area_start_row_number + 1)] = '最小值' + ws['E' + str(per_unit_area_start_row_number + 1)].border = f_border - ws['F' + str(per_unit_area_start_row_number + 1)].font = title_font - ws['F' + str(per_unit_area_start_row_number + 1)].alignment = c_c_alignment - ws['F' + str(per_unit_area_start_row_number + 1)] = '最大值' - ws['F' + str(per_unit_area_start_row_number + 1)].border = f_border + ws['F' + str(per_unit_area_start_row_number + 1)].font = title_font + ws['F' + str(per_unit_area_start_row_number + 1)].alignment = c_c_alignment + ws['F' + str(per_unit_area_start_row_number + 1)] = '最大值' + ws['F' + str(per_unit_area_start_row_number + 1)].border = f_border - ws['G' + str(per_unit_area_start_row_number + 1)].font = title_font - ws['G' + str(per_unit_area_start_row_number + 1)].alignment = c_c_alignment - ws['G' + str(per_unit_area_start_row_number + 1)] = '样本标准差' - ws['G' + str(per_unit_area_start_row_number + 1)].border = f_border + ws['G' + str(per_unit_area_start_row_number + 1)].font = title_font + ws['G' + str(per_unit_area_start_row_number + 1)].alignment = c_c_alignment + ws['G' + str(per_unit_area_start_row_number + 1)] = '样本标准差' + ws['G' + str(per_unit_area_start_row_number + 1)].border = f_border - ws['H' + str(per_unit_area_start_row_number + 1)].font = title_font - ws['H' + str(per_unit_area_start_row_number + 1)].alignment = c_c_alignment - ws['H' + str(per_unit_area_start_row_number + 1)] = '样本方差' - ws['H' + str(per_unit_area_start_row_number + 1)].border = f_border + ws['H' + str(per_unit_area_start_row_number + 1)].font = title_font + ws['H' + str(per_unit_area_start_row_number + 1)].alignment = c_c_alignment + ws['H' + str(per_unit_area_start_row_number + 1)] = '样本方差' + ws['H' + str(per_unit_area_start_row_number + 1)].border = f_border - # table_data + # table_data - for i, value in enumerate(category): - row_data = per_unit_area_start_row_number + 2 + i - ws['B' + str(row_data)].font = name_font - ws['B' + str(row_data)].alignment = c_c_alignment - ws['B' + str(row_data)] = reporting_period_data['names'][i] + " (" + reporting_period_data['units'][ - i] + "/M²)" - ws['B' + str(row_data)].border = f_border + for i, value in enumerate(category): + row_data = per_unit_area_start_row_number + 2 + i + ws['B' + str(row_data)].font = name_font + ws['B' + str(row_data)].alignment = c_c_alignment + ws['B' + str(row_data)] = reporting_period_data['names'][i] + " (" + reporting_period_data['units'][ + i] + "/M²)" + ws['B' + str(row_data)].border = f_border - ws['C' + str(row_data)].font = name_font - ws['C' + str(row_data)].alignment = c_c_alignment - if reporting_period_data['means_per_unit_area'][i] \ - or reporting_period_data['means_per_unit_area'][i] == 0: - ws['C' + str(row_data)] = round(reporting_period_data['means_per_unit_area'][i], 2) - ws['C' + str(row_data)].border = f_border - ws['C' + str(row_data)].number_format = '0.00' + ws['C' + str(row_data)].font = name_font + ws['C' + str(row_data)].alignment = c_c_alignment + if reporting_period_data['means_per_unit_area'][i] \ + or reporting_period_data['means_per_unit_area'][i] == 0: + ws['C' + str(row_data)] = round(reporting_period_data['means_per_unit_area'][i], 2) + ws['C' + str(row_data)].border = f_border + ws['C' + str(row_data)].number_format = '0.00' - ws['D' + str(row_data)].font = name_font - ws['D' + str(row_data)].alignment = c_c_alignment - if reporting_period_data['medians_per_unit_area'][i] \ - or reporting_period_data['medians_per_unit_area'][i] == 0: - ws['D' + str(row_data)] = round(reporting_period_data['medians_per_unit_area'][i], 2) - ws['D' + str(row_data)].border = f_border - ws['D' + str(row_data)].number_format = '0.00' + ws['D' + str(row_data)].font = name_font + ws['D' + str(row_data)].alignment = c_c_alignment + if reporting_period_data['medians_per_unit_area'][i] \ + or reporting_period_data['medians_per_unit_area'][i] == 0: + ws['D' + str(row_data)] = round(reporting_period_data['medians_per_unit_area'][i], 2) + ws['D' + str(row_data)].border = f_border + ws['D' + str(row_data)].number_format = '0.00' - ws['E' + str(row_data)].font = name_font - ws['E' + str(row_data)].alignment = c_c_alignment - if reporting_period_data['minimums_per_unit_area'][i] \ - or reporting_period_data['minimums_per_unit_area'][i] == 0: - ws['E' + str(row_data)] = round(reporting_period_data['minimums_per_unit_area'][i], 2) - ws['E' + str(row_data)].border = f_border - ws['E' + str(row_data)].number_format = '0.00' + ws['E' + str(row_data)].font = name_font + ws['E' + str(row_data)].alignment = c_c_alignment + if reporting_period_data['minimums_per_unit_area'][i] \ + or reporting_period_data['minimums_per_unit_area'][i] == 0: + ws['E' + str(row_data)] = round(reporting_period_data['minimums_per_unit_area'][i], 2) + ws['E' + str(row_data)].border = f_border + ws['E' + str(row_data)].number_format = '0.00' - ws['F' + str(row_data)].font = name_font - ws['F' + str(row_data)].alignment = c_c_alignment - if reporting_period_data['maximums_per_unit_area'][i] \ - or reporting_period_data['maximums_per_unit_area'][i] == 0: - ws['F' + str(row_data)] = round(reporting_period_data['maximums_per_unit_area'][i], 2) - ws['F' + str(row_data)].border = f_border - ws['F' + str(row_data)].number_format = '0.00' + ws['F' + str(row_data)].font = name_font + ws['F' + str(row_data)].alignment = c_c_alignment + if reporting_period_data['maximums_per_unit_area'][i] \ + or reporting_period_data['maximums_per_unit_area'][i] == 0: + ws['F' + str(row_data)] = round(reporting_period_data['maximums_per_unit_area'][i], 2) + ws['F' + str(row_data)].border = f_border + ws['F' + str(row_data)].number_format = '0.00' - ws['G' + str(row_data)].font = name_font - ws['G' + str(row_data)].alignment = c_c_alignment - if (reporting_period_data['stdevs_per_unit_area'][i]) \ - or reporting_period_data['stdevs_per_unit_area'][i] == 0: - ws['G' + str(row_data)] = round(reporting_period_data['stdevs_per_unit_area'][i], 2) - ws['G' + str(row_data)].border = f_border - ws['G' + str(row_data)].number_format = '0.00' + ws['G' + str(row_data)].font = name_font + ws['G' + str(row_data)].alignment = c_c_alignment + if (reporting_period_data['stdevs_per_unit_area'][i]) \ + or reporting_period_data['stdevs_per_unit_area'][i] == 0: + ws['G' + str(row_data)] = round(reporting_period_data['stdevs_per_unit_area'][i], 2) + ws['G' + str(row_data)].border = f_border + ws['G' + str(row_data)].number_format = '0.00' - ws['H' + str(row_data)].font = name_font - ws['H' + str(row_data)].alignment = c_c_alignment - if reporting_period_data['variances_per_unit_area'][i] \ - or reporting_period_data['variances_per_unit_area'][i] == 0: - ws['H' + str(row_data)] = round(reporting_period_data['variances_per_unit_area'][i], 2) - ws['H' + str(row_data)].border = f_border - ws['H' + str(row_data)].number_format = '0.00' + ws['H' + str(row_data)].font = name_font + ws['H' + str(row_data)].alignment = c_c_alignment + if reporting_period_data['variances_per_unit_area'][i] \ + or reporting_period_data['variances_per_unit_area'][i] == 0: + ws['H' + str(row_data)] = round(reporting_period_data['variances_per_unit_area'][i], 2) + ws['H' + str(row_data)].border = f_border + ws['H' + str(row_data)].number_format = '0.00' #################################################################################################################### # Third: 详细数据 diff --git a/myems-api/excelexporters/tenantbatch.py b/myems-api/excelexporters/tenantbatch.py index 65430b3b..2b7aa8d1 100644 --- a/myems-api/excelexporters/tenantbatch.py +++ b/myems-api/excelexporters/tenantbatch.py @@ -1,7 +1,7 @@ import base64 import uuid import os -from openpyxl.styles import PatternFill, Border, Side, Alignment, Protection, Font +from openpyxl.styles import PatternFill, Border, Side, Alignment, Font from openpyxl.drawing.image import Image from openpyxl import Workbook diff --git a/myems-api/excelexporters/tenantbill.py b/myems-api/excelexporters/tenantbill.py index 87794946..9906730f 100644 --- a/myems-api/excelexporters/tenantbill.py +++ b/myems-api/excelexporters/tenantbill.py @@ -2,16 +2,10 @@ import base64 import uuid import os import datetime -from openpyxl.chart import ( - PieChart, - BarChart, - Reference, -) from openpyxl.styles import PatternFill, Border, Side, Alignment, Font from decimal import Decimal from openpyxl.drawing.image import Image from openpyxl import Workbook -from openpyxl.chart.label import DataLabelList ######################################################################################################################## @@ -115,9 +109,6 @@ def generate_excel(report, bottom=Side(border_style='medium', color='00000000'), top=Side(border_style='medium', color='00000000') ) - b_border = Border( - bottom=Side(border_style='medium', color='00000000'), - ) c_c_alignment = Alignment(vertical='center', horizontal='center', diff --git a/myems-api/excelexporters/tenantcost.py b/myems-api/excelexporters/tenantcost.py index 83baa0e3..748d9a2a 100644 --- a/myems-api/excelexporters/tenantcost.py +++ b/myems-api/excelexporters/tenantcost.py @@ -1,12 +1,7 @@ import base64 import uuid import os -from openpyxl.chart import ( - PieChart, - LineChart, - BarChart, - Reference, - ) +from openpyxl.chart import PieChart, LineChart, Reference from openpyxl.styles import PatternFill, Border, Side, Alignment, Font from openpyxl.drawing.image import Image from openpyxl import Workbook diff --git a/myems-api/excelexporters/tenantenergycategory.py b/myems-api/excelexporters/tenantenergycategory.py index af30eb05..145d1a97 100644 --- a/myems-api/excelexporters/tenantenergycategory.py +++ b/myems-api/excelexporters/tenantenergycategory.py @@ -1,12 +1,7 @@ import base64 import uuid import os -from openpyxl.chart import ( - PieChart, - LineChart, - BarChart, - Reference, - ) +from openpyxl.chart import PieChart, LineChart, Reference from openpyxl.styles import PatternFill, Border, Side, Alignment, Font from openpyxl.drawing.image import Image from openpyxl import Workbook diff --git a/myems-api/excelexporters/tenantenergyitem.py b/myems-api/excelexporters/tenantenergyitem.py index 34523cad..2f1f9cc5 100644 --- a/myems-api/excelexporters/tenantenergyitem.py +++ b/myems-api/excelexporters/tenantenergyitem.py @@ -1,12 +1,7 @@ import base64 import uuid import os -from openpyxl.chart import ( - PieChart, - LineChart, - BarChart, - Reference, -) +from openpyxl.chart import PieChart, LineChart, Reference from openpyxl.styles import PatternFill, Border, Side, Alignment, Font from openpyxl.drawing.image import Image from openpyxl import Workbook diff --git a/myems-api/excelexporters/tenantload.py b/myems-api/excelexporters/tenantload.py index 0cdbb565..0e0a2bb6 100644 --- a/myems-api/excelexporters/tenantload.py +++ b/myems-api/excelexporters/tenantload.py @@ -1,12 +1,7 @@ import base64 import uuid import os -from openpyxl.chart import ( - PieChart, - LineChart, - BarChart, - Reference, -) +from openpyxl.chart import LineChart, Reference from openpyxl.styles import PatternFill, Border, Side, Alignment, Font from openpyxl.drawing.image import Image from openpyxl import Workbook diff --git a/myems-api/excelexporters/tenantsaving.py b/myems-api/excelexporters/tenantsaving.py index fb14c98f..8dec3b28 100644 --- a/myems-api/excelexporters/tenantsaving.py +++ b/myems-api/excelexporters/tenantsaving.py @@ -1,12 +1,8 @@ import base64 import uuid import os -from openpyxl.chart import ( - LineChart, - PieChart, - BarChart, - Reference, -) +from decimal import Decimal +from openpyxl.chart import LineChart, PieChart, Reference from openpyxl.styles import PatternFill, Border, Side, Alignment, Font from openpyxl.drawing.image import Image from openpyxl import Workbook @@ -776,7 +772,7 @@ def generate_excel(report, def sum_list(lists): - total = 0 + total = Decimal(0) for i in range(0, len(lists)): total += lists[i] diff --git a/myems-api/excelexporters/tenantstatistics.py b/myems-api/excelexporters/tenantstatistics.py index 0fe3b89d..d110ab8e 100644 --- a/myems-api/excelexporters/tenantstatistics.py +++ b/myems-api/excelexporters/tenantstatistics.py @@ -1,10 +1,7 @@ import base64 import uuid import os -from openpyxl.chart import ( - LineChart, - Reference, -) +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 @@ -160,152 +157,146 @@ def generate_excel(report, #################################################################################################################### 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 + ' 统计分析' + ws['B6'].font = title_font + ws['B6'] = name + ' 统计分析' - category = reporting_period_data['names'] + 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 + # 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['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['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 + ws['E7'].font = title_font + ws['E7'].alignment = c_c_alignment + ws['E7'] = '最小值' + ws['E7'].border = f_border - ws['F7'].font = title_font - ws['F7'].alignment = c_c_alignment - ws['F7'] = '最大值' - ws['F7'].border = f_border + ws['F7'].font = title_font + ws['F7'].alignment = c_c_alignment + ws['F7'] = '最大值' + ws['F7'].border = f_border - ws['G7'].font = title_font - ws['G7'].alignment = c_c_alignment - ws['G7'] = '样本标准差' - ws['G7'].border = f_border + ws['G7'].font = title_font + ws['G7'].alignment = c_c_alignment + ws['G7'] = '样本标准差' + ws['G7'].border = f_border - ws['H7'].font = title_font - ws['H7'].alignment = c_c_alignment - ws['H7'] = '样本方差' - ws['H7'].border = f_border + ws['H7'].font = title_font + ws['H7'].alignment = c_c_alignment + ws['H7'] = '样本方差' + ws['H7'].border = f_border - # table_data + # 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] + " )" - ws['B' + str(row)].border = f_border + 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] + " )" + 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['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['means'][i], 2) \ - if reporting_period_data['means'][i] is not None else '' - ws['C' + str(row)].border = f_border - ws['C' + str(row)].number_format = '0.00' + ws['C' + str(row)].font = name_font + ws['C' + str(row)].alignment = c_c_alignment + ws['C' + str(row)] = round(reporting_period_data['means'][i], 2) \ + if reporting_period_data['means'][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['means_increment_rate'][i] * 100, 2)) + "%" \ - if reporting_period_data['means_increment_rate'][i] is not None else '0.00%' - ws['C' + str(row + 1)].border = f_border + 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['means_increment_rate'][i] * 100, 2)) + "%" \ + if reporting_period_data['means_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['medians'][i], 2) \ - if reporting_period_data['medians'][i] is not None else '' - ws['D' + str(row)].border = f_border - ws['D' + str(row)].number_format = '0.00' + ws['D' + str(row)].font = name_font + ws['D' + str(row)].alignment = c_c_alignment + ws['D' + str(row)] = round(reporting_period_data['medians'][i], 2) \ + if reporting_period_data['medians'][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['medians_increment_rate'][i] * 100, 2)) + "%" \ - if reporting_period_data['medians_increment_rate'][i] is not None else '0.00%' - ws['D' + str(row + 1)].border = f_border + 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['medians_increment_rate'][i] * 100, 2)) + "%" \ + if reporting_period_data['medians_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['minimums'][i], 2) \ - if reporting_period_data['minimums'][i] is not None else '' - ws['E' + str(row)].border = f_border - ws['E' + str(row)].number_format = '0.00' + ws['E' + str(row)].font = name_font + ws['E' + str(row)].alignment = c_c_alignment + ws['E' + str(row)] = round(reporting_period_data['minimums'][i], 2) \ + if reporting_period_data['minimums'][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['minimums_increment_rate'][i] * 100, 2)) + "%" \ - if reporting_period_data['minimums_increment_rate'][i] is not None else '0.00%' - ws['E' + str(row + 1)].border = f_border + 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['minimums_increment_rate'][i] * 100, 2)) + "%" \ + if reporting_period_data['minimums_increment_rate'][i] is not None else '0.00%' + ws['E' + str(row + 1)].border = f_border - ws['F' + str(row)].font = name_font - ws['F' + str(row)].alignment = c_c_alignment - ws['F' + str(row)] = round(reporting_period_data['maximums'][i], 2) \ - if reporting_period_data['maximums'][i] is not None else '' - ws['F' + str(row)].border = f_border - ws['F' + str(row)].number_format = '0.00' + ws['F' + str(row)].font = name_font + ws['F' + str(row)].alignment = c_c_alignment + ws['F' + str(row)] = round(reporting_period_data['maximums'][i], 2) \ + if reporting_period_data['maximums'][i] is not None else '' + ws['F' + str(row)].border = f_border + ws['F' + str(row)].number_format = '0.00' - ws['F' + str(row + 1)].font = name_font - ws['F' + str(row + 1)].alignment = c_c_alignment - ws['F' + 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['F' + str(row + 1)].border = f_border + ws['F' + str(row + 1)].font = name_font + ws['F' + str(row + 1)].alignment = c_c_alignment + ws['F' + 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['F' + str(row + 1)].border = f_border - ws['G' + str(row)].font = name_font - ws['G' + str(row)].alignment = c_c_alignment - ws['G' + str(row)] = round(reporting_period_data['stdevs'][i], 2) \ - if reporting_period_data['stdevs'][i] is not None else '' - ws['G' + str(row)].border = f_border - ws['G' + str(row)].number_format = '0.00' + ws['G' + str(row)].font = name_font + ws['G' + str(row)].alignment = c_c_alignment + ws['G' + str(row)] = round(reporting_period_data['stdevs'][i], 2) \ + if reporting_period_data['stdevs'][i] is not None else '' + ws['G' + str(row)].border = f_border + ws['G' + str(row)].number_format = '0.00' - ws['G' + str(row + 1)].font = name_font - ws['G' + str(row + 1)].alignment = c_c_alignment - ws['G' + str(row + 1)] = str(round(reporting_period_data['stdevs_increment_rate'][i] * 100, 2)) + "%" \ - if reporting_period_data['stdevs_increment_rate'][i] is not None else '0.00%' - ws['G' + str(row + 1)].border = f_border + ws['G' + str(row + 1)].font = name_font + ws['G' + str(row + 1)].alignment = c_c_alignment + ws['G' + str(row + 1)] = str(round(reporting_period_data['stdevs_increment_rate'][i] * 100, 2)) + "%" \ + if reporting_period_data['stdevs_increment_rate'][i] is not None else '0.00%' + ws['G' + str(row + 1)].border = f_border - ws['H' + str(row)].font = name_font - ws['H' + str(row)].alignment = c_c_alignment - ws['H' + str(row)] = round(reporting_period_data['variances'][i], 2) \ - if reporting_period_data['variances'][i] is not None else '' - ws['H' + str(row)].border = f_border - ws['H' + str(row)].number_format = '0.00' + ws['H' + str(row)].font = name_font + ws['H' + str(row)].alignment = c_c_alignment + ws['H' + str(row)] = round(reporting_period_data['variances'][i], 2) \ + if reporting_period_data['variances'][i] is not None else '' + ws['H' + str(row)].border = f_border + ws['H' + str(row)].number_format = '0.00' - ws['H' + str(row + 1)].font = name_font - ws['H' + str(row + 1)].alignment = c_c_alignment - ws['H' + str(row + 1)] = str(round(reporting_period_data['variances_increment_rate'][i] * 100, 2)) + "%" \ - if reporting_period_data['variances_increment_rate'][i] is not None else '0.00%' - ws['H' + str(row + 1)].border = f_border + ws['H' + str(row + 1)].font = name_font + ws['H' + str(row + 1)].alignment = c_c_alignment + ws['H' + str(row + 1)] = str(round(reporting_period_data['variances_increment_rate'][i] * 100, 2)) + "%" \ + if reporting_period_data['variances_increment_rate'][i] is not None else '0.00%' + ws['H' + str(row + 1)].border = f_border #################################################################################################################### # Second: 报告期消耗 # 9 + ca_len * 2: title @@ -313,111 +304,110 @@ def generate_excel(report, # per_unit_area_start_row_number + 2 ~ per_unit_area_start_row_number + 2 + ca_len : table_data #################################################################################################################### - if has_energy_data_flag: - names = reporting_period_data['names'] - ca_len = len(names) + names = reporting_period_data['names'] + ca_len = len(names) - per_unit_area_start_row_number = 9 + ca_len * 2 + per_unit_area_start_row_number = 9 + ca_len * 2 - ws['B' + str(per_unit_area_start_row_number)].font = title_font - ws['B' + str(per_unit_area_start_row_number)] = name + ' 单位面积值' + str(report['tenant']['area']) + 'M²' + ws['B' + str(per_unit_area_start_row_number)].font = title_font + ws['B' + str(per_unit_area_start_row_number)] = name + ' 单位面积值' + str(report['tenant']['area']) + 'M²' - category = reporting_period_data['names'] + category = reporting_period_data['names'] - # table_title - ws['B' + str(per_unit_area_start_row_number + 1)].fill = table_fill - ws['B' + str(per_unit_area_start_row_number + 1)].font = title_font - ws['B' + str(per_unit_area_start_row_number + 1)].alignment = c_c_alignment - ws['B' + str(per_unit_area_start_row_number + 1)] = '报告期' - ws['B' + str(per_unit_area_start_row_number + 1)].border = f_border + # table_title + ws['B' + str(per_unit_area_start_row_number + 1)].fill = table_fill + ws['B' + str(per_unit_area_start_row_number + 1)].font = title_font + ws['B' + str(per_unit_area_start_row_number + 1)].alignment = c_c_alignment + ws['B' + str(per_unit_area_start_row_number + 1)] = '报告期' + ws['B' + str(per_unit_area_start_row_number + 1)].border = f_border - ws['C' + str(per_unit_area_start_row_number + 1)].font = title_font - ws['C' + str(per_unit_area_start_row_number + 1)].alignment = c_c_alignment - ws['C' + str(per_unit_area_start_row_number + 1)] = '算术平均数' - ws['C' + str(per_unit_area_start_row_number + 1)].border = f_border + ws['C' + str(per_unit_area_start_row_number + 1)].font = title_font + ws['C' + str(per_unit_area_start_row_number + 1)].alignment = c_c_alignment + ws['C' + str(per_unit_area_start_row_number + 1)] = '算术平均数' + ws['C' + str(per_unit_area_start_row_number + 1)].border = f_border - ws['D' + str(per_unit_area_start_row_number + 1)].font = title_font - ws['D' + str(per_unit_area_start_row_number + 1)].alignment = c_c_alignment - ws['D' + str(per_unit_area_start_row_number + 1)] = '中位数' - ws['D' + str(per_unit_area_start_row_number + 1)].border = f_border + ws['D' + str(per_unit_area_start_row_number + 1)].font = title_font + ws['D' + str(per_unit_area_start_row_number + 1)].alignment = c_c_alignment + ws['D' + str(per_unit_area_start_row_number + 1)] = '中位数' + ws['D' + str(per_unit_area_start_row_number + 1)].border = f_border - ws['E' + str(per_unit_area_start_row_number + 1)].font = title_font - ws['E' + str(per_unit_area_start_row_number + 1)].alignment = c_c_alignment - ws['E' + str(per_unit_area_start_row_number + 1)] = '最小值' - ws['E' + str(per_unit_area_start_row_number + 1)].border = f_border + ws['E' + str(per_unit_area_start_row_number + 1)].font = title_font + ws['E' + str(per_unit_area_start_row_number + 1)].alignment = c_c_alignment + ws['E' + str(per_unit_area_start_row_number + 1)] = '最小值' + ws['E' + str(per_unit_area_start_row_number + 1)].border = f_border - ws['F' + str(per_unit_area_start_row_number + 1)].font = title_font - ws['F' + str(per_unit_area_start_row_number + 1)].alignment = c_c_alignment - ws['F' + str(per_unit_area_start_row_number + 1)] = '最大值' - ws['F' + str(per_unit_area_start_row_number + 1)].border = f_border + ws['F' + str(per_unit_area_start_row_number + 1)].font = title_font + ws['F' + str(per_unit_area_start_row_number + 1)].alignment = c_c_alignment + ws['F' + str(per_unit_area_start_row_number + 1)] = '最大值' + ws['F' + str(per_unit_area_start_row_number + 1)].border = f_border - ws['G' + str(per_unit_area_start_row_number + 1)].font = title_font - ws['G' + str(per_unit_area_start_row_number + 1)].alignment = c_c_alignment - ws['G' + str(per_unit_area_start_row_number + 1)] = '样本标准差' - ws['G' + str(per_unit_area_start_row_number + 1)].border = f_border + ws['G' + str(per_unit_area_start_row_number + 1)].font = title_font + ws['G' + str(per_unit_area_start_row_number + 1)].alignment = c_c_alignment + ws['G' + str(per_unit_area_start_row_number + 1)] = '样本标准差' + ws['G' + str(per_unit_area_start_row_number + 1)].border = f_border - ws['H' + str(per_unit_area_start_row_number + 1)].font = title_font - ws['H' + str(per_unit_area_start_row_number + 1)].alignment = c_c_alignment - ws['H' + str(per_unit_area_start_row_number + 1)] = '样本方差' - ws['H' + str(per_unit_area_start_row_number + 1)].border = f_border + ws['H' + str(per_unit_area_start_row_number + 1)].font = title_font + ws['H' + str(per_unit_area_start_row_number + 1)].alignment = c_c_alignment + ws['H' + str(per_unit_area_start_row_number + 1)] = '样本方差' + ws['H' + str(per_unit_area_start_row_number + 1)].border = f_border - # table_data + # table_data - for i, value in enumerate(category): - row_data = per_unit_area_start_row_number + 2 + i - ws['B' + str(row_data)].font = name_font - ws['B' + str(row_data)].alignment = c_c_alignment - ws['B' + str(row_data)] = reporting_period_data['names'][i] + " (" + reporting_period_data['units'][ - i] + "/M²)" - ws['B' + str(row_data)].border = f_border + for i, value in enumerate(category): + row_data = per_unit_area_start_row_number + 2 + i + ws['B' + str(row_data)].font = name_font + ws['B' + str(row_data)].alignment = c_c_alignment + ws['B' + str(row_data)] = reporting_period_data['names'][i] + " (" + reporting_period_data['units'][ + i] + "/M²)" + ws['B' + str(row_data)].border = f_border - ws['C' + str(row_data)].font = name_font - ws['C' + str(row_data)].alignment = c_c_alignment - if reporting_period_data['means_per_unit_area'][i] \ - or reporting_period_data['means_per_unit_area'][i] == 0: - ws['C' + str(row_data)] = round(reporting_period_data['means_per_unit_area'][i], 2) - ws['C' + str(row_data)].border = f_border - ws['C' + str(row_data)].number_format = '0.00' + ws['C' + str(row_data)].font = name_font + ws['C' + str(row_data)].alignment = c_c_alignment + if reporting_period_data['means_per_unit_area'][i] \ + or reporting_period_data['means_per_unit_area'][i] == 0: + ws['C' + str(row_data)] = round(reporting_period_data['means_per_unit_area'][i], 2) + ws['C' + str(row_data)].border = f_border + ws['C' + str(row_data)].number_format = '0.00' - ws['D' + str(row_data)].font = name_font - ws['D' + str(row_data)].alignment = c_c_alignment - if reporting_period_data['medians_per_unit_area'][i] \ - or reporting_period_data['medians_per_unit_area'][i] == 0: - ws['D' + str(row_data)] = round(reporting_period_data['medians_per_unit_area'][i], 2) - ws['D' + str(row_data)].border = f_border - ws['D' + str(row_data)].number_format = '0.00' + ws['D' + str(row_data)].font = name_font + ws['D' + str(row_data)].alignment = c_c_alignment + if reporting_period_data['medians_per_unit_area'][i] \ + or reporting_period_data['medians_per_unit_area'][i] == 0: + ws['D' + str(row_data)] = round(reporting_period_data['medians_per_unit_area'][i], 2) + ws['D' + str(row_data)].border = f_border + ws['D' + str(row_data)].number_format = '0.00' - ws['E' + str(row_data)].font = name_font - ws['E' + str(row_data)].alignment = c_c_alignment - if reporting_period_data['minimums_per_unit_area'][i] \ - or reporting_period_data['minimums_per_unit_area'][i] == 0: - ws['E' + str(row_data)] = round(reporting_period_data['minimums_per_unit_area'][i], 2) - ws['E' + str(row_data)].border = f_border - ws['E' + str(row_data)].number_format = '0.00' + ws['E' + str(row_data)].font = name_font + ws['E' + str(row_data)].alignment = c_c_alignment + if reporting_period_data['minimums_per_unit_area'][i] \ + or reporting_period_data['minimums_per_unit_area'][i] == 0: + ws['E' + str(row_data)] = round(reporting_period_data['minimums_per_unit_area'][i], 2) + ws['E' + str(row_data)].border = f_border + ws['E' + str(row_data)].number_format = '0.00' - ws['F' + str(row_data)].font = name_font - ws['F' + str(row_data)].alignment = c_c_alignment - if reporting_period_data['maximums_per_unit_area'][i] \ - or reporting_period_data['maximums_per_unit_area'][i] == 0: - ws['F' + str(row_data)] = round(reporting_period_data['maximums_per_unit_area'][i], 2) - ws['F' + str(row_data)].border = f_border - ws['F' + str(row_data)].number_format = '0.00' + ws['F' + str(row_data)].font = name_font + ws['F' + str(row_data)].alignment = c_c_alignment + if reporting_period_data['maximums_per_unit_area'][i] \ + or reporting_period_data['maximums_per_unit_area'][i] == 0: + ws['F' + str(row_data)] = round(reporting_period_data['maximums_per_unit_area'][i], 2) + ws['F' + str(row_data)].border = f_border + ws['F' + str(row_data)].number_format = '0.00' - ws['G' + str(row_data)].font = name_font - ws['G' + str(row_data)].alignment = c_c_alignment - if (reporting_period_data['stdevs_per_unit_area'][i]) \ - or reporting_period_data['stdevs_per_unit_area'][i] == 0: - ws['G' + str(row_data)] = round(reporting_period_data['stdevs_per_unit_area'][i], 2) - ws['G' + str(row_data)].border = f_border - ws['G' + str(row_data)].number_format = '0.00' + ws['G' + str(row_data)].font = name_font + ws['G' + str(row_data)].alignment = c_c_alignment + if (reporting_period_data['stdevs_per_unit_area'][i]) \ + or reporting_period_data['stdevs_per_unit_area'][i] == 0: + ws['G' + str(row_data)] = round(reporting_period_data['stdevs_per_unit_area'][i], 2) + ws['G' + str(row_data)].border = f_border + ws['G' + str(row_data)].number_format = '0.00' - ws['H' + str(row_data)].font = name_font - ws['H' + str(row_data)].alignment = c_c_alignment - if reporting_period_data['variances_per_unit_area'][i] \ - or reporting_period_data['variances_per_unit_area'][i] == 0: - ws['H' + str(row_data)] = round(reporting_period_data['variances_per_unit_area'][i], 2) - ws['H' + str(row_data)].border = f_border - ws['H' + str(row_data)].number_format = '0.00' + ws['H' + str(row_data)].font = name_font + ws['H' + str(row_data)].alignment = c_c_alignment + if reporting_period_data['variances_per_unit_area'][i] \ + or reporting_period_data['variances_per_unit_area'][i] == 0: + ws['H' + str(row_data)] = round(reporting_period_data['variances_per_unit_area'][i], 2) + ws['H' + str(row_data)].border = f_border + ws['H' + str(row_data)].number_format = '0.00' #################################################################################################################### # Third: 详细数据 diff --git a/myems-api/excelexporters/virtualmetercost.py b/myems-api/excelexporters/virtualmetercost.py index 65962fd3..21194d60 100644 --- a/myems-api/excelexporters/virtualmetercost.py +++ b/myems-api/excelexporters/virtualmetercost.py @@ -1,12 +1,7 @@ import base64 import uuid import os -from openpyxl.chart import ( - LineChart, - BarChart, - Reference, - Series -) +from openpyxl.chart import LineChart, Reference, Series from openpyxl.styles import PatternFill, Border, Side, Alignment, Font from openpyxl.drawing.image import Image from openpyxl import Workbook diff --git a/myems-api/excelexporters/virtualmeterenergy.py b/myems-api/excelexporters/virtualmeterenergy.py index cab86ef2..15ec3269 100644 --- a/myems-api/excelexporters/virtualmeterenergy.py +++ b/myems-api/excelexporters/virtualmeterenergy.py @@ -1,14 +1,8 @@ import base64 import os import uuid - from openpyxl import Workbook -from openpyxl.chart import ( - LineChart, - BarChart, - Reference, - Series, -) +from openpyxl.chart import LineChart, Reference, Series from openpyxl.chart.label import DataLabelList from openpyxl.drawing.image import Image from openpyxl.styles import PatternFill, Border, Side, Alignment, Font From 9c4c65ad1471ebe075c77a9fa12ac953d45b205d Mon Sep 17 00:00:00 2001 From: "13621160019@163.com" <13621160019@163.com> Date: Thu, 5 Aug 2021 19:26:47 +0800 Subject: [PATCH 6/8] deleted unnecessary words in translantions of Admin UI --- admin/app/translations.js | 434 +------------------------------------- 1 file changed, 3 insertions(+), 431 deletions(-) diff --git a/admin/app/translations.js b/admin/app/translations.js index 680c90bd..84e99af0 100644 --- a/admin/app/translations.js +++ b/admin/app/translations.js @@ -9,7 +9,6 @@ function config($translateProvider) { MY_EMS_NAME: 'MyEMS', LANGUAGE: 'Language', FULLSCREEN: 'Full Screen', - ENTER_SYSTEM: 'Enter System', EXITFULLSCREEN: 'Exit Full Screen', LOGOUT: 'Logout', COMMON: { @@ -25,42 +24,7 @@ function config($translateProvider) { SENSOR: 'Sensor', ENERGY_FLOW_DIAGRAM: 'Energy Flow Diagram', MENU: 'Menu', - PERIOD: { - LABEL: 'Date period', - YEAR: 'Year', - MONTH: 'Month', - DAY: 'Day', - HOUR: 'Hour', - }, DATE: 'Date Range', - ANALYSIS: { - LABEL: 'Analysis Type', - ENERGY: 'Energy', - COST: 'Cost' - }, - ENERGYFLOW: { - LABEL: 'Energy Flow Type', - INCOME: 'Input', - OUTPUT: 'Output' - }, - COMPARE: { - LABEL: 'Compare Type', - TREND: 'Trend', - COMPARE: 'Compare', - }, - STATISTICS: { - LABEL: 'EnPI Type', - COMMON: 'Common', - KEYDEVICE: 'Equipment Attribute', - WORKINGDAY: 'Working Day', - STATUS: 'Equipment Status', - CPU: 'CPU' - }, - CHARTTYPE: { - LABEL: 'Chart Type', - COLUMN: 'Column', - LINE: 'Line' - }, TARIFF: { TOPPEAK: 'Top-peak', ONPEAK: 'On-peak', @@ -68,18 +32,6 @@ function config($translateProvider) { MIDPEAK: 'Mid-peak' } }, - REPORT: { - REPORT: 'Report', - REPORT_LIST: 'Report List', - CREATE_TIME: 'Create Time', - FILE_NAME: 'File Name', - TABLE: { - ENERGYDATA: 'Detailed Data', - TIME: 'Time', - HOUR: 'Hour', - TOTAL: 'Total' - } - }, FDD: { ID: 'ID', RULE: 'Rule', @@ -87,7 +39,6 @@ function config($translateProvider) { TEXT_MESSAGE: 'Text Message', WEB_MESSAGE: 'Web Message', WECHAT_MESSAGE: 'Wechat Message', - RECIPIENT: 'Recipient', ALARM_LIST: 'Alarm List', RULE_LIST: 'Rule List', @@ -203,9 +154,6 @@ function config($translateProvider) { ADD_TARIFF: 'Add Tariff', ADD_CATEGORY: 'Add Energy Category', ADD_ENERGY_ITEM: 'Add Energy Item', - ADD_TARIFF: 'Add Tariff', - ADD_EMAIL_RECIPIENT: 'Add Recipient', - ADD_SMS_RECIPIENT: 'Add Recipient', ADD_CONTACT: 'Add Contact', ADD_EMAIL_SERVER: 'Add Email Server', ADD_GSM_MODEM: 'Add GSM Modem', @@ -221,8 +169,6 @@ function config($translateProvider) { EDIT_TARIFF: 'Edit Tariff', EDIT_CATEGORY: 'Edit Energy Category', EDIT_TARIFF: 'Edit Tariff', - EDIT_EMAIL_RECIPIENT: 'Edit Recipient', - EDIT_SMS_RECIPIENT: 'Edit Recipient', EDIT_CONTACT: 'Edit Contact', EDIT_EMAIL_SERVER: 'Edit Email Server', EDIT_GSM_MODEM: 'Edit GSM Modem', @@ -242,17 +188,14 @@ function config($translateProvider) { BIND_POINT: 'Point Point', BIND_SENSOR: 'Bind Sensor', BIND_TARIFF: 'Point Tariff', - PHONE_ID_FORMAT: 'Please Add The Country Code:0086+Phone Number', INPUT_NAME: 'Please Input Name', INPUT_AREA: 'Please Input Area', INPUT_UNIT: 'Please Input Unit', INPUT_CONTACT: 'Please Input Contact', INPUT_EXPRESSION: 'Please Input Expression', - INPUT_SERIAL_NUMBER: 'Please Input Serial Number', INPUT_KGCE: 'Please Input KGCE', INPUT_KGCO2E: 'Please Input KGCO2E', - INPUT_TAG: 'Please Input Tag', INPUT_HOST: 'Please Input Host', INPUT_PORT: 'Please Input Port', INPUT_USER_NAME: 'Please Input User Name', @@ -265,7 +208,6 @@ function config($translateProvider) { INVALID_FROM_ADDR: 'Invalid From Addr', INVALID_BAUD_RATE: 'Invalid Baud Rate', NOT_NULLABLE: 'Please Input Required', - MASTER_METER: 'Master Meter', METER: 'Meter', VIRTUAL_METER: 'Virtual Meter', OFFLINE_METER: 'Offline Meter', @@ -279,7 +221,6 @@ function config($translateProvider) { SENSOR_LIST: 'Sensor List', METER_TYPE: 'Meter Type', METER_NAME: 'Meter Name', - METER_STATUS: 'Meter Status', TRASH: 'Trash', DRAG_TO_BIND: 'Drag to left to bind', DRAG_TO_UNBIND: 'Drag to trash to unbind', @@ -289,7 +230,6 @@ function config($translateProvider) { AREA: 'Area', UNIT: 'Unit', CONTACT: 'Contact', - ENERGY_SYSTEM_CONTACT: 'Energy System Contact', TIMEZONE: 'Timezone', TARIFF: 'Tariff', @@ -298,11 +238,6 @@ function config($translateProvider) { ENERGY_ITEM: 'Energy Item', STATUS: 'Status', UPLOAD_TIME: 'Uploaded Time', - SERIAL_NUMBER: 'Serial Number', - COEF: 'Coef', - TAG: 'Tag', - BASELINE_CPU: 'CPU Baseline', - BASELINE_COST: 'Cost Baseline', EXPRESSION: 'Expression', VARIABLE_NAME: 'Variable Name', POINT: 'Point', @@ -322,30 +257,17 @@ function config($translateProvider) { START_AMOUNT: 'Start Amount', END_AMOUNT: 'End Amount', - GSM: 'GSM', - SMS: 'SMS', PORT: 'Port', + SMS: 'SMS', SERIAL_PORT: 'Serial Port', BAUD_RATE: 'Baud Rate', FROM_ADDR: 'From Address', HOST: 'Host', USER_NAME: 'User Name', - SUSPENDED: 'Suspended', - IDLING: 'Idling', - RUNNING: 'Running', - SROSS: 'shutdown rate of standard status on non-working days', - USER: 'User', - TEAM: 'Team', - ADD_TEAM: 'Add Team', - EDIT_TEAM: 'Edit Team', SEARCH: 'Search...', - METER_DATA: 'Meter Data', - START_ENERGY: 'Start Energy Value', - END_ENERGY: 'End Energy Value', - DIFF_VALUE: 'Diff Value', RESTORE: 'Restore', RESTORE_SUCCESS: 'Restore Success', @@ -411,7 +333,6 @@ function config($translateProvider) { LAST_SEEN_DATETIME: 'Last Seen Datetime', INPUT_PROTOCOL: 'Please Input Protocol', INPUT_CONNECTION: 'Please Input Connection', - }, POINT: { OBJECT_TYPE: 'Object Type', @@ -634,9 +555,7 @@ function config($translateProvider) { }, TOASTER: { FAILURE_TITLE: 'Error', - FAILURE: 'Failure', ERROR: 'error', - OPTIONS_ERROR: 'Options Error', SUCCESS: 'success', SUCCESS_TITLE: 'Success', LOGIN_SUCCESS: 'Login Success.', @@ -701,7 +620,6 @@ function config($translateProvider) { STORE_AND_OFFLINE_METER_RELATIONSHIP_NOT_FOUND: 'Store and Offline Meter Relationship Not Found', STORE_AND_VIRTUAL_METER_RELATIONSHIP_NOT_FOUND: 'Store and Virtual Meter Relationship Not Found', ASSOCIATED_POINTS_NOT_FOUND: 'Associated Points Not Found', - COMPLEX_NOT_FOUND: 'Complex Not Found', COST_CENTER_NOT_FOUND: 'Cost Center Not Found', COST_CENTER_EXTERNAL_ID_EXISTS: 'Cost Center External ID exists', COST_CENTER_NAME_EXISTS: 'Cost Center name exists', @@ -728,10 +646,6 @@ function config($translateProvider) { SPACE_ALREADY_ASSOCIATED_WITH_METER: 'Space already Associated with Meter', SPACE_ALREADY_ASSOCIATED_WITH_OFFLINE_METER: 'Space already Associated with Offline Meter', SPACE_ALREADY_ASSOCIATED_WITH_VIRTUAL_METER: 'Space already Associated with Virtual Meter', - SPACE_AND_METER_RELATIONSHIP_NOT_FOUND: 'Space and Meter Relationship Not Found', - SPACE_AND_OFFLINE_METER_RELATIONSHIP_NOT_FOUND: 'Space and Offline Meter Relationship Not Found', - SPACE_AND_VIRTUAL_METER_RELATIONSHIP_NOT_FOUND: 'Space and Virtual Meter Relationship Not Found', - GSM_CONFIG_NOT_FOUND: 'GSM Config Not Found', KNOWLEDGE_FILE_NOT_FOUND: 'Knowledge File Not Found', INVALID_: 'Invalid ', INVALID_TENANT_ID: 'Invalid Tenant ID', @@ -742,23 +656,15 @@ function config($translateProvider) { INVALID_DATA_SOURCE_ID: 'Invalid Data Source ID', INVALID_DATA_SOURCE_NAME: 'Invalid Data Source Name', INVALID_DATA_SOURCE_PROTOCOL: 'Invalid Data Source Protocol.', - // INVALID_DATE_(EXPECTED_FORMAT:_YYYY-MM-DD): 'Invalid Date (expected format: YYYY-MM-DD', - INVALID_DATE: 'Invalid Date (expected format: YYYY-MM-DD)', - INVALID_DATETIME_DATA: 'Invalid Datetime Data', INVALID_EMAIL_MESSAGE_ID: 'Invalid Email Message ID', - INVALID_EMAIL_RECIPIENT_ID: 'Invalid Email Recipient ID', INVALID_ENERGY_CATEGORY_ID: 'Invalid Energy Category ID', INVALID_EQUIPMENT_ID: 'Invalid Equipment ID', INVALID_COMBINED_EQUIPMENT_ID: 'Invalid Combined Equipment ID', INVALID_SPACE_ID: 'Invalid Space ID', - INVALID_GSM_CONFIG_ID: 'Invalid GSM Config ID', INVALID_KNOWLEDGE_FILE_ID: 'Invalid Knowledge File ID', - INVALID_ID: 'Invalid ID', - INVALID_MESSAGE_ID: 'Invalid Message ID', INVALID_METER_ID: 'Invalid Meter ID', INVALID_METER_UUID: 'Invalid Meter UUID', INVALID_COST_FILE_ID: 'Invalid Cost File ID', - INVALID_OFFLINE_METER_FILE__ID: 'Invalid Offline Meter File ID', INVALID_OFFLINE_METER_FILE_ID: 'Invalid Offline Meter File ID', INVALID_OFFLINE_METER_ID: 'Invalid Offline Meter ID', INVALID_PART_ID: 'Invalid Part ID', @@ -766,7 +672,6 @@ function config($translateProvider) { INVALID_POINT_ID: 'Invalid Point ID', INVALID_PRIVILEGE_ID_: 'Invalid Privilege ID ', INVALID_PRIVILEGE_ID: 'Invalid Privilege ID', - INVALID_PRIVILEGE_TO_RESET_PASSWORD: 'Invalid Privilege to Reset Password', INVALID_PRODUCT_ID: 'Invalid Product ID', INVALID_PRODUCT_SHIFT_ID: 'Invalid Product Shift ID', INVALID_RULE_ID: 'Invalid Rule ID', @@ -784,36 +689,14 @@ function config($translateProvider) { INVALID_VIRTUAL_METER_ID: 'Invalid Virtual Meter ID', INVALID_VIRTUAL_METER_NAME: 'Invalid Virtual Meter Name', INVALID_WEB_MESSAGE_ID: 'Invalid Web Message ID', - INVALID_COOKIES_PLEASE_RE_LOGIN: 'Invalid cookies, Please Re-Login', INVALID_EMAIL: 'Invalid email', - INVALID_EMS_CONTACT_EMAIL_VALUE: 'Invalid ems_contact_email value', - INVALID_EMS_CONTACT_NAME_VALUE: 'Invalid ems_contact_name value', - INVALID_EMS_CONTACT_PHONE_VALUE: 'Invalid ems_contact_phone value', - INVALID_END_DATE_TIME: 'Invalid end date(full expected format: YYYY-MM-DDTHH:MM:SS)', - INVALID_END_DATE_TIME_YMD: 'Invalid end date time (expected format: YYYY-MM-DD)', - INVALID_END_DATE_TIME_YMDHMS: 'Invalid end date time (expected format: YYYY-MM-DDTHH:MM:SS)', INVALID_EQUATION_IN_EXPRESSION: 'Invalid equation in expression', INVALID_EXPRESSION_OBJECT: 'Invalid expression object', - INVALID_EXTERNAL_ID_VALUE: 'Invalid External ID value', INVALID_IS_COUNTED_VALUE: 'Invalid is_counted value', - INVALID_IS_EQUIPMENT_STATUS_COUNTED_VALUE: 'Invalid is_equipment_status_counted value', - INVALID_IS_COMBINED_EQUIPMENT_STATUS_COUNTED_VALUE: 'Invalid is_combined_equipment_status_counted value', INVALID_IS_OUTPUT_VALUE: 'Invalid is_output value', INVALID_IS_OUTPUT_COUNTED_VALUE: 'Invalid is_output_counted value', - INVALID_IS_PRODUCT_COUNTED_VALUE: 'Invalid is_product_counted value', INVALID_PARTS_PER_HOUR_VALUE: 'Invalid parts_per_hour value', INVALID_PASSWORD: 'Invalid password', - INVALID_PERIOD: 'Invalid period', - INVALID_PERIOD_FORMAT: 'Invalid period (expected \'year\', \'month\', \'day\' or \'hour\')', - INVALID_PRIVILEGES_VALUE: 'Invalid privileges value', - INVALID_PRODUCTID_ID: 'Invalid productid ID', - INVALID_SERIAL_NUMBER_VALUE: 'Invalid serial_number value', - INVALID_START_DATE_TIME: 'Invalid start date time (full expected format: YYYY-MM-DDTHH:MM:SS)', - INVALID_START_DATE_TIME_YMD: 'Invalid start date time (expected format: YYYY-MM-DD)', - INVALID_START_DATE_TIME_YMDHMS: 'Invalid start date time (expected format: YYYY-MM-DDTHH:MM:SS)', - INVALID_SUSPENDED_VALUE: 'Invalid suspended value', - INVALID_USE_LIFE_END_VALUE: 'Invalid use_life_end value', - INVALID_USE_LIFE_START_VALUE: 'Invalid use_life_start value', INVALID_VARIABLE_METER_ID: 'Invalid variable meter id', INVALID_VARIABLE_METER_TYPE: 'Invalid variable meter type', INVALID_VARIABLE_NAME: 'Invalid variable name', @@ -827,69 +710,44 @@ function config($translateProvider) { LINE_AND_OFFLINE_METER_RELATIONSHIP_NOT_FOUND: 'Line and Offline Meter Relationship Not Found', LINE_AND_VIRTUAL_METER_RELATIONSHIP_NOT_FOUND: 'Line and Virtual Meter Relationship Not Found', METER_NOT_FOUND: 'Meter Not Found', - METER_POINT_RELATIONSHIP_EXISTED: 'Meter Point Relationship Existed', - METER_POINT_RELATIONSHIP_NOT_FOUND: 'Meter Point Relationship Not Found', METER_OF_VARIABLE_NOT_FOUND: 'Meter of Variable Not Found', COST_FILE_NOT_FOUND: 'Cost File Not Found', OFFLINE_METER_FILE_NOT_FOUND: 'Offline Meter File Not Found', OFFLINE_METER_NOT_FOUND: 'Offline Meter Not Found', OFFLINE_METER_OF_VARIABLE_NOT_FOUND: 'Offline Meter of Variable Not Found', - PLEASE_RE_LOGIN: 'Please Re-Login', POINT_NOT_FOUND: 'Point Not Found', PRIVILEGE_NOT_FOUND: 'Privilege Not Found', PRODUCT_NOT_FOUND: 'Product Not Found', PRODUCT_OUTPUT_NOT_FOUND: 'Product Output Not Found', PRODUCT_SHIFT_NOT_FOUND: 'Product Shift Not Found', RULE_NOT_FOUND: 'Rule Not Found', - SMS_RECIPIENT_NOT_FOUND: 'SMS Recipient Not Found', - START_DATE_SHOULD_BE_EARLY_THAN_END_DATE: 'Start date should be early than end date', START_DATETIME_SHOULD_BE_EARLY_THAN_END_DATETIME: 'Start datetime should be early than end datetime', TARIFF_IN_USE: 'Tariff In Use', TARIFF_NOT_EMPTY: 'Tariff Not Empty', TARIFF_NOT_FOUND: 'Tariff Not Found', - TARIFF_ALREADY_ASSOCIATED_WITH_COSTCENTER: 'Tariff already Associated with Cost Center', - TARIFF_ALREADY_ASSOCIATED_WITH_SPACE: 'Tariff already Associated with Space', TARIFF_IS_NOT_ASSOCIATED_WITH_COST_CENTER: 'Tariff is not associated with Cost Center', - TARIFF_IS_NOT_ASSOCIATED_WITH_SPACE: 'Tariff is not associated with Space', - POINT_ALREADY_ASSOCIATED_WITH_SPACE: 'Point already Associated with Space', - POINT_IS_NOT_ASSOCIATED_WITH_SPACE: 'Point is not associated with Space', - TEAM_NOT_FOUND: 'Team Not Found', TEXT_MESSAGE_NOT_FOUND: 'Text Message Not Found', - THERE_IS_RELATIONSHIP_WITH_TENANTS: 'There is relationship with Tenants', - THERE_IS_RELATIONSHIP_WITH_STORES: 'There is relationship with Stores', - THERE_IS_RELATIONSHIP_WITH_COMPANIES: 'There is relationship with companies', THERE_IS_RELATIONSHIP_WITH_EQUIPMENTS: 'There is relationship with equipments', - THERE_IS_RELATIONSHIP_WITH_COMBINED_EQUIPMENTS: 'There is relationship with combined equipments', THERE_IS_RELATIONSHIP_WITH_SPACES: 'There is relationship with spacees', THERE_IS_RELATIONSHIP_WITH_LINES: 'There is relationship with lines', - THERE_IS_RELATIONSHIP_WITH_METERS: 'There is relationship with meters', - THERE_IS_RELATIONSHIP_WITH_OFFLINE_METERS: 'There is relationship with offline meters', - THERE_IS_RELATIONSHIP_WITH_TEAMS: 'There is relationship with teams', THERE_IS_RELATIONSHIP_WITH_USERS: 'There is relationship with users', - THERE_IS_RELATIONSHIP_WITH_VIRTUAL_METERS: 'There is relationship with virtual meters', TIMEZONE_NOT_FOUND: 'Timezone Not Found', USER_NOT_FOUND: 'User Not Found', USER_SESSION_TIMEOUT: 'User Session Timeout', USER_SESSION_NOT_FOUND: 'User session Not Found', - VIRTUAL_METER_NAME_ALREADY_EXISTS: 'Virtual Meter Name already Exists', VIRTUAL_METER_NOT_FOUND: 'Virtual Meter Not Found', VIRTUAL_METER_OF_VARIABLE_NOT_FOUND: 'Virtual Meter of Variable Not Found', WEB_MESSAGE_NOT_FOUND: 'Web Message Not Found', - WEBMESSAGE_NOT_FOUND: 'Web Message Not Found', }, }) .translations('cn', { MY_EMS_NAME: 'MyEMS', LANGUAGE: '语 言', FULLSCREEN: '全屏显示', - ENTER_SYSTEM: '进入管理系统', EXITFULLSCREEN: '退出全屏', LOGOUT: '退出', COMMON: { EXECUTE: '执行', - EDIT: '修改', - DELETE: '删除', - ACTION: '操作', PLACEHOLDER: '请选择或搜索...', SPACE: '空间', EQUIPMENT: '设备', @@ -897,46 +755,10 @@ function config($translateProvider) { TENANT: '租户', STORE: '门店', SHOPFLOOR: '车间', - DATA_SOURCE: '数据源', SENSOR: '传感器', ENERGY_FLOW_DIAGRAM: '能流图', MENU: '菜单', - PERIOD: { - LABEL: '选择范围', - YEAR: '年', - MONTH: '月', - DAY: '日', - HOUR: '时', - }, DATE: '日期', - ANALYSIS: { - LABEL: '显示方式', - ENERGY: '能耗', - COST: '费用' - }, - ENERGYFLOW: { - LABEL: '能源流向', - INCOME: '流入', - OUTPUT: '流出' - }, - COMPARE: { - LABEL: '比较方式', - TREND: '趋势', - COMPARE: '比较' - }, - STATISTICS: { - LABEL: '分析方式', - COMMON: '常规分析', - KEYDEVICE: '按设备属性', - WORKINGDAY: '按生产日非生产日', - STATUS: '按设备状态能耗', - CPU: '按单台能耗', - }, - CHARTTYPE: { - LABEL: '图表显示方式', - COLUMN: '柱状图', - LINE: '曲线图' - }, TARIFF: { TOPPEAK: '尖', ONPEAK: '峰', @@ -944,18 +766,6 @@ function config($translateProvider) { MIDPEAK: '平' } }, - REPORT: { - REPORT: '报表', - REPORT_LIST: '报表列表', - CREATE_TIME: '创建时间', - FILE_NAME: '文件名', - TABLE: { - ENERGYDATA: '详细数据', - TIME: '时间', - HOUR: '时', - TOTAL: '汇总' - } - }, FDD: { ID: 'ID', RULE: '规则', @@ -963,7 +773,6 @@ function config($translateProvider) { TEXT_MESSAGE: '短信信息', WEB_MESSAGE: '网页信息', WECHAT_MESSAGE: '微信信息', - RECIPIENT: '收件人', ALARM_LIST: '查看报警列表', RULE_LIST: '规则列表', @@ -1073,14 +882,11 @@ function config($translateProvider) { ADD_METER: '添加计量表', ADD_VIRTUAL_METER: '添加虚拟表', ADD_OFFLINE_METER: '添加离线表', - ADD_POINT: '添加点位', + ADD_POINT: '添加数据点', ADD_COSTCENTER: '添加成本中心', ADD_TARIFF: '添加费率', ADD_CATEGORY: '添加能源分类', ADD_ENERGY_ITEM: '添加能耗分项', - ADD_TARIFF: '添加费率', - ADD_EMAIL_RECIPIENT: '添加收件人', - ADD_SMS_RECIPIENT: '添加联系人', ADD_CONTACT: '添加联系人', ADD_EMAIL_SERVER: '添加邮件服务器', ADD_GSM_MODEM: '添加短信模块', @@ -1091,19 +897,14 @@ function config($translateProvider) { EDIT_METER: '编辑计量表', EDIT_VIRTUAL_METER: '编辑虚拟表', EDIT_OFFLINE_METER: '编辑离线表', - EDIT_POINT: '编辑点位', + EDIT_POINT: '编辑数据点', EDIT_COSTCENTER: '编辑成本中心', EDIT_TARIFF: '编辑费率', EDIT_CATEGORY: '编辑能源分类', EDIT_ENERGY_ITEM: '编辑能耗分项', - EDIT_EMAIL_RECIPIENT: '编辑收件人', - EDIT_SMS_RECIPIENT: '编辑联系人', EDIT_CONTACT: '编辑联系人', EDIT_EMAIL_SERVER: '编辑邮箱服务器', EDIT_GSM_MODEM: '编辑短信模块', - EDIT_PARAM_COMBINED_EQUIPMENT: '编辑组合设备参数', - EDIT_PARAM_EQUIPMENT: '编辑设备参数', - EDIT_PARAM_SPACE: '编辑空间参数', REQUIRES_AUTHENTICATION: '需要身份验证', SELECT_SPACE: '请选择用能单位', @@ -1122,17 +923,14 @@ function config($translateProvider) { BIND_POINT: '绑定数据点', BIND_SENSOR: '绑定传感器', BIND_TARIFF: '绑定费率', - PHONE_ID_FORMAT: '请添加国家码:如0086+手机号码', INPUT_NAME: '请输入名称', INPUT_AREA: '请输入面积', INPUT_UNIT: '请输入单位', INPUT_CONTACT: '请输入联系人', INPUT_EXPRESSION: '请输入表达式', - INPUT_SERIAL_NUMBER: '请输入序列号', INPUT_KGCE: '请输入标准煤系数', INPUT_KGCO2E: '请输入二氧化碳排放系数', - INPUT_TAG: '请输入标签', INPUT_HOST: '请输入服务器', INPUT_PORT: '请输入端口号', INPUT_USER_NAME: '请输入用户名', @@ -1146,7 +944,6 @@ function config($translateProvider) { INVALID_FROM_ADDR: '发件人地址不正确', INVALID_BAUD_RATE: '波特率不正确', NOT_NULLABLE: '不允许为空', - MASTER_METER: '总表', METER: '计量表', VIRTUAL_METER: '虚拟表', OFFLINE_METER: '离线表', @@ -1161,7 +958,6 @@ function config($translateProvider) { SENSOR_LIST: '传感器列表', METER_TYPE: '计量表类型', METER_NAME: '计量表名', - METER_STATUS: '计量表状态', TRASH: '回收桶', DRAG_TO_BIND: '请拖拽完成绑定', DRAG_TO_UNBIND: '请拖拽至回收桶解除绑定', @@ -1170,7 +966,6 @@ function config($translateProvider) { AREA: '面积', UNIT: '单位', CONTACT: '联系人', - ENERGY_SYSTEM_CONTACT: '能耗系统联系人', TIMEZONE: '时区', TARIFF: '费率', @@ -1179,11 +974,6 @@ function config($translateProvider) { ENERGY_ITEM: '能耗分项', STATUS: '状态', UPLOAD_TIME: '上传时间', - SERIAL_NUMBER: '编号', - COEF: '折标系数', - TAG: '标签', - BASELINE_CPU: '单耗基线', - BASELINE_COST: '单耗费用基线', EXPRESSION: '表达式', VARIABLE_NAME: '变量名', POINT: '数据点', @@ -1204,7 +994,6 @@ function config($translateProvider) { END_AMOUNT: '结束量', PORT: '端口', - GSM: 'GSM', SMS: '短信', SERIAL_PORT: '串口地址', BAUD_RATE: '波特率', @@ -1212,24 +1001,9 @@ function config($translateProvider) { HOST: '服务器', USER_NAME: '用户名', - SUSPENDED: '待机', - IDLING: '空运转', - RUNNING: '运行', - PARAM_COMBINED_EQUIPMENT: '组合设备参数管理', - PARAM_EQUIPMENT: '设备参数管理', - PARAM_SPACE: '空间参数管理', - SROSS: '非生产日标准状态下关闭率', - USER: '用户', - TEAM: '班组', - ADD_TEAM: '添加班组', - EDIT_TEAM: '编辑班组', SEARCH: '搜索...', - METER_DATA: '计量表数据', - START_ENERGY: '起始能耗值', - END_ENERGY: '结束能耗值', - DIFF_VALUE: '差值', RESTORE: '恢复', RESTORE_SUCCESS: '恢复成功', @@ -1524,10 +1298,8 @@ function config($translateProvider) { DELETE: '删除', }, TOASTER: { - FAILURE: '失败', FAILURE_TITLE: '错误', ERROR: 'error', - OPTIONS_ERROR: '选项错误', SUCCESS: 'success', SUCCESS_TITLE: '成功', LOGIN_SUCCESS: '登录成功。', @@ -1593,7 +1365,6 @@ function config($translateProvider) { STORE_AND_OFFLINE_METER_RELATIONSHIP_NOT_FOUND: '未找到门店和离线表关系', STORE_AND_VIRTUAL_METER_RELATIONSHIP_NOT_FOUND: '未找到门店和虚拟表关系', ASSOCIATED_POINTS_NOT_FOUND: '未找到数据点', - COMPLEX_NOT_FOUND: '未找到复杂产品', COST_CENTER_NOT_FOUND: '未找到成本中心', COST_CENTER_EXTERNAL_ID_EXISTS: '成本中心外部ID已存在', COST_CENTER_NAME_EXISTS: '成本中心名称存在', @@ -1621,10 +1392,6 @@ function config($translateProvider) { SPACE_ALREADY_ASSOCIATED_WITH_METER: '空间已经与计量表相关联', SPACE_ALREADY_ASSOCIATED_WITH_OFFLINE_METER: '空间已经与离线表相关联', SPACE_ALREADY_ASSOCIATED_WITH_VIRTUAL_METER: '空间已经与虚拟表相关联', - SPACE_AND_METER_RELATIONSHIP_NOT_FOUND: '未找到空间和计量表的关系', - SPACE_AND_OFFLINE_METER_RELATIONSHIP_NOT_FOUND: '未找到空间和离线表关系', - SPACE_AND_VIRTUAL_METER_RELATIONSHIP_NOT_FOUND: '未找到空间和虚拟表关系', - GSM_CONFIG_NOT_FOUND: '未找到GSM配置', KNOWLEDGE_FILE_NOT_FOUND: '未找到知识文件', INVALID_: '无效', INVALID_TENANT_ID: '无效的租户ID', @@ -1634,30 +1401,22 @@ function config($translateProvider) { INVALID_DATA_SOURCE_ID: '无效的数据源ID', INVALID_DATA_SOURCE_NAME: '无效的数据源名称', INVALID_DATA_SOURCE_PROTOCOL: '无效的数据源协议。', - INVALID_DATE: '无效的日期(预期格式:YYYY-MM-DD)', - INVALID_DATETIME_DATA: '无效的日期时间数据', INVALID_EMAIL_MESSAGE_ID: '无效的电子邮件ID', - INVALID_EMAIL_RECIPIENT_ID: '无效的电子邮件收件人ID', INVALID_ENERGY_CATEGORY_ID: '无效的能源分类ID', INVALID_ENERGY_ITEM_ID: '无效的能耗分项ID', INVALID_COMBINED_EQUIPMENT_ID: '无效的设备ID', INVALID_EQUIPMENT_ID: '无效的设备ID', INVALID_SPACE_ID: '无效的空间ID', - INVALID_GSM_CONFIG_ID: '无效的GSM配置ID', INVALID_KNOWLEDGE_FILE_ID: '无效的知识文件ID', - INVALID_ID: '无效的ID', - INVALID_MESSAGE_ID: '无效的消息ID', INVALID_METER_ID: '无效的计量表ID', INVALID_METER_UUID: '无效的计量表UUID', INVALID_COST_FILE_ID: '无效的成本文件ID', - INVALID_OFFLINE_METER_FILE__ID: '无效的离线表文件ID', INVALID_OFFLINE_METER_FILE_ID: '无效的离线表文件ID', INVALID_OFFLINE_METER_ID: '无效的离线表ID', INVALID_PASSWORD: '无效的密码', INVALID_POINT_ID: '无效的点ID', INVALID_PRIVILEGE_ID_: '无效的权限ID', INVALID_PRIVILEGE_ID: '无效的权限ID', - INVALID_PRIVILEGE_TO_RESET_PASSWORD: '无效的重置密码权限', INVALID_RULE_ID: '无效的规则ID', INVALID_TARIFF_BLOCK_PRICING: '无效的阶梯费率价格', INVALID_TARIFF_ID: '无效的费率ID', @@ -1669,79 +1428,37 @@ function config($translateProvider) { INVALID_VIRTUAL_METER_ID: '无效的虚拟表ID', INVALID_VIRTUAL_METER_NAME: '无效的虚拟表名称', INVALID_WEB_MESSAGE_ID: '无效的网页信息ID', - INVALID_COOKIES_PLEASE_RE_LOGIN: '无效的Cookie,请重新登录', INVALID_EMAIL: '无效的邮箱', - INVALID_EMS_CONTACT_EMAIL_VALUE: '无效的ems_contact_email值', - INVALID_EMS_CONTACT_NAME_VALUE: '无效的ems_contact_name值', - INVALID_EMS_CONTACT_PHONE_VALUE: '无效的ems_contact_phone值', - INVALID_END_DATE_TIME: '无效的结束日期(完整预期格式:YYYY-MM-DDTHH:MM:SS)', - INVALID_END_DATE_TIME_YMD: '无效的结束日期时间(预期格式:YYYY-MM-DDTHH)', - INVALID_END_DATE_TIME_YMDHMS: '无效的结束日期时间(预期格式:YYYY-MM-DDTHH:MM:SS)', INVALID_EQUATION_IN_EXPRESSION: '无效的表达式公式', INVALID_EXPRESSION_OBJECT: '无效的表达式对象', - INVALID_EXTERNAL_ID_VALUE: '无效的外部ID', INVALID_IS_COUNTED_VALUE: '无效的is_counted值', - INVALID_IS_COMBINED_EQUIPMENT_STATUS_COUNTED_VALUE: '无效的is_equipment_status_counted值', - INVALID_IS_EQUIPMENT_STATUS_COUNTED_VALUE: '无效的is_equipment_status_counted值', INVALID_IS_OUTPUT_VALUE: '无效的is_output值', INVALID_IS_OUTPUT_COUNTED_VALUE: '无效的is_output_counted值', - INVALID_IS_PRODUCT_COUNTED_VALUE: '无效的is_product_counted值', - INVALID_PERIOD: '无效的时间期', - INVALID_PERIOD_FORMAT: '无效的时间期格式(预期格式\'年\',\'月\',\'天\'或\'小时\')', - INVALID_PRIVILEGES_VALUE: '无效的时间期', - INVALID_PRODUCTID_ID: '无效的产品ID', - INVALID_SERIAL_NUMBER_VALUE: '无效的serial_number值', - INVALID_START_DATE_TIME: '无效的开始日期时间(完整的预期格式:YYYY-MM-DDTHH:MM:SS)', - INVALID_START_DATE_TIME_YMD: '无效的开始日期时间(预期格式:YYYY-MM-DD)', - INVALID_START_DATE_TIME_YMDHMS: '无效的开始日期时间(预期格式:YYYY-MM-DDTHH:MM:SS)', - INVALID_SUSPENDED_VALUE: '无效的暂停值', - INVALID_USE_LIFE_END_VALUE: '无效的设备使用期结束值', - INVALID_USE_LIFE_START_VALUE: '无效的设备使用期起始值', INVALID_VARIABLE_METER_ID: '无效的变量meter_id', INVALID_VARIABLE_METER_TYPE: '无效的变量meter_type', INVALID_VARIABLE_NAME: '无效的变量名称', METER_NOT_FOUND: '未找到计量表', - METER_POINT_RELATIONSHIP_EXISTED: '存在计量表和点的关系', - METER_POINT_RELATIONSHIP_NOT_FOUND: '未找到计量表和点的关系', METER_OF_VARIABLE_NOT_FOUND: '未找到变量关联的计量表', COST_FILE_NOT_FOUND: '未找到成本文件', OFFLINE_METER_FILE_NOT_FOUND: '未找到离线表文件', OFFLINE_METER_NOT_FOUND: '未找到离线表', OFFLINE_METER_OF_VARIABLE_NOT_FOUND: '未找到变量关联的离线表', - PLEASE_RE_LOGIN: '请重新登录', POINT_NOT_FOUND: '未找到数据点', PRIVILEGE_NOT_FOUND: '未找到权限', RULE_NOT_FOUND: '未找到规则', - SMS_RECIPIENT_NOT_FOUND: '未找到短信收件人', - START_DATE_SHOULD_BE_EARLY_THAN_END_DATE: '开始日期应早于结束日期', START_DATETIME_SHOULD_BE_EARLY_THAN_END_DATETIME: '开始日期时间应早于结束日期时间', TARIFF_IN_USE: '费率正在使用中', TARIFF_NOT_EMPTY: '费率不为空', TARIFF_NOT_FOUND: '未找到费率', - TARIFF_ALREADY_ASSOCIATED_WITH_COSTCENTER: '费率已经与成本中心关联', - TARIFF_ALREADY_ASSOCIATED_WITH_SPACE: '费率已经与空间联系', TARIFF_IS_NOT_ASSOCIATED_WITH_COST_CENTER: '费率与成本中心未关联', - TARIFF_IS_NOT_ASSOCIATED_WITH_SPACE: '费率与空间未关联', - POINT_ALREADY_ASSOCIATED_WITH_SPACE: '数据点已经与空间联系', - POINT_IS_NOT_ASSOCIATED_WITH_SPACE: '数据点与空间未关联', - TEAM_NOT_FOUND: '未找到班组', TEXT_MESSAGE_NOT_FOUND: '未找到短信', - THERE_IS_RELATIONSHIP_WITH_TENANTS: '与租户有关系', - THERE_IS_RELATIONSHIP_WITH_STORES: '与门店有关系', - THERE_IS_RELATIONSHIP_WITH_COMPANIES: '与公司有关系', - THERE_IS_RELATIONSHIP_WITH_COMBINED_EQUIPMENTS: '与组合设备有关系', THERE_IS_RELATIONSHIP_WITH_EQUIPMENTS: '与设备有关系', THERE_IS_RELATIONSHIP_WITH_SPACES: '与空间有关系', - THERE_IS_RELATIONSHIP_WITH_METERS: '与计量表有关系', - THERE_IS_RELATIONSHIP_WITH_OFFLINE_METERS: '与离线表有关系', - THERE_IS_RELATIONSHIP_WITH_TEAMS: '与班组有关系', THERE_IS_RELATIONSHIP_WITH_USERS: '与用户有关系', - THERE_IS_RELATIONSHIP_WITH_VIRTUAL_METERS: '与虚拟表有关系', TIMEZONE_NOT_FOUND: '未找到时区', USER_NOT_FOUND: '未找到用户', USER_SESSION_TIMEOUT: '用户会话超时', USER_SESSION_NOT_FOUND: '未找到用户会话', - VIRTUAL_METER_NAME_ALREADY_EXISTS: '虚拟表名称已存在', VIRTUAL_METER_NOT_FOUND: '未找到虚拟表', VIRTUAL_METER_OF_VARIABLE_NOT_FOUND: '未找到变量的虚拟表', WEB_MESSAGE_NOT_FOUND: '未找到网页信息', @@ -1751,14 +1468,10 @@ function config($translateProvider) { MY_EMS_NAME: 'MyEMS', LANGUAGE: 'Sprache', FULLSCREEN: 'Vollbildanzeige', - ENTER_SYSTEM: 'Geben Sie das Managementsystem ein', EXITFULLSCREEN: 'Beenden Sie den Vollbildmodus', LOGOUT: 'ausfallen', COMMON: { EXECUTE: 'durchgeführt', - EDIT: 'ändern', - DELETE: 'löschen', - ACTION: 'Betriebs', PLACEHOLDER: 'Bitte auswählen oder suchen ...', SPACE: 'Raum', EQUIPMENT: 'Ausrüstung', @@ -1766,46 +1479,10 @@ function config($translateProvider) { TENANT: 'Mieter', STORE: 'Geschäft', SHOPFLOOR: 'Werkstatt', - DATA_SOURCE: 'Datenquelle', SENSOR: 'Sensor', ENERGY_FLOW_DIAGRAM: 'Energieflussdiagramm', MENU: 'Menü', - PERIOD: { - LABEL: 'Bereich auswählen', - YEAR: 'Jahr', - MONTH: 'Monat', - DAY: 'Tag', - HOUR: 'Zeit', - }, DATE: 'Datum', - ANALYSIS: { - LABEL: 'Anzeigemethode', - ENERGY: 'Energieverbrauch', - COST: 'Kosten' - }, - ENERGYFLOW: { - LABEL: 'Energiefluss', - INCOME: 'Zufluss', - OUTPUT: 'Abfluss' - }, - COMPARE: { - LABEL: 'Vergleichsmethode', - TREND: 'Trend', - COMPARE: 'Vergleichen Sie' - }, - STATISTICS: { - LABEL: 'Analyse Methode', - COMMON: 'Routineanalyse', - KEYDEVICE: 'Nach Geräteattribut', - WORKINGDAY: 'Tag ohne Produktion', - STATUS: 'Energieverbrauch nach Gerätestatus', - CPU: 'Energieverbrauch pro Einheit', - }, - CHARTTYPE: { - LABEL: 'Diagrammanzeigemodus', - COLUMN: 'Histogramm', - LINE: 'Graph' - }, TARIFF: { TOPPEAK: 'Trinkgeld', ONPEAK: 'Gipfel', @@ -1813,18 +1490,6 @@ function config($translateProvider) { MIDPEAK: 'Niveau' } }, - REPORT: { - REPORT: 'Bericht', - REPORT_LIST: 'Berichtsliste', - CREATE_TIME: 'Erstellungszeitpunkt', - FILE_NAME: 'Dateinamen', - TABLE: { - ENERGYDATA: 'detaillierte Daten', - TIME: 'Zeit', - HOUR: 'Zeit', - TOTAL: 'Zusammenfassung' - } - }, FDD: { ID: 'ID', RULE: 'Regel', @@ -1832,7 +1497,6 @@ function config($translateProvider) { TEXT_MESSAGE: 'SMS-Nachricht', WEB_MESSAGE: 'Webseiteninformationen', WECHAT_MESSAGE: 'WeChat Informationen', - RECIPIENT: 'Empfänger', ALARM_LIST: 'Zeigen Sie die Alarmliste an', RULE_LIST: 'Liste der Regeln', @@ -1947,9 +1611,6 @@ function config($translateProvider) { ADD_TARIFF: 'Rate hinzufügen', ADD_CATEGORY: 'Energieklassifizierung hinzufügen', ADD_ENERGY_ITEM: 'Unterelemente zum Energieverbrauch hinzufügen', - ADD_TARIFF: 'Rate hinzufügen', - ADD_EMAIL_RECIPIENT: 'Empfänger hinzufügen', - ADD_SMS_RECIPIENT: 'Kontakt hinzufügen', ADD_CONTACT: 'Kontakt hinzufügen', ADD_EMAIL_SERVER: 'Mail-Server hinzufügen', ADD_GSM_MODEM: 'SMS-Modul hinzufügen', @@ -1965,14 +1626,9 @@ function config($translateProvider) { EDIT_TARIFF: 'Bearbeitungsrate', EDIT_CATEGORY: 'Energieklassifizierung bearbeiten', EDIT_ENERGY_ITEM: 'Unterelemente zum Energieverbrauch bearbeiten', - EDIT_EMAIL_RECIPIENT: 'Empfänger bearbeiten', - EDIT_SMS_RECIPIENT: 'Kontakt bearbeiten', EDIT_CONTACT: 'Kontakt bearbeiten', EDIT_EMAIL_SERVER: 'Postfachserver bearbeiten', EDIT_GSM_MODEM: 'SMS-Modul bearbeiten', - EDIT_PARAM_COMBINED_EQUIPMENT: 'Bearbeiten Sie die Parameter des Kombinationsgeräts', - EDIT_PARAM_EQUIPMENT: 'Geräteparameter bearbeiten', - EDIT_PARAM_SPACE: 'Raumparameter bearbeiten', REQUIRES_AUTHENTICATION: 'Authentifizierung erforderlich', SELECT_SPACE: 'Bitte wählen Sie eine Energieeinheit', @@ -1991,17 +1647,14 @@ function config($translateProvider) { BIND_POINT: 'Datenpunkte binden', BIND_SENSOR: 'Bindungssensor', BIND_TARIFF: 'Bindungsrate', - PHONE_ID_FORMAT: 'Bitte geben Sie die Landesvorwahl ein: z. B. 0086 + Handynummer', INPUT_NAME: 'Bitte geben Sie einen Namen ein', INPUT_AREA: 'Bitte betreten Sie den Bereich', INPUT_UNIT: 'Bitte geben Sie eine Einheit ein', INPUT_CONTACT: 'Bitte geben Sie einen Kontakt ein', INPUT_EXPRESSION: 'Bitte geben Sie einen Ausdruck ein', - INPUT_SERIAL_NUMBER: 'Bitte geben sie die Seriennummer ein', INPUT_KGCE: 'Bitte geben Sie den Standardkohlekoeffizienten ein', INPUT_KGCO2E: 'Bitte geben Sie den CO2-Emissionsfaktor ein', - INPUT_TAG: 'Bitte geben Sie ein Etikett ein', INPUT_HOST: 'Bitte geben Sie den Server ein', INPUT_PORT: 'Bitte geben Sie die Portnummer ein', INPUT_USER_NAME: 'Bitte geben sie einen Benutzernamen ein', @@ -2015,7 +1668,6 @@ function config($translateProvider) { INVALID_FROM_ADDR: 'Falsche Absenderadresse', INVALID_BAUD_RATE: 'Falsche Baudrate', NOT_NULLABLE: 'Darf nicht leer sein', - MASTER_METER: 'Übersichtstabelle', METER: 'Meter', VIRTUAL_METER: 'Virtuelle Tabelle', OFFLINE_METER: 'Offline-Tabelle', @@ -2030,7 +1682,6 @@ function config($translateProvider) { SENSOR_LIST: 'Sensorliste', METER_TYPE: 'Zählertyp', METER_NAME: 'Zählername', - METER_STATUS: 'Messgerätestatus', TRASH: 'recyceln können', DRAG_TO_BIND: 'Bitte ziehen und ablegen, um die Bindung abzuschließen', DRAG_TO_UNBIND: 'Bitte ziehen Sie in den Papierkorb, um die Bindung aufzuheben', @@ -2039,7 +1690,6 @@ function config($translateProvider) { AREA: 'Bereich', UNIT: 'Einheit', CONTACT: 'Gesprächspartner', - ENERGY_SYSTEM_CONTACT: 'Kontakt zum Energiesystem', TIMEZONE: 'Zeitzone', TARIFF: 'Bewertung', @@ -2048,11 +1698,6 @@ function config($translateProvider) { ENERGY_ITEM: 'Unterpunkt Energieverbrauch', STATUS: 'Status', UPLOAD_TIME: 'Upload-Zeit', - SERIAL_NUMBER: 'Ordnungsnummer', - COEF: 'Umrechnungsfaktor', - TAG: 'Etikette', - BASELINE_CPU: 'Basislinie für den Verbrauch von Einheiten', - BASELINE_COST: 'Stückkostenbasis', EXPRESSION: 'Ausdruck', VARIABLE_NAME: 'Variablennamen', POINT: 'Datenpunkt', @@ -2073,7 +1718,6 @@ function config($translateProvider) { END_AMOUNT: 'Endbetrag', PORT: 'Hafen', - GSM: 'GSM', SMS: 'SMS', SERIAL_PORT: 'Adresse der seriellen Schnittstelle', BAUD_RATE: 'Baudrate', @@ -2081,25 +1725,9 @@ function config($translateProvider) { HOST: 'Server', USER_NAME: 'Nutzername', - SUSPENDED: 'Bereithalten', - IDLING: 'Probelauf', - RUNNING: 'Lauf', - PARAM_COMBINED_EQUIPMENT: 'Parameterverwaltung für Kombinationsgeräte', - PARAM_EQUIPMENT: 'Verwaltung von Geräteparametern', - PARAM_SPACE: 'Räumliche Parameterverwaltung', - SROSS: 'Schlusskurs unter Standardbedingungen an Nichtproduktionstagen', - USER: 'Nutzer', - - TEAM: 'Mannschaft', - ADD_TEAM: 'Füge ein Team hinzu', - EDIT_TEAM: 'Team bearbeiten', SEARCH: 'suchen nach...', - METER_DATA: 'Zählerdaten', - START_ENERGY: 'Anfangsenergieverbrauchswert', - END_ENERGY: 'Ende des Energieverbrauchs', - DIFF_VALUE: 'Unterschied', RESTORE: 'wiederherstellen', RESTORE_SUCCESS: 'Erfolgreiche Genesung', @@ -2393,10 +2021,8 @@ function config($translateProvider) { DELETE: 'löschen', }, TOASTER: { - FAILURE: 'Fehler', FAILURE_TITLE: 'Error', ERROR: 'Error', - OPTIONS_ERROR: 'Falsche Option', SUCCESS: 'Erfolg', SUCCESS_TITLE: 'Erfolg', LOGIN_SUCCESS: 'Anmeldung erfolgreich.', @@ -2462,7 +2088,6 @@ function config($translateProvider) { STORE_AND_OFFLINE_METER_RELATIONSHIP_NOT_FOUND: 'Die Beziehung zwischen dem Geschäft und der Offline-Tabelle wurde nicht gefunden', STORE_AND_VIRTUAL_METER_RELATIONSHIP_NOT_FOUND: 'Die Beziehung zwischen dem Geschäft und der virtuellen Tabelle wurde nicht gefunden', ASSOCIATED_POINTS_NOT_FOUND: 'Datenpunkt nicht gefunden', - COMPLEX_NOT_FOUND: 'Kein komplexes Produkt gefunden', COST_CENTER_NOT_FOUND: 'Kostenstelle nicht gefunden', COST_CENTER_EXTERNAL_ID_EXISTS: 'Externe Kostenstellen-ID ist bereits vorhanden', COST_CENTER_NAME_EXISTS: 'Kostenstellenname existiert', @@ -2490,10 +2115,6 @@ function config($translateProvider) { SPACE_ALREADY_ASSOCIATED_WITH_METER: 'Der Raum ist bereits dem Zähler zugeordnet', SPACE_ALREADY_ASSOCIATED_WITH_OFFLINE_METER: 'Der Speicherplatz ist bereits der Offline-Tabelle zugeordnet', SPACE_ALREADY_ASSOCIATED_WITH_VIRTUAL_METER: 'Der Speicherplatz ist bereits der virtuellen Tabelle zugeordnet', - SPACE_AND_METER_RELATIONSHIP_NOT_FOUND: 'Die Beziehung zwischen dem Raum und dem Zähler wurde nicht gefunden', - SPACE_AND_OFFLINE_METER_RELATIONSHIP_NOT_FOUND: 'Speicherplatz und Offline-Tabellenbeziehung nicht gefunden', - SPACE_AND_VIRTUAL_METER_RELATIONSHIP_NOT_FOUND: 'Speicherplatz und virtuelle Tabellenbeziehung nicht gefunden', - GSM_CONFIG_NOT_FOUND: 'GSM-Konfiguration nicht gefunden', KNOWLEDGE_FILE_NOT_FOUND: 'Wissensdatei nicht gefunden', INVALID_: 'ungültig', INVALID_TENANT_ID: 'Ungültige Mieter-ID', @@ -2503,30 +2124,22 @@ function config($translateProvider) { INVALID_DATA_SOURCE_ID: 'Ungültige Datenquellen-ID', INVALID_DATA_SOURCE_NAME: 'Ungültiger Datenquellenname', INVALID_DATA_SOURCE_PROTOCOL: 'Ungültiges Datenquellenprotokoll.', - INVALID_DATE: 'Ungültiges Datum (voraussichtliches Format: JJJJ-MM-TT)', - INVALID_DATETIME_DATA: 'Ungültige Datums- und Uhrzeitdaten', INVALID_EMAIL_MESSAGE_ID: 'Ungültige E-Mail-ID', - INVALID_EMAIL_RECIPIENT_ID: 'Ungültige E-Mail-Empfänger-ID', INVALID_ENERGY_CATEGORY_ID: 'Ungültige Energieklassifizierungs-ID', INVALID_ENERGY_ITEM_ID: 'Ungültige Energieverbrauchs-Artikel-ID', INVALID_COMBINED_EQUIPMENT_ID: 'Ungültige Geräte-ID', INVALID_EQUIPMENT_ID: 'Ungültige Geräte-ID', INVALID_SPACE_ID: 'Ungültige Leerzeichen-ID', - INVALID_GSM_CONFIG_ID: 'Ungültige GSM-Konfigurations-ID', INVALID_KNOWLEDGE_FILE_ID: 'Ungültige ID der Wissensdatei', - INVALID_ID: 'Ungültige ID', - INVALID_MESSAGE_ID: 'Ungültige Nachrichten ID', INVALID_METER_ID: 'Ungültige Zähler-ID', INVALID_METER_UUID: 'Ungültige UUID des Messgeräts', INVALID_COST_FILE_ID: 'Ungültige Kostendatei-ID', - INVALID_OFFLINE_METER_FILE__ID: 'Ungültige Offline-Tabellendatei-ID', INVALID_OFFLINE_METER_FILE_ID: 'Ungültige Offline-Tabellendatei-ID', INVALID_OFFLINE_METER_ID: 'Ungültige Offline-Tabellen-ID', INVALID_PASSWORD: 'Ungültiges Passwort', INVALID_POINT_ID: 'Ungültige Punkt-ID', INVALID_PRIVILEGE_ID_: 'Ungültige Berechtigungs-ID', INVALID_PRIVILEGE_ID: 'Ungültige Berechtigungs-ID', - INVALID_PRIVILEGE_TO_RESET_PASSWORD: 'Ungültige Berechtigung zum Zurücksetzen des Kennworts', INVALID_RULE_ID: 'Ungültige Regel-ID', INVALID_TARIFF_BLOCK_PRICING: 'Ungültiger Staffelpreis', INVALID_TARIFF_ID: 'Ungültige Tarif-ID', @@ -2538,74 +2151,33 @@ function config($translateProvider) { INVALID_VIRTUAL_METER_ID: 'Ungültige ID der virtuellen Tabelle', INVALID_VIRTUAL_METER_NAME: 'Ungültiger Name der virtuellen Tabelle', INVALID_WEB_MESSAGE_ID: 'Ungültige Seiteninformations-ID', - INVALID_COOKIES_PLEASE_RE_LOGIN: 'Ungültiger Cookie, bitte erneut anmelden', INVALID_EMAIL: 'Ungültige E-Mail', - INVALID_EMS_CONTACT_EMAIL_VALUE: 'Ungültiger Wert für ems_contact_email', - INVALID_EMS_CONTACT_NAME_VALUE: 'Ungültiger Wert für ems_contact_name', - INVALID_EMS_CONTACT_PHONE_VALUE: 'Ungültiger Wert für ems_contact_phone', - INVALID_END_DATE_TIME: 'Ungültiges Enddatum (volles erwartetes Format: JJJJ-MM-TTTHH: MM: SS)', - INVALID_END_DATE_TIME_YMD: 'Ungültige Enddatumzeit (erwartetes Format: JJJJ-MM-TTTHH)', - INVALID_END_DATE_TIME_YMDHMS: 'Ungültige Enddatumzeit (erwartetes Format: JJJJ-MM-TTTHH: MM: SS)', INVALID_EQUATION_IN_EXPRESSION: 'Ungültige Ausdrucksformel', INVALID_EXPRESSION_OBJECT: 'Ungültiges Ausdrucksobjekt', - INVALID_EXTERNAL_ID_VALUE: 'Ungültige externe ID', INVALID_IS_COUNTED_VALUE: 'Ungültiger is_counted-Wert', - INVALID_IS_COMBINED_EQUIPMENT_STATUS_COUNTED_VALUE: 'Ungültiger Wert für is_equipment_status_counted', - INVALID_IS_EQUIPMENT_STATUS_COUNTED_VALUE: 'Ungültiger Wert für is_equipment_status_counted', INVALID_IS_OUTPUT_VALUE: 'Ungültiger is_output-Wert', INVALID_IS_OUTPUT_COUNTED_VALUE: 'Ungültiger is_output_counted-Wert', - INVALID_IS_PRODUCT_COUNTED_VALUE: 'Ungültiger is_product_counted-Wert', - INVALID_PERIOD: 'Ungültiger Zeitraum', - INVALID_PERIOD_FORMAT: 'Ungültiges Zeitraumformat (erwartetes Format \'year\', \'month\', \'day\' or \'hour\')', - INVALID_PRIVILEGES_VALUE: 'Ungültiger Zeitraum', - INVALID_PRODUCTID_ID: 'Ungültige Produkt-ID', - INVALID_SERIAL_NUMBER_VALUE: 'Ungültiger Wert für serial_number', - INVALID_START_DATE_TIME: 'Ungültige Startzeit (vollständiges erwartetes Format: JJJJ-MM-TTTHH: MM: SS)', - INVALID_START_DATE_TIME_YMD: 'Ungültige Startzeit (erwartetes Format: JJJJ-MM-TT)', - INVALID_START_DATE_TIME_YMDHMS: 'Ungültige Startzeit (erwartetes Format: JJJJ-MM-TTTHH: MM: SS)', - INVALID_SUSPENDED_VALUE: 'Ungültiger Pausenwert', - INVALID_USE_LIFE_END_VALUE: 'Ungültiger Wert für die Lebensdauer des Geräts', - INVALID_USE_LIFE_START_VALUE: 'Ungültiger Startwert der Gerätelebensdauer', INVALID_VARIABLE_METER_ID: 'Ungültige Variable meter_id', INVALID_VARIABLE_METER_TYPE: 'Ungültige Variable meter_type', INVALID_VARIABLE_NAME: 'Ungültiger Variablenname', METER_NOT_FOUND: 'Kein Zähler gefunden', - METER_POINT_RELATIONSHIP_EXISTED: 'Es gibt eine Beziehung zwischen Metern und Punkten', - METER_POINT_RELATIONSHIP_NOT_FOUND: 'Die Beziehung zwischen dem Messgerät und dem Punkt wurde nicht gefunden', METER_OF_VARIABLE_NOT_FOUND: 'Kein mit der Variablen verknüpftes Messgerät gefunden', COST_FILE_NOT_FOUND: 'Kostendatei nicht gefunden', OFFLINE_METER_FILE_NOT_FOUND: 'Offline-Tabellendatei nicht gefunden', OFFLINE_METER_NOT_FOUND: 'Offline-Tabelle nicht gefunden', OFFLINE_METER_OF_VARIABLE_NOT_FOUND: 'Die der Variablen zugeordnete Offline-Tabelle wurde nicht gefunden', - PLEASE_RE_LOGIN: 'Bitte melden Sie sich erneut an', POINT_NOT_FOUND: 'Datenpunkt nicht gefunden', PRIVILEGE_NOT_FOUND: 'Berechtigung nicht gefunden', RULE_NOT_FOUND: 'Regel nicht gefunden', - SMS_RECIPIENT_NOT_FOUND: 'SMS-Empfänger nicht gefunden', - START_DATE_SHOULD_BE_EARLY_THAN_END_DATE: 'Das Startdatum sollte vor dem Enddatum liegen', START_DATETIME_SHOULD_BE_EARLY_THAN_END_DATETIME: 'Das Startdatum und die Startzeit sollten vor dem Enddatum und der Endzeit liegen', TARIFF_IN_USE: 'Rate wird verwendet', TARIFF_NOT_EMPTY: 'Die Rate ist nicht leer', TARIFF_NOT_FOUND: 'Rate nicht gefunden', - TARIFF_ALREADY_ASSOCIATED_WITH_COSTCENTER: 'Der Tarif ist bereits der Kostenstelle zugeordnet', - TARIFF_ALREADY_ASSOCIATED_WITH_SPACE: 'Die Rate wurde mit dem Speicherplatz verknüpft', TARIFF_IS_NOT_ASSOCIATED_WITH_COST_CENTER: 'Der Tarif ist nicht mit der Kostenstelle verknüpft', - TARIFF_IS_NOT_ASSOCIATED_WITH_SPACE: 'Rate und Platz sind nicht miteinander verbunden', - POINT_ALREADY_ASSOCIATED_WITH_SPACE: 'Datenpunkte wurden mit dem Raum verknüpft', - POINT_IS_NOT_ASSOCIATED_WITH_SPACE: 'Datenpunkte sind nicht mit Leerzeichen verknüpft', - TEAM_NOT_FOUND: 'Kein Team gefunden', TEXT_MESSAGE_NOT_FOUND: 'SMS nicht gefunden', - THERE_IS_RELATIONSHIP_WITH_TENANTS: 'Haben Sie eine Beziehung mit dem Mieter', - THERE_IS_RELATIONSHIP_WITH_STORES: 'Hat eine Beziehung zum Geschäft', - THERE_IS_RELATIONSHIP_WITH_COMPANIES: 'Haben Sie eine Beziehung mit dem Unternehmen', - THERE_IS_RELATIONSHIP_WITH_COMBINED_EQUIPMENTS: 'Bezogen auf kombinierte Ausrüstung', THERE_IS_RELATIONSHIP_WITH_EQUIPMENTS: 'Bezogen auf Ausrüstung', THERE_IS_RELATIONSHIP_WITH_SPACES: 'Hat eine Beziehung zum Raum', - THERE_IS_RELATIONSHIP_WITH_METERS: 'Bezogen auf Meter', - THERE_IS_RELATIONSHIP_WITH_OFFLINE_METERS: 'Bezogen auf Offline-Tabelle', - THERE_IS_RELATIONSHIP_WITH_TEAMS: 'Habe eine Beziehung zum Team', THERE_IS_RELATIONSHIP_WITH_USERS: 'Haben Sie eine Beziehung zu Benutzern', - THERE_IS_RELATIONSHIP_WITH_VIRTUAL_METERS: 'Bezogen auf virtuelle Tabelle', TIMEZONE_NOT_FOUND: 'Zeitzone nicht gefunden', USER_NOT_FOUND: 'Benutzer wurde nicht gefunden', USER_SESSION_TIMEOUT: 'Zeitlimit für Benutzersitzung', From e4c6ea606dc77a5386bad786764326730faa52d1 Mon Sep 17 00:00:00 2001 From: "13621160019@163.com" <13621160019@163.com> Date: Fri, 6 Aug 2021 11:20:33 +0800 Subject: [PATCH 7/8] added demo data to database --- database/README.md | 7 +- database/demo/myems_system_db.sql | 1139 ++++++++++++++++++++++++++++ database/myems_system_db.sql | 1144 +---------------------------- 3 files changed, 1151 insertions(+), 1139 deletions(-) create mode 100644 database/demo/myems_system_db.sql diff --git a/database/README.md b/database/README.md index f38ad61b..4d94e6d4 100644 --- a/database/README.md +++ b/database/README.md @@ -15,7 +15,7 @@ Providing database schema and scripts for MyEMS. ### Installation -Execute the scripts in MySQL commandline as below, or execute in orther MySQL client tools such as MySQL Workbench, Navicat, DBaver, phpMyAdmin, etc. +Execute the following scripts in MySQL commandline, or execute in other MySQL client tools such as MySQL Workbench, Navicat, DBaver, phpMyAdmin, etc. ``` mysql -u root -p < myems_billing_baseline_db.sql mysql -u root -p < myems_billing_db.sql @@ -27,7 +27,10 @@ mysql -u root -p < myems_reporting_db.sql mysql -u root -p < myems_system_db.sql mysql -u root -p < myems_user_db.sql ``` - +To insert demo data execute the following scripts, +``` +mysql -u root -p < demo/myems_system_db.sql +``` #### Change COLLATE for MySQL server before version 8.0 ``` sudo nano /etc/mysql/my.cnf diff --git a/database/demo/myems_system_db.sql b/database/demo/myems_system_db.sql new file mode 100644 index 00000000..37fc3acf --- /dev/null +++ b/database/demo/myems_system_db.sql @@ -0,0 +1,1139 @@ +-- MyEMS System Database Demo Data + +-- --------------------------------------------------------------------------------------------------------------------- +-- Demo Data for table `myems_system_db`.`tbl_combined_equipments` +-- --------------------------------------------------------------------------------------------------------------------- +START TRANSACTION; +USE `myems_system_db`; + +INSERT INTO `myems_system_db`.`tbl_combined_equipments` +(`id`, `name`, `uuid`, `is_input_counted`, `is_output_counted`, `cost_center_id`, `description` ) +VALUES +(1, '组合式设备1', '48aab70f-2e32-4518-9986-a6b7395acf58', true, false, 1, 'description'), +(2, '组合式设备2', 'c235e68c-e1be-4d7a-84e7-976c83ff6e44', true, false, 1, 'description'); + +COMMIT; + + +-- --------------------------------------------------------------------------------------------------------------------- +-- Demo Data for table `myems_system_db`.`tbl_combined_equipments_equipments` +-- --------------------------------------------------------------------------------------------------------------------- +START TRANSACTION; +USE `myems_system_db`; + +INSERT INTO `myems_system_db`.`tbl_combined_equipments_equipments` +(`id`, `combined_equipment_id`, `equipment_id`) +VALUES +(1, 1, 1); + +COMMIT; + +-- --------------------------------------------------------------------------------------------------------------------- +-- Demo Data for table `myems_system_db`.`tbl_combined_equipments_meters` +-- --------------------------------------------------------------------------------------------------------------------- +START TRANSACTION; +USE `myems_system_db`; + +INSERT INTO `myems_system_db`.`tbl_combined_equipments_meters` +(`id`, `combined_equipment_id`, `meter_id`, `is_output`) +VALUES +(1, 1, 1, false); + +COMMIT; + +-- --------------------------------------------------------------------------------------------------------------------- +-- Demo Data for table `myems_system_db`.`tbl_combined_equipments_offline_meters` +-- --------------------------------------------------------------------------------------------------------------------- +START TRANSACTION; +USE `myems_system_db`; + +INSERT INTO `myems_system_db`.`tbl_combined_equipments_offline_meters` +(`id`, `combined_equipment_id`, `offline_meter_id`, `is_output`) +VALUES +(1, 1, 1, false); + +COMMIT; + +-- --------------------------------------------------------------------------------------------------------------------- +-- Demo Data for table `myems_system_db`.`tbl_combined_equipments_parameters` +-- --------------------------------------------------------------------------------------------------------------------- +START TRANSACTION; +USE `myems_system_db`; + +INSERT INTO `myems_system_db`.`tbl_combined_equipments_parameters` +(`id`, `combined_equipment_id`, `name`, `parameter_type`, `constant`, `point_id`, `numerator_meter_uuid`, `denominator_meter_uuid`) +VALUES +(1, 1, 'serial number', 'constant', 'bfa8b106', NULL, NULL, NULL), +(2, 1, 'manufacturer', 'constant', 'York', NULL, NULL, NULL), +(3, 1, 'maintainer', 'constant', 'Johnson Controls', NULL, NULL, NULL), +(4, 1, 'use life start', 'constant', '2016-01-01', NULL, NULL, NULL), +(5, 1, 'use life end', 'constant', '2025-12-31', NULL, NULL, NULL), +(6, 1, 'model number', 'constant', 'CH01', NULL, NULL, NULL), +(7, 1, 'nominal cooling capacity', 'constant', '90.000 kW', NULL, NULL, NULL), +(8, 1, 'nominal cooling input power', 'constant', '100.000 kW', NULL, NULL, NULL), +(9, 1, 'nominal cooling cop', 'constant', '5', NULL, NULL, NULL), +(10, 1, 'nominal cooling operating current', 'constant', '120.000 A', NULL, NULL, NULL), +(11, 1, 'rated input power', 'constant', '100.000 kW', NULL, NULL, NULL), +(12, 1, 'nominal chilled water flow rate', 'constant', '30 m2/h', NULL, NULL, NULL), +(13, 1, 'nominal cooling water flow_rate', 'constant', '50 m2/h', NULL, NULL, NULL), +(14, 1, 'status', 'point', NULL, 1, NULL, NULL), +(15, 1, 'inlet chilled water temperature', 'point', NULL, 2, NULL, NULL), +(16, 1, 'chilled_water instantaneous flow rate', 'point', NULL, 3, NULL, NULL), +(17, 1, 'instantaneous power', 'point', NULL, 4, NULL, NULL), +(18, 1, 'COP', 'fraction', NULL, NULL, 'a4e0dbf0-528a-4cbb-88cc-563527900d40', '89ff5118-d0c2-4dd8-8098-a8698189b2ea'); + +COMMIT; + +-- --------------------------------------------------------------------------------------------------------------------- +-- Demo Data for table `myems_system_db`.`tbl_combined_equipments_virtual_meters` +-- --------------------------------------------------------------------------------------------------------------------- +START TRANSACTION; +USE `myems_system_db`; + +INSERT INTO `myems_system_db`.`tbl_combined_equipments_virtual_meters` +(`id`, `combined_equipment_id`, `virtual_meter_id`, `is_output`) +VALUES +(1, 1, 1, false); + +COMMIT; + +-- --------------------------------------------------------------------------------------------------------------------- +-- Demo Data for table `myems_system_db`.`tbl_contacts` +-- --------------------------------------------------------------------------------------------------------------------- +START TRANSACTION; +USE `myems_system_db`; +INSERT INTO `myems_system_db`.`tbl_contacts`(`id`, `name`, `uuid`, `email`, `phone`, `description`) +VALUES +(1, 'John', '5c5ce6e8-8d00-46b3-9602-4e1520a8b43f', 'john@myems.io', '+8613888888888', 'Building #1'), +(2, 'Sample Tenant', '102b654d-e831-4365-bb1e-dbd55e897851', 'sample.tenant@myems.io', '+8613666666666', 'Sample Tenant'); +COMMIT; + +-- --------------------------------------------------------------------------------------------------------------------- +-- Demo Data for table `myems_system_db`.`tbl_cost_centers` +-- --------------------------------------------------------------------------------------------------------------------- +START TRANSACTION; +USE `myems_system_db`; + +INSERT INTO `myems_system_db`.`tbl_cost_centers` +(`id`, `name`, `uuid`, `external_id`) +VALUES +(1, '成本中心', 'd97b9736-c4f9-4005-a534-6af3487303ad', NULL); +COMMIT; + +-- --------------------------------------------------------------------------------------------------------------------- +-- Demo Data for table `myems_system_db`.`tbl_cost_centers_tariffs` +-- --------------------------------------------------------------------------------------------------------------------- +START TRANSACTION; +USE `myems_system_db`; +INSERT INTO `myems_system_db`.`tbl_cost_centers_tariffs` +(`id`, `cost_center_id`, `tariff_id`) +VALUES +(1, 1, 1), +(2, 1, 2), +(3, 1, 3); + +COMMIT; + +-- --------------------------------------------------------------------------------------------------------------------- +-- Demo Data for table `myems_system_db`.`tbl_data_sources` +-- --------------------------------------------------------------------------------------------------------------------- +START TRANSACTION; +USE `myems_system_db`; + +INSERT INTO `myems_system_db`.`tbl_data_sources` +(`id`, `name`, `uuid`,`gateway_id`, `protocol`, `connection`) +VALUES +(1, '示例ModbusTCP数据源', 1, 'b3ace9d4-b63b-419b-818f-0f6d1d0603a4', 'modbus-tcp', '{"host":"10.111.212.191", "port":502}'), +(2, '示例ModbusRTU数据源', 1, 'b903f0af-9115-448c-9d46-8caf5f9995f3', 'modbus-tru', '{"port": "/dev/ttyUSB0","slaveaddress": 1, "baudrate": 9600,"bytesize": 8,"parity": "N","stopbits": 1,"timeout": 0.05,"mode": "rtu"}''), +(3, '示例Bacnet/IP数据源', 1, 'e2d5b30b-b554-4ebe-8ce7-f377ab380d19', 'bacnet-ip', '{"host":"10.111.212.200", "port":47808}'), +(4, '示例S7数据源', 1, '9eb0d705-d02a-43f8-9c62-7e5ef508b255', 's7', '{"host":"10.111.212.202", "port":102, "rack": 0, "slot": 2}'), +(5, '示例ControlLogix数据源', 1, 'd1dc9792-7861-4dd3-9b01-07511dae16c1', 'control-logix', '{"host":"10.111.212.203","port":44818,"processorslot":3}'); +(6, '示例OPU UA数据源', 1, '56e1c642-8032-495b-af2e-18a77ca75e0f', 'opc-ua', '{"url":"opc.tcp://10.111.212.5:49320/OPCUA/SimulationServer/"}'); +(7, '示例天气数据源', 1, '9bff8e95-c7c9-4002-b040-08a96ae196b5', 'weather', '{"base_url":"WEATHER_API_URL", "location":"beijing", "key":"APPKEY"}'); +COMMIT; + +-- --------------------------------------------------------------------------------------------------------------------- +-- Demo Data for table `myems_system_db`.`tbl_distribution_circuits` +-- --------------------------------------------------------------------------------------------------------------------- +START TRANSACTION; +USE `myems_system_db`; + +INSERT INTO `myems_system_db`.`tbl_distribution_circuits` +(`id`, `name`, `uuid`, `distribution_system_id`, `distribution_room`, `switchgear`, `peak_load`, `peak_current`, `customers`, `meters`) +VALUES +(1, '51W91', '52f7abe1-ba0e-47a6-a327-4faac42a1d11', 1, 'EW1', '51AL9', 30, 53.6, '地下室应急照明', 'ALE-1102, ALE-1082'); + +COMMIT; + +-- --------------------------------------------------------------------------------------------------------------------- +-- Demo Data for table `myems_system_db`.`tbl_distribution_circuits_points` +-- --------------------------------------------------------------------------------------------------------------------- +START TRANSACTION; +USE `myems_system_db`; + +INSERT INTO `myems_system_db`.`tbl_distribution_circuits_points` +(`id`, `distribution_circuit_id`, `point_id`) +VALUES (1, 1, 1); +COMMIT; + +-- --------------------------------------------------------------------------------------------------------------------- +-- Demo Data for table `myems_system_db`.`tbl_distribution_systems` +-- --------------------------------------------------------------------------------------------------------------------- +START TRANSACTION; +USE `myems_system_db`; + +INSERT INTO `myems_system_db`.`tbl_distribution_systems` +(`id`, `name`, `uuid`, `svg`, `description`) +VALUES +(1, '示例配电系统', '95652719-56fa-44cc-9bef-7aa47664d4ff', 'Four separate rectangles', 'demo distribution system'); + +COMMIT; + +-- --------------------------------------------------------------------------------------------------------------------- +-- Demo Data for table `myems_system_db`.`tbl_energy_categories` +-- --------------------------------------------------------------------------------------------------------------------- +START TRANSACTION; +USE `myems_system_db`; + +INSERT INTO `myems_system_db`.`tbl_energy_categories` +(`id`, `name`, `uuid`, `unit_of_measure`, `kgce`, `kgco2e`) +VALUES +(1, '电', '6d0753ed-8b43-4332-b6fd-d2f5813831d3', 'kWh', 0.1229, 0.928), +(2, '自来水', '3dbfa598-fccc-4d60-bf11-14bd55540c66', 'm³', 0.0857, 0.910), +(3, '天然气', '6d0753ed-8b43-4332-b6fd-d2f5813831d3', 'm³', 1.3300, 2.1622), +(4,'4℃冷冻水','d2a3021a-4911-4611-856e-80133000f1d5','m³',1.000,1.000), +(5,'7℃冷冻水','c1ad0696-e1ab-4e0c-a342-b194c0bc27e0','m³',1.000,1.000), +(6,'蒸汽','ac91a5c4-4ae5-4a73-8e3f-044591f42eef','T',1.000,1.000), +(7,'压缩空气','ff238e98-cd35-47c5-88a3-00617587775d','m³',1.000,1.000), +(8,'循环水','7e159a34-b2e6-4fd3-ba76-897d134abe06','m³',1.000,1.000), +(9, '热量','549f9cad-8db7-49d2-9473-95e37a3fc46a','KJ',1.000,1.000), +(10, '冷量','05aa257b-3cf6-4f19-808d-92e7dbf52b16','KJ',1.000,1.000), +(11, '中水','df6161b6-4a1b-46e7-b7c8-337b5b52d717','m³',1.000,1.000); +COMMIT; + +-- --------------------------------------------------------------------------------------------------------------------- +-- Demo Data for table `myems_system_db`.`tbl_energy_items` +-- --------------------------------------------------------------------------------------------------------------------- +START TRANSACTION; +USE `myems_system_db`; + +INSERT INTO `myems_system_db`.`tbl_energy_items` +(`id`, `name`, `uuid`, `energy_category_id`) +VALUES +(1, '空调用电', 'c5eac07a-e889-4a56-aa1b-a0b688c4e953', 1), +(2, '动力用电', '6875e4e0-a2ec-47a5-a88e-becb10e9603a', 1), +(3, '照明用电', '79918598-6477-4130-a85c-4cb87d0eac23', 1); + +COMMIT; + +-- --------------------------------------------------------------------------------------------------------------------- +-- Demo Data for table `myems_system_db`.`tbl_energy_flow_diagrams` +-- --------------------------------------------------------------------------------------------------------------------- +START TRANSACTION; +USE `myems_system_db`; + +INSERT INTO `myems_system_db`.`tbl_energy_flow_diagrams` +(`id`, `name`, `uuid`) +VALUES +(1, '低压配电系统', '3ccbc9c6-9575-4212-a63a-a688d1154302'); + +COMMIT; + +-- --------------------------------------------------------------------------------------------------------------------- +-- Demo Data for table `myems_system_db`.`tbl_energy_flow_diagrams_links` +-- --------------------------------------------------------------------------------------------------------------------- +START TRANSACTION; +USE `myems_system_db`; + +INSERT INTO `myems_system_db`.`tbl_energy_flow_diagrams_links` +(`id`, `energy_flow_diagram_id`, `name`) +VALUES +(1, 1, 1, 3, '5ca47bc5-22c2-47fc-b906-33222191ea40'), +(2, 1, 2, 4, '5d4d2f06-6200-4671-b182-4cf32cd9228f'), +(3, 1, 2, 5, '7897665b-66ac-481d-9c31-2ab2ecbda16c'), +(4, 1, 2, 6, 'f0c278ec-eb32-4c5e-a35f-88643b00c367'), +(5, 1, 3, 7, '9918aa6c-79e9-4579-8f2e-a76eb9fe4e3e'), +(6, 1, 3, 8, '831cbc8c-1429-4840-946e-f0b389b2253e'), +(7, 1, 4, 9, 'd2fc8464-3f13-42a9-8a57-63f95f677f0f'), +(8, 1, 4, 10, '7e4b3831-887b-40e2-b7f8-4d77c6f206a9'); + +COMMIT; + +-- --------------------------------------------------------------------------------------------------------------------- +-- Demo Data for table `myems_system_db`.`tbl_energy_flow_diagrams_nodes` +-- --------------------------------------------------------------------------------------------------------------------- +START TRANSACTION; +USE `myems_system_db`; + +INSERT INTO `myems_system_db`.`tbl_energy_flow_diagrams_nodes` +(`id`, `energy_flow_diagram_id`, `name`) +VALUES +(1, 1, '10KV进线#1'), +(2, 1, '10KV进线#2'), +(3, 1, '租区'), +(4, 1, '公区'), +(5, 1, '酒店'), +(6, 1, '车库'), +(7, 1, '餐饮'), +(8, 1, '零售'), +(9, 1, '照明'), +(10, 1, '电梯'); + +COMMIT; + +-- --------------------------------------------------------------------------------------------------------------------- +-- Demo Data for table `myems_system_db`.`tbl_equipments` +-- --------------------------------------------------------------------------------------------------------------------- +START TRANSACTION; +USE `myems_system_db`; + +INSERT INTO `myems_system_db`.`tbl_equipments` +(`id`, `name`, `uuid`, `is_input_counted`, `is_output_counted`, `cost_center_id`, `description` ) +VALUES +(1, '设备1', 'bfa8b106-89a1-49ca-9b2b-a481ac41a873', true, false, 1, 'description'), +(2, '设备2', 'ad5798ec-d827-43d9-bf08-fc7516f9c4c8', true, false, 1, 'description'); + +COMMIT; + +-- --------------------------------------------------------------------------------------------------------------------- +-- Demo Data for table `myems_system_db`.`tbl_equipments_meters` +-- --------------------------------------------------------------------------------------------------------------------- +START TRANSACTION; +USE `myems_system_db`; + +INSERT INTO `myems_system_db`.`tbl_equipments_meters` +(`id`, `equipment_id`, `meter_id`, `is_output`) +VALUES +(1, 1, 1, false); + +COMMIT; + +-- --------------------------------------------------------------------------------------------------------------------- +-- Demo Data for table `myems_system_db`.`tbl_equipments_offline_meters` +-- --------------------------------------------------------------------------------------------------------------------- +START TRANSACTION; +USE `myems_system_db`; + +INSERT INTO `myems_system_db`.`tbl_equipments_offline_meters` +(`id`, `equipment_id`, `offline_meter_id`, `is_output`) +VALUES +(1, 1, 1, false); + +COMMIT; + +-- --------------------------------------------------------------------------------------------------------------------- +-- Demo Data for table `myems_system_db`.`tbl_equipments_parameters` +-- --------------------------------------------------------------------------------------------------------------------- +START TRANSACTION; +USE `myems_system_db`; + +INSERT INTO `myems_system_db`.`tbl_equipments_parameters` +(`id`, `equipment_id`, `name`, `parameter_type`, `constant`, `point_id`, `numerator_meter_uuid`, `denominator_meter_uuid`) +VALUES +(1, 1, 'serial number', 'constant', 'bfa8b106', NULL, NULL, NULL), +(2, 1, 'manufacturer', 'constant', 'York', NULL, NULL, NULL), +(3, 1, 'maintainer', 'constant', 'Johnson Controls', NULL, NULL, NULL), +(4, 1, 'use life start', 'constant', '2016-01-01', NULL, NULL, NULL), +(5, 1, 'use life end', 'constant', '2025-12-31', NULL, NULL, NULL), +(6, 1, 'model number', 'constant', 'CH01', NULL, NULL, NULL), +(7, 1, 'nominal cooling capacity', 'constant', '90.000 kW', NULL, NULL, NULL), +(8, 1, 'nominal cooling input power', 'constant', '100.000 kW', NULL, NULL, NULL), +(9, 1, 'nominal cooling cop', 'constant', '5', NULL, NULL, NULL), +(10, 1, 'nominal cooling operating current', 'constant', '120.000 A', NULL, NULL, NULL), +(11, 1, 'rated input power', 'constant', '100.000 kW', NULL, NULL, NULL), +(12, 1, 'nominal chilled water flow rate', 'constant', '30 m2/h', NULL, NULL, NULL), +(13, 1, 'nominal cooling water flow_rate', 'constant', '50 m2/h', NULL, NULL, NULL), +(14, 1, 'status', 'point', NULL, 1, NULL, NULL), +(15, 1, 'inlet chilled water temperature', 'point', NULL, 2, NULL, NULL), +(16, 1, 'chilled_water instantaneous flow rate', 'point', NULL, 3, NULL, NULL), +(17, 1, 'instantaneous power', 'point', NULL, 4, NULL, NULL), +(18, 1, 'COP', 'fraction', NULL, NULL, 'a4e0dbf0-528a-4cbb-88cc-563527900d40', '89ff5118-d0c2-4dd8-8098-a8698189b2ea'); + +COMMIT; + +-- --------------------------------------------------------------------------------------------------------------------- +-- Demo Data for table `myems_system_db`.`tbl_equipments_virtual_meters` +-- --------------------------------------------------------------------------------------------------------------------- +START TRANSACTION; +USE `myems_system_db`; + +INSERT INTO `myems_system_db`.`tbl_equipments_virtual_meters` +(`id`, `equipment_id`, `virtual_meter_id`, `is_output`) +VALUES +(1, 1, 1, false); + +COMMIT; + +-- --------------------------------------------------------------------------------------------------------------------- +-- Demo Data for table `myems_system_db`.`tbl_expressions` +-- --------------------------------------------------------------------------------------------------------------------- +START TRANSACTION; +USE `myems_system_db`; + +INSERT INTO `myems_system_db`.`tbl_expressions` +(`id`, `uuid`, `virtual_meter_id`, `equation`) +VALUES +(1, '3fff2cfb-f755-44c8-a919-6135205a8573', 1, 'x1+x2-x3'); +COMMIT; + +-- --------------------------------------------------------------------------------------------------------------------- +-- Demo Data for table `myems_system_db`.`tbl_gateways` +-- --------------------------------------------------------------------------------------------------------------------- +START TRANSACTION; +USE `myems_system_db`; + +INSERT INTO `myems_system_db`.`tbl_gateways` +(`id`, `name`, `uuid`, `token`, `last_seen_datetime_utc`) +VALUES +(1, 'MyEMS Gateway 1', 'dc681934-5053-4660-98ed-266c54227231', '983427af-1c35-42ba-8b4d-288675550225', null), +(2, 'MyEMS Gateway 2', '8f75c0ab-9296-49c7-9058-8139febd0c31', 'd3860971-e6e0-4c98-9eba-5492869c5b19', null); + +COMMIT; + +-- --------------------------------------------------------------------------------------------------------------------- +-- Demo Data for table `myems_system_db`.`tbl_knowledge_files` +-- --------------------------------------------------------------------------------------------------------------------- + +-- --------------------------------------------------------------------------------------------------------------------- +-- Demo Data for table `myems_system_db`.`tbl_meters` +-- --------------------------------------------------------------------------------------------------------------------- +START TRANSACTION; +USE `myems_system_db`; + +INSERT INTO `myems_system_db`.`tbl_meters` +(`id`, `name`, `uuid`, `energy_category_id`, `is_counted`, `hourly_low_limit`, `hourly_high_limit`, `cost_center_id`, `energy_item_id`, `master_meter_id`, `description`) +VALUES +(1, '示例表1', '5ca47bc5-22c2-47fc-b906-33222191ea40', 1, true, 0.000, 999.999, 1, 1, null, 'meter1'), +(2, '示例表2', '5ca47bc5-22c2-47fc-b906-33222191ea40', 1, true, 0.000, 999.999, 1, 1, 1, 'meter2'), +(3, '示例表3', '6db58cd6-33d3-58ed-a095-22333202fb51', 1, true, 0.000, 999.999, 1, 1, 1, 'meter3'); + +COMMIT; + +-- --------------------------------------------------------------------------------------------------------------------- +-- Demo Data for table `myems_system_db`.`tbl_meters_points` +-- --------------------------------------------------------------------------------------------------------------------- +START TRANSACTION; +USE `myems_system_db`; + +INSERT INTO `myems_system_db`.`tbl_meters_points` +(`id`, `meter_id`, `point_id`) +VALUES (1, 1, 1); + +COMMIT; + +-- --------------------------------------------------------------------------------------------------------------------- +-- Demo Data for table `myems_system_db`.`tbl_offline_meters` +-- --------------------------------------------------------------------------------------------------------------------- +START TRANSACTION; +USE `myems_system_db`; + +INSERT INTO `myems_system_db`.`tbl_offline_meters` +(`id`, `name`, `uuid`, `energy_category_id`, `is_counted`, `max_hourly_value`, `cost_center_id`, `energy_item_id`, `description`) +VALUES +(1, '示例离线表', '62f473e0-1a35-41f3-9c30-8110d75d65bb', 1, true, 999.99, 1, 1, 'offlinemeter1'); + +COMMIT; + +-- --------------------------------------------------------------------------------------------------------------------- +-- Demo Data for table `myems_system_db`.`tbl_points` +-- --------------------------------------------------------------------------------------------------------------------- +-- List of Object Type +-- ENERGY_VALUE +-- ANALOG_VALUE +-- DIGITAL_VALUE + +START TRANSACTION; +USE `myems_system_db`; + +INSERT INTO `myems_system_db`.`tbl_points` +(`id`, `name`, `data_source_id`, `object_type`, `units`, `high_limit`, `low_limit`, `ratio`, `is_trend`, `address`, `description` ) +VALUES +(1, 'Active Energy Import Tariff 1', 1, 'ENERGY_VALUE', 'kWh', 99999999999, 0, 1.000, true, + '{\"slave_id\":1, \"function_code\":3, \"offset\":801, \"number_of_registers\":4, \"format\":\"=d\", \"swap_adjacent_bytes\":false}', null), + +(2, 'Working hours counter', 1, 'ANALOG_VALUE', 'S', 999999999, 0, 1.000, true, + '{\"slave_id\":1, \"function_code\":3, \"offset\":209, \"number_of_registers\":2, \"format\":\"=L\", \"swap_adjacent_bytes\":true}', null), + +(3, 'Current a', 1, 'ANALOG_VALUE', 'A', 5, 0, 1.000, true, + '{\"slave_id\":1, \"function_code\":3, \"offset\":13, \"number_of_registers\":2, \"format\":\"=f\", \"swap_adjacent_bytes\":false}', null), + +(4, 'Active Power a', 1, 'ANALOG_VALUE', 'W', 3450, 0, 1.000, true, + '{\"slave_id\":1, \"function_code\":3, \"offset\":25, \"number_of_registers\":2, \"format\":\"=f\", \"swap_adjacent_bytes\":false}', null), + +(5, 'Power Factor a', 1, 'ANALOG_VALUE', 'W', 1, 0, 1.000, true, + '{\"slave_id\":1, \"function_code\":3, \"offset\":37, \"number_of_registers\":2, \"format\":\"=f\", \"swap_adjacent_bytes\":false}', null), + +(6, '示例ModbusTCP数据点6', 2, 'ENERGY_VALUE', 'Wh', 99999999999, 0, 1.000, true, + '{\"slave_id\":1, \"function_code\":3, \"offset\":40001, \"number_of_registers\":2, \"format\":\"=f\", \"swap_adjacent_bytes\":false}', null), + +(7, '示例数据点7', 2, 'ANALOG_VALUE', 'V', 690, 0, 1.000, true, + '{\"slave_id\":1, \"function_code\":3, \"offset\":40002, \"number_of_registers\":2, \"format\":\"=f\", \"swap_adjacent_bytes\":false}', null), + +(8, 'BACnet示例数据点1', 3, 'ANALOG_VALUE', 'V', 690, 0, 1.000, true, + '{\"object_type\":\"analogValue\", \"object_id\":3004860, \"property_name\":\"presentValue\", \"property_array_index\":null}', null), +-- BACnet Object Type +-- analogValue, analogInput, analogOutput, binaryValue, binaryInput, binaryOutput + +(9, 'S7示例数据点1', 4, 'ANALOG_VALUE', 'kWh', 99999999999, 0, 1.000, true, + '{\"area\":\"DB\", \"db_number\":700, \"start\":8, \"size\":4', null); +-- # S7 Area +-- 'PE', 'PA', 'MK', 'DB', 'CT', 'TM' + +COMMIT; + +-- --------------------------------------------------------------------------------------------------------------------- +-- Demo Data for table `myems_system_db`.`tbl_sensors` +-- --------------------------------------------------------------------------------------------------------------------- +START TRANSACTION; +USE `myems_system_db`; + +INSERT INTO `myems_system_db`.`tbl_sensors` +(`id`, `name`, `uuid`, `description`) +VALUES +(1, '示例传感器', 'ba450606-6f39-41e0-8caf-75b528635511', 'sensor description'); + +COMMIT; + +-- --------------------------------------------------------------------------------------------------------------------- +-- Demo Data for table `myems_system_db`.`tbl_sensors_points` +-- --------------------------------------------------------------------------------------------------------------------- +START TRANSACTION; +USE `myems_system_db`; + +INSERT INTO `myems_system_db`.`tbl_sensors_points` +(`id`, `sensor_id`, `point_id`) +VALUES (1, 1, 1); + +COMMIT; + +-- --------------------------------------------------------------------------------------------------------------------- +-- Demo Data for table `myems_system_db`.`tbl_shopfloors` +-- --------------------------------------------------------------------------------------------------------------------- +START TRANSACTION; +USE `myems_system_db`; + +INSERT INTO `myems_system_db`.`tbl_shopfloors` +(`id`, `name`, `uuid` , `area`, `contact_id`, `is_input_counted`, `cost_center_id`, `description`) +VALUES +(1, 'MyEMS Shopfloor', 'd03837fd-9d30-44fe-9443-154f7c7e15f1', 99999.999, 1, true, 1, 'MyEMS Project'); +COMMIT; + +-- --------------------------------------------------------------------------------------------------------------------- +-- Demo Data for table `myems_system_db`.`tbl_shopfloors_equipments` +-- --------------------------------------------------------------------------------------------------------------------- +START TRANSACTION; +USE `myems_system_db`; + +INSERT INTO `myems_system_db`.`tbl_shopfloors_equipments` +(`id`, `shopfloor_id`, `equipment_id`) +VALUES +(1, 1, 1); + +COMMIT; + +-- --------------------------------------------------------------------------------------------------------------------- +-- Demo Data for table `myems_system_db`.`tbl_shopfloors_meters` +-- --------------------------------------------------------------------------------------------------------------------- +START TRANSACTION; +USE `myems_system_db`; + +INSERT INTO `myems_system_db`.`tbl_shopfloors_meters` +(`id`, `shopfloor_id`, `meter_id`) +VALUES +(1, 1, 1); + +COMMIT; + +-- --------------------------------------------------------------------------------------------------------------------- +-- Demo Data for table `myems_system_db`.`tbl_shopfloors_offline_meters` +-- --------------------------------------------------------------------------------------------------------------------- +START TRANSACTION; +USE `myems_system_db`; + +INSERT INTO `myems_system_db`.`tbl_shopfloors_offline_meters` +(`id`, `shopfloor_id`, `offline_meter_id`) +VALUES +(1, 1, 1); + +COMMIT; + +-- --------------------------------------------------------------------------------------------------------------------- +-- Demo Data for table `myems_system_db`.`tbl_shopfloors_sensors` +-- --------------------------------------------------------------------------------------------------------------------- +START TRANSACTION; +USE `myems_system_db`; + +INSERT INTO `myems_system_db`.`tbl_shopfloors_sensors` +(`id`, `shopfloor_id`, `sensor_id`) +VALUES +(1, 1, 1); + +COMMIT; + +-- --------------------------------------------------------------------------------------------------------------------- +-- Demo Data for table `myems_system_db`.`tbl_shopfloors_virtual_meters` +-- --------------------------------------------------------------------------------------------------------------------- +START TRANSACTION; +USE `myems_system_db`; + +INSERT INTO `myems_system_db`.`tbl_shopfloors_virtual_meters` +(`id`, `shopfloor_id`, `virtual_meter_id`) +VALUES +(1, 1, 1); + +COMMIT; + +-- --------------------------------------------------------------------------------------------------------------------- +-- Demo Data for table `myems_system_db`.`tbl_shopfloors_points` +-- --------------------------------------------------------------------------------------------------------------------- +START TRANSACTION; +USE `myems_system_db`; + +INSERT INTO `myems_system_db`.`tbl_shopfloors_points` +(`id`, `shopfloor_id`, `point_id`) +VALUES +(1, 3, 2000001), +(2, 3, 2000002), +(3, 3, 2000003), +(4, 3, 2000006); + +COMMIT; + +-- --------------------------------------------------------------------------------------------------------------------- +-- Demo Data for table `myems_system_db`.`tbl_spaces` +-- --------------------------------------------------------------------------------------------------------------------- +START TRANSACTION; +USE `myems_system_db`; + +INSERT INTO `myems_system_db`.`tbl_spaces` +(`id`, `name`, `uuid`, `parent_space_id`, `area`, `timezone_id`, `contact_id`, `is_input_counted`, `is_output_counted`, `cost_center_id`, `description`) +VALUES +(2, 'MyEMS Building #1', '8f25b33b-db93-49b3-b0f8-b01e0c19df29', 1, 88888.888, 56, 1, true, true, 1, 'MyEMS Project'), +(3, 'MyEMS Building #2', '195d7ea8-17b4-4e9c-bb37-546428155438', 1, 66666.666, 56, 1, true, true, 1, 'MyEMS Project'); +COMMIT; + +-- --------------------------------------------------------------------------------------------------------------------- +-- Demo Data for table `myems_system_db`.`tbl_spaces_combined_equipments` +-- --------------------------------------------------------------------------------------------------------------------- +START TRANSACTION; +USE `myems_system_db`; + +INSERT INTO `myems_system_db`.`tbl_spaces_combined_equipments` +(`id`, `space_id`, `combined_equipment_id`) +VALUES +(1, 1, 1); + +COMMIT; + +-- --------------------------------------------------------------------------------------------------------------------- +-- Demo Data for table `myems_system_db`.`tbl_spaces_equipments` +-- --------------------------------------------------------------------------------------------------------------------- +START TRANSACTION; +USE `myems_system_db`; + +INSERT INTO `myems_system_db`.`tbl_spaces_equipments` +(`id`, `space_id`, `equipment_id`) +VALUES +(1, 1, 1); + +COMMIT; + +-- --------------------------------------------------------------------------------------------------------------------- +-- Demo Data for table `myems_system_db`.`tbl_spaces_meters` +-- --------------------------------------------------------------------------------------------------------------------- +START TRANSACTION; +USE `myems_system_db`; + +INSERT INTO `myems_system_db`.`tbl_spaces_meters` +(`id`, `space_id`, `meter_id`) +VALUES +(1, 1, 1); + +COMMIT; + +-- --------------------------------------------------------------------------------------------------------------------- +-- Demo Data for table `myems_system_db`.`tbl_spaces_offline_meters` +-- --------------------------------------------------------------------------------------------------------------------- +START TRANSACTION; +USE `myems_system_db`; + +INSERT INTO `myems_system_db`.`tbl_spaces_offline_meters` +(`id`, `space_id`, `offline_meter_id`) +VALUES +(1, 1, 1); + +COMMIT; + +-- --------------------------------------------------------------------------------------------------------------------- +-- Demo Data for table `myems_system_db`.`tbl_spaces_sensors` +-- --------------------------------------------------------------------------------------------------------------------- +START TRANSACTION; +USE `myems_system_db`; + +INSERT INTO `myems_system_db`.`tbl_spaces_sensors` +(`id`, `space_id`, `sensor_id`) +VALUES +(1, 1, 1); + +COMMIT; + +-- --------------------------------------------------------------------------------------------------------------------- +-- Demo Data for table `myems_system_db`.`tbl_spaces_shopfloors` +-- --------------------------------------------------------------------------------------------------------------------- +START TRANSACTION; +USE `myems_system_db`; + +INSERT INTO `myems_system_db`.`tbl_spaces_shopfloors` +(`id`, `space_id`, `shopfloor_id`) +VALUES +(1, 1, 1); + +COMMIT; + +-- --------------------------------------------------------------------------------------------------------------------- +-- Demo Data for table `myems_system_db`.`tbl_spaces_stores` +-- --------------------------------------------------------------------------------------------------------------------- +START TRANSACTION; +USE `myems_system_db`; + +INSERT INTO `myems_system_db`.`tbl_spaces_stores` +(`id`, `space_id`, `store_id`) +VALUES +(1, 1, 1); + +COMMIT; + +-- --------------------------------------------------------------------------------------------------------------------- +-- Demo Data for table `myems_system_db`.`tbl_spaces_tenants` +-- --------------------------------------------------------------------------------------------------------------------- +START TRANSACTION; +USE `myems_system_db`; + +INSERT INTO `myems_system_db`.`tbl_spaces_tenants` +(`id`, `space_id`, `tenant_id`) +VALUES +(1, 1, 1); + +COMMIT; + +-- --------------------------------------------------------------------------------------------------------------------- +-- Demo Data for table `myems_system_db`.`tbl_spaces_virtual_meters` +-- --------------------------------------------------------------------------------------------------------------------- +START TRANSACTION; +USE `myems_system_db`; + +INSERT INTO `myems_system_db`.`tbl_spaces_virtual_meters` +(`id`, `space_id`, `virtual_meter_id`) +VALUES +(1, 1, 1); + +COMMIT; + +-- --------------------------------------------------------------------------------------------------------------------- +-- Demo Data for table `myems_system_db`.`tbl_spaces_points` +-- --------------------------------------------------------------------------------------------------------------------- +START TRANSACTION; +USE `myems_system_db`; + +INSERT INTO `myems_system_db`.`tbl_spaces_points` +(`id`, `space_id`, `point_id`) +VALUES +(1, 3, 2000001), +(2, 3, 2000002), +(3, 3, 2000003), +(4, 3, 2000006); + +COMMIT; + +-- --------------------------------------------------------------------------------------------------------------------- +-- Demo Data for table `myems_system_db`.`tbl_tariffs` +-- --------------------------------------------------------------------------------------------------------------------- +START TRANSACTION; +USE `myems_system_db`; + +INSERT INTO `myems_system_db`.`tbl_tariffs` +(`id`, `name`, `uuid`, `energy_category_id`, `tariff_type`, `unit_of_price`, `valid_from_datetime_utc`, `valid_through_datetime_utc`) +VALUES +(1, '2020分时电价1-6', '590efb36-8587-42a9-ae6f-c715d21496d6', 1, 'timeofuse', '元/千瓦时', '2019-12-31 16:00:00', '2020-06-30 15:59:59'), +(2, '2020分时电价7-9', 'f5966640-18fc-437a-9efd-cbc0c58b6373', 1, 'timeofuse', '元/千瓦时', '2020-06-30 16:00:00', '2020-09-30 15:59:59'), +(3, '2020分时电价10-12', '21727a1b-4b27-4186-b72e-db46e6e2d980', 1, 'timeofuse', '元/千瓦时', '2020-09-30 16:00:00', '2020-12-31 15:59:59'), +(4, '2021分时电价1-6', 'fe65e443-0ec2-4a16-823e-2365885e2598', 1, 'timeofuse', '元/千瓦时', '2020-12-31 16:00:00', '2021-06-30 15:59:59'), +(5, '2021分时电价7-9', 'd1285c81-4612-4d7c-9436-ed11b4e7abe4', 1, 'timeofuse', '元/千瓦时', '2021-06-30 16:00:00', '2021-09-30 15:59:59'), +(6, '2021分时电价10-12', 'e6c275b4-47eb-4f5d-bc59-edbe45c2a407', 1, 'timeofuse', '元/千瓦时', '2021-09-30 16:00:00', '2021-12-31 15:59:59'), +(7, '2022分时电价1-6', 'ca359f72-48ad-46a7-82af-cecbe98450e8', 1, 'timeofuse', '元/千瓦时', '2021-12-31 16:00:00', '2022-06-30 15:59:59'), +(8, '2022分时电价7-9', '9fdda603-0f8f-4452-ad59-c5df54bc35f4', 1, 'timeofuse', '元/千瓦时', '2022-06-30 16:00:00', '2022-09-30 15:59:59'), +(9, '2022分时电价10-12', 'fb0442e7-4d44-4bfd-8b20-cad3f77a2480', 1, 'timeofuse', '元/千瓦时', '2022-09-30 16:00:00', '2022-12-31 15:59:59'), +(10, '2023分时电价1-6', '3fa6e1f2-7d08-4f5a-bcbf-beb041d569c0', 1, 'timeofuse', '元/千瓦时', '2022-12-31 16:00:00', '2023-06-30 15:59:59'), +(11, '2023分时电价7-9', '787240fb-1694-403e-a0a7-83d7be1cc0b8', 1, 'timeofuse', '元/千瓦时', '2023-06-30 16:00:00', '2023-09-30 15:59:59'), +(12, '2023分时电价10-12', 'a07fdf76-edcf-4124-96e7-ab733a5a4b70', 1, 'timeofuse', '元/千瓦时', '2023-09-30 16:00:00', '2023-12-31 15:59:59'), +(13, '自来水', '6fcbc77e-effb-4d43-9b30-77b062435d34', 2, 'timeofuse', '元/m³', '2019-12-31 16:00:00', '2023-12-31 15:59:59'), +(14, '天然气', '6a4c56ff-b3e1-4555-9b1c-87d05bcfa4d9', 3, 'timeofuse', '元/m³', '2019-12-31 16:00:00', '2023-12-31 15:59:59'), +(15, '分量阶梯电价', 'd1b81d2f-d387-43d3-affd-d796b7236b60', 1, 'block', '元/千瓦时', '2019-12-31 16:00:00', '2023-12-31 15:59:59'); + +COMMIT; + +-- --------------------------------------------------------------------------------------------------------------------- +-- Demo Data for table `myems_system_db`.`tbl_tariffs_timeofuses` +-- --------------------------------------------------------------------------------------------------------------------- +START TRANSACTION; +USE `myems_system_db`; + +INSERT INTO `myems_system_db`.`tbl_tariffs_timeofuses` +(`id`, `tariff_id`, `start_time_of_day`, `end_time_of_day`, `peak_type`, `price`) +VALUES +-- '2020分时电价1-6' +(1, 1, '00:00:00', '05:59:59', 'offpeak', 0.345), +(2, 1, '06:00:00', '07:59:59', 'midpeak', 0.708), +(3, 1, '08:00:00', '10:59:59', 'onpeak', 1.159), +(4, 1, '11:00:00', '17:59:59', 'midpeak', 0.708), +(5, 1, '18:00:00', '20:59:59', 'onpeak', 1.159), +(6, 1, '21:00:00', '21:59:59', 'midpeak', 0.708), +(7, 1, '22:00:00', '23:59:59', 'offpeak', 0.345), +-- '2020分时电价7-9' +(8, 2, '00:00:00', '05:59:59', 'offpeak', 0.345), +(9, 2, '06:00:00', '07:59:59', 'midpeak', 0.708), +(10, 2, '08:00:00', '10:59:59', 'offpeak', 1.159), +(11, 2, '11:00:00', '12:59:59', 'midpeak', 0.708), +(12, 2, '13:00:00', '14:59:59', 'onpeak', 1.159), +(13, 2, '15:00:00', '17:59:59', 'midpeak', 0.708), +(14, 2, '18:00:00', '20:59:59', 'onpeak', 1.159), +(15, 2, '21:00:00', '21:59:59', 'midpeak', 0.708), +(16, 2, '22:00:00', '23:59:59', 'offpeak', 0.345), +-- '2020分时电价10-12' +(17, 3, '00:00:00', '05:59:59', 'offpeak', 0.345), +(18, 3, '06:00:00', '07:59:59', 'midpeak', 0.708), +(19, 3, '08:00:00', '10:59:59', 'onpeak', 1.159), +(20, 3, '11:00:00', '17:59:59', 'midpeak', 0.708), +(21, 3, '18:00:00', '20:59:59', 'onpeak', 1.159), +(22, 3, '21:00:00', '21:59:59', 'midpeak', 0.708), +(23, 3, '22:00:00', '23:59:59', 'offpeak', 0.345), +-- '2021分时电价1-6' +(24, 4, '00:00:00', '05:59:59', 'offpeak', 0.345), +(25, 4, '06:00:00', '07:59:59', 'midpeak', 0.708), +(26, 4, '08:00:00', '10:59:59', 'onpeak', 1.159), +(27, 4, '11:00:00', '17:59:59', 'midpeak', 0.708), +(28, 4, '18:00:00', '20:59:59', 'onpeak', 1.159), +(29, 4, '21:00:00', '21:59:59', 'midpeak', 0.708), +(30, 4, '22:00:00', '23:59:59', 'offpeak', 0.345), +-- '2021分时电价7-9' +(31, 5, '00:00:00', '05:59:59', 'offpeak', 0.345), +(32, 5, '06:00:00', '07:59:59', 'midpeak', 0.708), +(33, 5, '08:00:00', '10:59:59', 'offpeak', 1.159), +(34, 5, '11:00:00', '12:59:59', 'midpeak', 0.708), +(35, 5, '13:00:00', '14:59:59', 'onpeak', 1.159), +(36, 5, '15:00:00', '17:59:59', 'midpeak', 0.708), +(37, 5, '18:00:00', '20:59:59', 'onpeak', 1.159), +(38, 5, '21:00:00', '21:59:59', 'midpeak', 0.708), +(39, 5, '22:00:00', '23:59:59', 'offpeak', 0.345), +-- '2021分时电价10-12' +(40, 6, '00:00:00', '05:59:59', 'offpeak', 0.345), +(41, 6, '06:00:00', '07:59:59', 'midpeak', 0.708), +(42, 6, '08:00:00', '10:59:59', 'onpeak', 1.159), +(43, 6, '11:00:00', '17:59:59', 'midpeak', 0.708), +(44, 6, '18:00:00', '20:59:59', 'onpeak', 1.159), +(45, 6, '21:00:00', '21:59:59', 'midpeak', 0.708), +(46, 6, '22:00:00', '23:59:59', 'offpeak', 0.345), +-- '2022分时电价1-6' +(47, 7, '00:00:00', '05:59:59', 'offpeak', 0.345), +(48, 7, '06:00:00', '07:59:59', 'midpeak', 0.708), +(49, 7, '08:00:00', '10:59:59', 'onpeak', 1.159), +(50, 7, '11:00:00', '17:59:59', 'midpeak', 0.708), +(51, 7, '18:00:00', '20:59:59', 'onpeak', 1.159), +(52, 7, '21:00:00', '21:59:59', 'midpeak', 0.708), +(53, 7, '22:00:00', '23:59:59', 'offpeak', 0.345), +-- '2022分时电价7-9' +(54, 8, '00:00:00', '05:59:59', 'offpeak', 0.345), +(55, 8, '06:00:00', '07:59:59', 'midpeak', 0.708), +(56, 8, '08:00:00', '10:59:59', 'offpeak', 1.159), +(57, 8, '11:00:00', '12:59:59', 'midpeak', 0.708), +(58, 8, '13:00:00', '14:59:59', 'onpeak', 1.159), +(59, 8, '15:00:00', '17:59:59', 'midpeak', 0.708), +(60, 8, '18:00:00', '20:59:59', 'onpeak', 1.159), +(61, 8, '21:00:00', '21:59:59', 'midpeak', 0.708), +(62, 8, '22:00:00', '23:59:59', 'offpeak', 0.345), +-- '2022分时电价10-12' +(63, 9, '00:00:00', '05:59:59', 'offpeak', 0.345), +(64, 9, '06:00:00', '07:59:59', 'midpeak', 0.708), +(65, 9, '08:00:00', '10:59:59', 'onpeak', 1.159), +(66, 9, '11:00:00', '17:59:59', 'midpeak', 0.708), +(67, 9, '18:00:00', '20:59:59', 'onpeak', 1.159), +(68, 9, '21:00:00', '21:59:59', 'midpeak', 0.708), +(69, 9, '22:00:00', '23:59:59', 'offpeak', 0.345), +-- '2023分时电价1-6' +(70, 10, '00:00:00', '05:59:59', 'offpeak', 0.345), +(71, 10, '06:00:00', '07:59:59', 'midpeak', 0.708), +(72, 10, '08:00:00', '10:59:59', 'onpeak', 1.159), +(73, 10, '11:00:00', '17:59:59', 'midpeak', 0.708), +(74, 10, '18:00:00', '20:59:59', 'onpeak', 1.159), +(75, 10, '21:00:00', '21:59:59', 'midpeak', 0.708), +(76, 10, '22:00:00', '23:59:59', 'offpeak', 0.345), +-- '2023分时电价7-9' +(77, 11, '00:00:00', '05:59:59', 'offpeak', 0.345), +(78, 11, '06:00:00', '07:59:59', 'midpeak', 0.708), +(79, 11, '08:00:00', '10:59:59', 'offpeak', 1.159), +(80, 11, '11:00:00', '12:59:59', 'midpeak', 0.708), +(81, 11, '13:00:00', '14:59:59', 'onpeak', 1.159), +(82, 11, '15:00:00', '17:59:59', 'midpeak', 0.708), +(83, 11, '18:00:00', '20:59:59', 'onpeak', 1.159), +(84, 11, '21:00:00', '21:59:59', 'midpeak', 0.708), +(85, 11, '22:00:00', '23:59:59', 'offpeak', 0.345), +-- '2023分时电价10-12' +(86, 12, '00:00:00', '05:59:59', 'offpeak', 0.345), +(87, 12, '06:00:00', '07:59:59', 'midpeak', 0.708), +(88, 12, '08:00:00', '10:59:59', 'onpeak', 1.159), +(89, 12, '11:00:00', '17:59:59', 'midpeak', 0.708), +(90, 12, '18:00:00', '20:59:59', 'onpeak', 1.159), +(91, 12, '21:00:00', '21:59:59', 'midpeak', 0.708), +(92, 12, '22:00:00', '23:59:59', 'offpeak', 0.345), +-- '自来水' +-- 'Water' +(93, 13, '00:00:00', '23:59:59', 'midpeak', 5.95), +-- '天然气' +-- 'Natual Gas' +(94, 14, '00:00:00', '23:59:59', 'midpeak', 3.50); +COMMIT; + +-- --------------------------------------------------------------------------------------------------------------------- +-- Demo Data for table `myems_system_db`.`tbl_tariffs_blocks` +-- --------------------------------------------------------------------------------------------------------------------- +START TRANSACTION; +USE `myems_system_db`; + +INSERT INTO `myems_system_db`.`tbl_tariffs_blocks` +(`id`, `tariff_id`, `start_amount`, `end_amount`, `price`) +VALUES +-- '分量阶梯电价' +-- 'Block tariff of electrical' +(1, 15, 0, 10000, 0.345), +(2, 15, 10000, 30000, 0.456), +(3, 15, 30000, 100000, 0.567), +(4, 15, 100000, 1000000000, 0.678); + +COMMIT; + +-- --------------------------------------------------------------------------------------------------------------------- +-- Demo Data for table `myems_system_db`.`tbl_stores` +-- --------------------------------------------------------------------------------------------------------------------- +START TRANSACTION; +USE `myems_system_db`; + +INSERT INTO `myems_system_db`.`tbl_stores` +(`id`, `name`, `uuid`, `address`, `latitude`, `longitude`, `area`, `store_type_id`, `is_input_counted`, `contact_id`, `cost_center_id`, `description`) +VALUES +(1, '麦当劳(祈年大街得来速店)', 'd8a24322-4bab-4ba2-aedc-5d55a84c3db8', '北京市东城区东打磨厂街7号', 39.899493, 116.412041, 500.000, 1, true, 1, 1, 'MacDonalds'); +COMMIT; + +-- --------------------------------------------------------------------------------------------------------------------- +-- Demo Data for table `myems_system_db`.`tbl_store_types` +-- --------------------------------------------------------------------------------------------------------------------- +START TRANSACTION; +USE `myems_system_db`; + +INSERT INTO `myems_system_db`.`tbl_store_types` +(`id`, `name`, `uuid`, `description`, `simplified_code`) +VALUES +(1, 'Restaurant', '494d7d5e-e139-4629-b957-99ea4caf0401', '餐饮', 'RS'), +(2, 'Retail', '1f556579-9d5c-45ce-9bd8-f2dc1d033470', '零售', 'RT'), +(3, 'Hotel', 'cae697aa-ceca-435d-91bf-492b46607eb0', '酒店', 'HT'); + +COMMIT; + +-- --------------------------------------------------------------------------------------------------------------------- +-- Demo Data for table `myems_system_db`.`tbl_stores_meters` +-- --------------------------------------------------------------------------------------------------------------------- +START TRANSACTION; +USE `myems_system_db`; + +INSERT INTO `myems_system_db`.`tbl_stores_meters` +(`id`, `store_id`, `meter_id`) +VALUES +(1, 1, 1); + +COMMIT; + +-- --------------------------------------------------------------------------------------------------------------------- +-- Demo Data for table `myems_system_db`.`tbl_stores_offline_meters` +-- --------------------------------------------------------------------------------------------------------------------- +START TRANSACTION; +USE `myems_system_db`; + +INSERT INTO `myems_system_db`.`tbl_stores_offline_meters` +(`id`, `store_id`, `offline_meter_id`) +VALUES +(1, 1, 1); + +COMMIT; + +-- --------------------------------------------------------------------------------------------------------------------- +-- Demo Data for table `myems_system_db`.`tbl_stores_points` +-- --------------------------------------------------------------------------------------------------------------------- +START TRANSACTION; +USE `myems_system_db`; + +INSERT INTO `myems_system_db`.`tbl_stores_points` +(`id`, store_id`, `point_id`) +VALUES +(1, 3, 2000001), +(2, 3, 2000002), +(3, 3, 2000003), +(4, 3, 2000006); + +COMMIT; + +-- --------------------------------------------------------------------------------------------------------------------- +-- Demo Data for table `myems_system_db`.`tbl_stores_sensors` +-- --------------------------------------------------------------------------------------------------------------------- +START TRANSACTION; +USE `myems_system_db`; + +INSERT INTO `myems_system_db`.`tbl_stores_sensors` +(`id`, `store_id`, `sensor_id`) +VALUES +(1, 1, 1); + +COMMIT; + +-- --------------------------------------------------------------------------------------------------------------------- +-- Demo Data for table `myems_system_db`.`tbl_stores_virtual_meters` +-- --------------------------------------------------------------------------------------------------------------------- +START TRANSACTION; +USE `myems_system_db`; + +INSERT INTO `myems_system_db`.`tbl_stores_virtual_meters` +(`id`, `store_id`, `virtual_meter_id`) +VALUES +(1, 1, 1); + +COMMIT; + +-- --------------------------------------------------------------------------------------------------------------------- +-- Demo Data for table `myems_system_db`.`tbl_tenants` +-- --------------------------------------------------------------------------------------------------------------------- +START TRANSACTION; +USE `myems_system_db`; + +INSERT INTO `myems_system_db`.`tbl_tenants` +(`id`, `name`, `uuid`, `buildings`, `floors`, `rooms`, `area`, `tenant_type_id`, `is_input_counted`, `is_key_tenant`, + `lease_number`, `lease_start_datetime_utc`, `lease_end_datetime_utc`, `is_in_lease`, `contact_id`, `cost_center_id`, `description`) +VALUES +(1, 'Starbucks星巴克', '6b0da806-a4cd-431a-8116-2915e90aaf8b', 'Building #1', 'L1 L2 L3', '1201b+2247+3F', 418.8, 9, true, true, + '6b0da806', '2019-12-31 16:00:00', '2022-12-31 16:00:00', true, 1, 1, 'my description'); +COMMIT; + +-- --------------------------------------------------------------------------------------------------------------------- +-- Demo Data for table `myems_system_db`.`tbl_tenant_types` +-- --------------------------------------------------------------------------------------------------------------------- +START TRANSACTION; +USE `myems_system_db`; + +INSERT INTO `myems_system_db`.`tbl_tenant_types` +(`id`, `name`, `uuid`, `description`, `simplified_code`) +VALUES +(1, '餐饮租户', '83fffba1-9e22-4397-a93a-3742772c3753', 'Food and Beverage', 'FNB'), +(2, '燃气餐饮租户', 'ad95ed16-1c57-49a9-a85e-71e389393089', 'Food and Beverage (Gas)', 'FNBGas'), +(3, '电餐饮租户', '1dc21e83-4333-40f8-9e25-ea049becba37', 'Food and Beverage (Electrical)', 'FNBElec'), +(4, '高照度租户', '4208a60d-d8e6-4fe5-8cea-a55109e9b397', 'High Illuminance Tenant', 'HighIllu'), +(5, '主力租户', 'fc4ae534-544a-4a22-b83b-9f4aa99494aa', 'Anchor Tenant', 'ANCH'), +(6, '普通商业租户', '6d1dca30-1cbe-463d-8a78-cdd5e0f8ac8b', 'Normal Tenant', 'Normal'), +(7, '其他商业租户', '2078e1c0-3936-4ae7-9253-08e0aa1d84b6', 'Other Retail Tenants', 'Other'), +(8, '整层办公租户', 'b2a580a3-edc9-4838-ae1d-7b7265860a9a', 'Whole Floor Office Tenant', 'WhFlr'), +(9, '非整层办公租户', '55bbcba7-d8a0-44a0-9a9f-2f085e3cb044', 'None-Whole Floor Office Tenant', 'NonWhFlr'); + +COMMIT; + +-- --------------------------------------------------------------------------------------------------------------------- +-- Demo Data for table `myems_system_db`.`tbl_tenants_meters` +-- --------------------------------------------------------------------------------------------------------------------- +START TRANSACTION; +USE `myems_system_db`; + +INSERT INTO `myems_system_db`.`tbl_tenants_meters` +(`id`, `tenant_id`, `meter_id`) +VALUES +(1, 1, 1); + +COMMIT; + +-- --------------------------------------------------------------------------------------------------------------------- +-- Demo Data for table `myems_system_db`.`tbl_tenants_offline_meters` +-- --------------------------------------------------------------------------------------------------------------------- +START TRANSACTION; +USE `myems_system_db`; + +INSERT INTO `myems_system_db`.`tbl_tenants_offline_meters` +(`id`, `tenant_id`, `offline_meter_id`) +VALUES +(1, 1, 1); + +COMMIT; + +-- --------------------------------------------------------------------------------------------------------------------- +-- Demo Data for table `myems_system_db`.`tbl_tenants_points` +-- --------------------------------------------------------------------------------------------------------------------- +START TRANSACTION; +USE `myems_system_db`; + +INSERT INTO `myems_system_db`.`tbl_tenants_points` +(`id`, tenant_id`, `point_id`) +VALUES +(1, 3, 2000001), +(2, 3, 2000002), +(3, 3, 2000003), +(4, 3, 2000006); + +COMMIT; + +-- --------------------------------------------------------------------------------------------------------------------- +-- Demo Data for table `myems_system_db`.`tbl_tenants_sensors` +-- --------------------------------------------------------------------------------------------------------------------- +START TRANSACTION; +USE `myems_system_db`; + +INSERT INTO `myems_system_db`.`tbl_tenants_sensors` +(`id`, `tenant_id`, `sensor_id`) +VALUES +(1, 1, 1); + +COMMIT; + +-- --------------------------------------------------------------------------------------------------------------------- +-- Demo Data for table `myems_system_db`.`tbl_tenants_virtual_meters` +-- --------------------------------------------------------------------------------------------------------------------- +START TRANSACTION; +USE `myems_system_db`; + +INSERT INTO `myems_system_db`.`tbl_tenants_virtual_meters` +(`id`, `tenant_id`, `virtual_meter_id`) +VALUES +(1, 1, 1); + +COMMIT; + +-- --------------------------------------------------------------------------------------------------------------------- +-- Demo Data for table `myems_system_db`.`tbl_virtual_meters` +-- --------------------------------------------------------------------------------------------------------------------- +START TRANSACTION; +USE `myems_system_db`; + +INSERT INTO `myems_system_db`.`tbl_virtual_meters` +(`id`, `name`, `uuid`, `energy_category_id`, `is_counted`, `cost_center_id`, `energy_item_id`, `description`) +VALUES +(1, '示例虚拟表', '3fff2cfb-f755-44c8-a919-6135205a8573', 1, true, 1, 1, `virtual description`); + +COMMIT; + +-- --------------------------------------------------------------------------------------------------------------------- +-- Demo Data for table `myems_system_db`.`tbl_variables` +-- --------------------------------------------------------------------------------------------------------------------- +START TRANSACTION; +USE `myems_system_db`; +-- meter_type = {'meter', 'virtual_meter', 'offline_meter'} +INSERT INTO `myems_system_db`.`tbl_variables` +(`id`, `name`, `expression_id`, `meter_type`, `meter_id`) +VALUES +(1, 'x', 1, 'meter', 1), +(2, 'y', 1, 'meter', 2), +(3, 'z', 1, 'meter', 3); + +COMMIT; + diff --git a/database/myems_system_db.sql b/database/myems_system_db.sql index 92e3493c..5725960d 100644 --- a/database/myems_system_db.sql +++ b/database/myems_system_db.sql @@ -24,21 +24,6 @@ CREATE TABLE IF NOT EXISTS `myems_system_db`.`tbl_combined_equipments` ( PRIMARY KEY (`id`)); CREATE INDEX `tbl_combined_equipments_index_1` ON `myems_system_db`.`tbl_combined_equipments` (`name`); --- --------------------------------------------------------------------------------------------------------------------- --- Example Data for table `myems_system_db`.`tbl_combined_equipments` --- --------------------------------------------------------------------------------------------------------------------- --- START TRANSACTION; --- USE `myems_system_db`; - --- INSERT INTO `myems_system_db`.`tbl_combined_equipments` --- (`id`, `name`, `uuid`, `is_input_counted`, `is_output_counted`, `cost_center_id`, `description` ) --- VALUES --- (1, '组合式设备1', '48aab70f-2e32-4518-9986-a6b7395acf58', true, false, 1, 'description'), --- (2, '组合式设备2', 'c235e68c-e1be-4d7a-84e7-976c83ff6e44', true, false, 1, 'description'); - --- COMMIT; - - -- --------------------------------------------------------------------------------------------------------------------- -- Table `myems_system_db`.`tbl_combined_equipments_equipments` -- --------------------------------------------------------------------------------------------------------------------- @@ -51,18 +36,6 @@ CREATE TABLE IF NOT EXISTS `myems_system_db`.`tbl_combined_equipments_equipments PRIMARY KEY (`id`)); CREATE INDEX `tbl_combined_equipments_equipments_index_1` ON `myems_system_db`.`tbl_combined_equipments_equipments` (`combined_equipment_id`); --- --------------------------------------------------------------------------------------------------------------------- --- Example Data for table `myems_system_db`.`tbl_combined_equipments_equipments` --- --------------------------------------------------------------------------------------------------------------------- --- START TRANSACTION; --- USE `myems_system_db`; - --- INSERT INTO `myems_system_db`.`tbl_combined_equipments_equipments` --- (`id`, `combined_equipment_id`, `equipment_id`) --- VALUES --- (1, 1, 1); - --- COMMIT; -- --------------------------------------------------------------------------------------------------------------------- -- Table `myems_system_db`.`tbl_combined_equipments_meters` @@ -77,18 +50,6 @@ CREATE TABLE IF NOT EXISTS `myems_system_db`.`tbl_combined_equipments_meters` ( PRIMARY KEY (`id`)); CREATE INDEX `tbl_combined_equipments_meters_index_1` ON `myems_system_db`.`tbl_combined_equipments_meters` (`combined_equipment_id`); --- --------------------------------------------------------------------------------------------------------------------- --- Example Data for table `myems_system_db`.`tbl_combined_equipments_meters` --- --------------------------------------------------------------------------------------------------------------------- --- START TRANSACTION; --- USE `myems_system_db`; - --- INSERT INTO `myems_system_db`.`tbl_combined_equipments_meters` --- (`id`, `combined_equipment_id`, `meter_id`, `is_output`) --- VALUES --- (1, 1, 1, false); - --- COMMIT; -- --------------------------------------------------------------------------------------------------------------------- -- Table `myems_system_db`.`tbl_combined_equipments_offline_meters` @@ -103,18 +64,6 @@ CREATE TABLE IF NOT EXISTS `myems_system_db`.`tbl_combined_equipments_offline_me PRIMARY KEY (`id`)); CREATE INDEX `tbl_combined_equipments_offline_meters_index_1` ON `myems_system_db`.`tbl_combined_equipments_offline_meters` (`combined_equipment_id`); --- --------------------------------------------------------------------------------------------------------------------- --- Example Data for table `myems_system_db`.`tbl_combined_equipments_offline_meters` --- --------------------------------------------------------------------------------------------------------------------- --- START TRANSACTION; --- USE `myems_system_db`; - --- INSERT INTO `myems_system_db`.`tbl_combined_equipments_offline_meters` --- (`id`, `combined_equipment_id`, `offline_meter_id`, `is_output`) --- VALUES --- (1, 1, 1, false); - --- COMMIT; -- --------------------------------------------------------------------------------------------------------------------- -- Table `myems_system_db`.`tbl_combined_equipments_parameters` @@ -133,36 +82,6 @@ CREATE TABLE IF NOT EXISTS `myems_system_db`.`tbl_combined_equipments_parameters PRIMARY KEY (`id`)); CREATE INDEX `tbl_combined_equipment_parameters_index_1` ON `myems_system_db`.`tbl_combined_equipments_parameters` (`combined_equipment_id`); --- --------------------------------------------------------------------------------------------------------------------- --- Example Data for table `myems_system_db`.`tbl_combined_equipments_parameters` --- --------------------------------------------------------------------------------------------------------------------- --- START TRANSACTION; --- USE `myems_system_db`; --- --- INSERT INTO `myems_system_db`.`tbl_combined_equipments_parameters` --- (`id`, `combined_equipment_id`, `name`, `parameter_type`, `constant`, `point_id`, `numerator_meter_uuid`, `denominator_meter_uuid`) --- VALUES --- (1, 1, 'serial number', 'constant', 'bfa8b106', NULL, NULL, NULL), --- (2, 1, 'manufacturer', 'constant', 'York', NULL, NULL, NULL), --- (3, 1, 'maintainer', 'constant', 'Johnson Controls', NULL, NULL, NULL), --- (4, 1, 'use life start', 'constant', '2016-01-01', NULL, NULL, NULL), --- (5, 1, 'use life end', 'constant', '2025-12-31', NULL, NULL, NULL), --- (6, 1, 'model number', 'constant', 'CH01', NULL, NULL, NULL), --- (7, 1, 'nominal cooling capacity', 'constant', '90.000 kW', NULL, NULL, NULL), --- (8, 1, 'nominal cooling input power', 'constant', '100.000 kW', NULL, NULL, NULL), --- (9, 1, 'nominal cooling cop', 'constant', '5', NULL, NULL, NULL), --- (10, 1, 'nominal cooling operating current', 'constant', '120.000 A', NULL, NULL, NULL), --- (11, 1, 'rated input power', 'constant', '100.000 kW', NULL, NULL, NULL), --- (12, 1, 'nominal chilled water flow rate', 'constant', '30 m2/h', NULL, NULL, NULL), --- (13, 1, 'nominal cooling water flow_rate', 'constant', '50 m2/h', NULL, NULL, NULL), --- (14, 1, 'status', 'point', NULL, 1, NULL, NULL), --- (15, 1, 'inlet chilled water temperature', 'point', NULL, 2, NULL, NULL), --- (16, 1, 'chilled_water instantaneous flow rate', 'point', NULL, 3, NULL, NULL), --- (17, 1, 'instantaneous power', 'point', NULL, 4, NULL, NULL), --- (18, 1, 'COP', 'fraction', NULL, NULL, 'a4e0dbf0-528a-4cbb-88cc-563527900d40', '89ff5118-d0c2-4dd8-8098-a8698189b2ea'); --- --- COMMIT; - -- --------------------------------------------------------------------------------------------------------------------- -- Table `myems_system_db`.`tbl_combined_equipments_virtual_meters` -- --------------------------------------------------------------------------------------------------------------------- @@ -175,18 +94,6 @@ CREATE TABLE IF NOT EXISTS `myems_system_db`.`tbl_combined_equipments_virtual_me `is_output` BOOL NOT NULL, PRIMARY KEY (`id`)); CREATE INDEX `tbl_combined_equipments_virtual_meters_index_1` ON `myems_system_db`.`tbl_combined_equipments_virtual_meters` (`combined_equipment_id`); --- --------------------------------------------------------------------------------------------------------------------- --- Example Data for table `myems_system_db`.`tbl_combined_equipments_virtual_meters` --- --------------------------------------------------------------------------------------------------------------------- --- START TRANSACTION; --- USE `myems_system_db`; - --- INSERT INTO `myems_system_db`.`tbl_combined_equipments_virtual_meters` --- (`id`, `combined_equipment_id`, `virtual_meter_id`, `is_output`) --- VALUES --- (1, 1, 1, false); - --- COMMIT; -- --------------------------------------------------------------------------------------------------------------------- -- Table `myems_system_db`.`tbl_contacts` @@ -202,17 +109,6 @@ CREATE TABLE IF NOT EXISTS `myems_system_db`.`tbl_contacts` ( `description` VARCHAR(255) , PRIMARY KEY (`id`)); --- --------------------------------------------------------------------------------------------------------------------- --- Example Data for table `myems_system_db`.`tbl_contacts` --- --------------------------------------------------------------------------------------------------------------------- - START TRANSACTION; - USE `myems_system_db`; - INSERT INTO `myems_system_db`.`tbl_contacts`(`id`, `name`, `uuid`, `email`, `phone`, `description`) - VALUES - (1, 'John', '5c5ce6e8-8d00-46b3-9602-4e1520a8b43f', 'john@myems.io', '+8613888888888', 'Building #1'), - (2, 'Sample Tenant', '102b654d-e831-4365-bb1e-dbd55e897851', 'sample.tenant@myems.io', '+8613666666666', 'Sample Tenant'); - COMMIT; - -- --------------------------------------------------------------------------------------------------------------------- -- Table `myems_system_db`.`tbl_cost_centers` -- --------------------------------------------------------------------------------------------------------------------- @@ -226,18 +122,6 @@ CREATE TABLE IF NOT EXISTS `myems_system_db`.`tbl_cost_centers` ( PRIMARY KEY (`id`)); CREATE INDEX `tbl_cost_centers_index_1` ON `myems_system_db`.`tbl_cost_centers` (`name`); --- --------------------------------------------------------------------------------------------------------------------- --- Example Data for table `myems_system_db`.`tbl_cost_centers` --- --------------------------------------------------------------------------------------------------------------------- -START TRANSACTION; -USE `myems_system_db`; - -INSERT INTO `myems_system_db`.`tbl_cost_centers` -(`id`, `name`, `uuid`, `external_id`) -VALUES -(1, '成本中心', 'd97b9736-c4f9-4005-a534-6af3487303ad', NULL); -COMMIT; - -- --------------------------------------------------------------------------------------------------------------------- -- Table `myems_system_db`.`tbl_cost_centers_tariffs` -- --------------------------------------------------------------------------------------------------------------------- @@ -249,19 +133,6 @@ CREATE TABLE IF NOT EXISTS `myems_system_db`.`tbl_cost_centers_tariffs` ( `tariff_id` BIGINT NOT NULL, PRIMARY KEY (`id`)); CREATE INDEX `tbl_cost_centers_tariffs_index_1` ON `myems_system_db`.`tbl_cost_centers_tariffs` (`cost_center_id`); --- --------------------------------------------------------------------------------------------------------------------- --- Example Data for table `myems_system_db`.`tbl_cost_centers_tariffs` --- --------------------------------------------------------------------------------------------------------------------- --- START TRANSACTION; --- USE `myems_system_db`; --- INSERT INTO `myems_system_db`.`tbl_cost_centers_tariffs` --- (`id`, `cost_center_id`, `tariff_id`) --- VALUES --- (1, 1, 1), --- (2, 1, 2), --- (3, 1, 3); - --- COMMIT; -- --------------------------------------------------------------------------------------------------------------------- -- Table `myems_system_db`.`tbl_data_sources` @@ -281,24 +152,6 @@ CREATE INDEX `tbl_data_sources_index_1` ON `myems_system_db`.`tbl_data_sources` CREATE INDEX `tbl_data_sources_index_2` ON `myems_system_db`.`tbl_data_sources` (`gateway_id`); CREATE INDEX `tbl_data_sources_index_3` ON `myems_system_db`.`tbl_data_sources` (`protocol`); --- --------------------------------------------------------------------------------------------------------------------- --- Example Data for table `myems_system_db`.`tbl_data_sources` --- --------------------------------------------------------------------------------------------------------------------- --- START TRANSACTION; --- USE `myems_system_db`; - --- INSERT INTO `myems_system_db`.`tbl_data_sources` --- (`id`, `name`, `uuid`,`gateway_id`, `protocol`, `connection`) --- VALUES --- (1, '示例ModbusTCP数据源', 1, 'b3ace9d4-b63b-419b-818f-0f6d1d0603a4', 'modbus-tcp', '{"host":"10.111.212.191", "port":502}'), --- (2, '示例ModbusRTU数据源', 1, 'b903f0af-9115-448c-9d46-8caf5f9995f3', 'modbus-tru', '{"port": "/dev/ttyUSB0","slaveaddress": 1, "baudrate": 9600,"bytesize": 8,"parity": "N","stopbits": 1,"timeout": 0.05,"mode": "rtu"}''), --- (3, '示例Bacnet/IP数据源', 1, 'e2d5b30b-b554-4ebe-8ce7-f377ab380d19', 'bacnet-ip', '{"host":"10.111.212.200", "port":47808}'), --- (4, '示例S7数据源', 1, '9eb0d705-d02a-43f8-9c62-7e5ef508b255', 's7', '{"host":"10.111.212.202", "port":102, "rack": 0, "slot": 2}'), --- (5, '示例ControlLogix数据源', 1, 'd1dc9792-7861-4dd3-9b01-07511dae16c1', 'control-logix', '{"host":"10.111.212.203","port":44818,"processorslot":3}'); --- (6, '示例OPU UA数据源', 1, '56e1c642-8032-495b-af2e-18a77ca75e0f', 'opc-ua', '{"url":"opc.tcp://10.111.212.5:49320/OPCUA/SimulationServer/"}'); --- (7, '示例天气数据源', 1, '9bff8e95-c7c9-4002-b040-08a96ae196b5', 'weather', '{"base_url":"WEATHER_API_URL", "location":"beijing", "key":"APPKEY"}'); --- COMMIT; - -- --------------------------------------------------------------------------------------------------------------------- -- Table `myems_system_db`.`tbl_distribution_circuits` -- --------------------------------------------------------------------------------------------------------------------- @@ -318,19 +171,6 @@ CREATE TABLE IF NOT EXISTS `myems_system_db`.`tbl_distribution_circuits` ( PRIMARY KEY (`id`)); CREATE INDEX `tbl_distribution_circuits_index_1` ON `myems_system_db`.`tbl_distribution_circuits` (`name`); --- --------------------------------------------------------------------------------------------------------------------- --- Example Data for table `myems_system_db`.`tbl_distribution_circuits` --- --------------------------------------------------------------------------------------------------------------------- --- START TRANSACTION; --- USE `myems_system_db`; --- --- INSERT INTO `myems_system_db`.`tbl_distribution_circuits` --- (`id`, `name`, `uuid`, `distribution_system_id`, `distribution_room`, `switchgear`, `peak_load`, `peak_current`, `customers`, `meters`) --- VALUES --- (1, '51W91', '52f7abe1-ba0e-47a6-a327-4faac42a1d11', 1, 'EW1', '51AL9', 30, 53.6, '地下室应急照明', 'ALE-1102, ALE-1082'); --- --- COMMIT; - -- --------------------------------------------------------------------------------------------------------------------- -- Table `myems_system_db`.`tbl_distribution_circuits_points` -- --------------------------------------------------------------------------------------------------------------------- @@ -342,44 +182,6 @@ CREATE TABLE IF NOT EXISTS `myems_system_db`.`tbl_distribution_circuits_points` `point_id` BIGINT NOT NULL, PRIMARY KEY (`id`)); CREATE INDEX `tbl_distribution_circuits_points_index_1` ON `myems_system_db`.`tbl_distribution_circuits_points` (`distribution_circuit_id`); --- --------------------------------------------------------------------------------------------------------------------- --- Example Data for table `myems_system_db`.`tbl_distribution_circuits_points` --- --------------------------------------------------------------------------------------------------------------------- --- START TRANSACTION; --- USE `myems_system_db`; - --- INSERT INTO `myems_system_db`.`tbl_distribution_circuits_points` --- (`id`, `distribution_circuit_id`, `point_id`) --- VALUES (1, 1, 1); --- COMMIT; - - --- --------------------------------------------------------------------------------------------------------------------- --- Table `myems_system_db`.`tbl_distribution_systems` --- --------------------------------------------------------------------------------------------------------------------- -DROP TABLE IF EXISTS `myems_system_db`.`tbl_distribution_systems` ; - -CREATE TABLE IF NOT EXISTS `myems_system_db`.`tbl_distribution_systems` ( - `id` BIGINT NOT NULL AUTO_INCREMENT, - `name` VARCHAR(255) NOT NULL, - `uuid` CHAR(36) NOT NULL, - `svg` LONGTEXT NOT NULL, - `description` VARCHAR(255), - PRIMARY KEY (`id`)); -CREATE INDEX `tbl_distribution_systems_index_1` ON `myems_system_db`.`tbl_distribution_systems` (`name`); - --- --------------------------------------------------------------------------------------------------------------------- --- Example Data for table `myems_system_db`.`tbl_distribution_systems` --- --------------------------------------------------------------------------------------------------------------------- --- START TRANSACTION; --- USE `myems_system_db`; --- --- INSERT INTO `myems_system_db`.`tbl_distribution_systems` --- (`id`, `name`, `uuid`, `svg`, `description`) --- VALUES --- (1, '示例配电系统', '95652719-56fa-44cc-9bef-7aa47664d4ff', 'Four separate rectangles', 'demo distribution system'); --- --- COMMIT; -- --------------------------------------------------------------------------------------------------------------------- -- Table `myems_system_db`.`tbl_energy_categories` @@ -396,28 +198,6 @@ CREATE TABLE IF NOT EXISTS `myems_system_db`.`tbl_energy_categories` ( PRIMARY KEY (`id`)); CREATE INDEX `tbl_energy_categories_index_1` ON `myems_system_db`.`tbl_energy_categories` (`name`); --- --------------------------------------------------------------------------------------------------------------------- --- Example Data for table `myems_system_db`.`tbl_energy_categories` --- --------------------------------------------------------------------------------------------------------------------- -START TRANSACTION; -USE `myems_system_db`; - -INSERT INTO `myems_system_db`.`tbl_energy_categories` -(`id`, `name`, `uuid`, `unit_of_measure`, `kgce`, `kgco2e`) -VALUES -(1, '电', '6d0753ed-8b43-4332-b6fd-d2f5813831d3', 'kWh', 0.1229, 0.928), -(2, '自来水', '3dbfa598-fccc-4d60-bf11-14bd55540c66', 'm³', 0.0857, 0.910), -(3, '天然气', '6d0753ed-8b43-4332-b6fd-d2f5813831d3', 'm³', 1.3300, 2.1622), -(4,'4℃冷冻水','d2a3021a-4911-4611-856e-80133000f1d5','m³',1.000,1.000), -(5,'7℃冷冻水','c1ad0696-e1ab-4e0c-a342-b194c0bc27e0','m³',1.000,1.000), -(6,'蒸汽','ac91a5c4-4ae5-4a73-8e3f-044591f42eef','T',1.000,1.000), -(7,'压缩空气','ff238e98-cd35-47c5-88a3-00617587775d','m³',1.000,1.000), -(8,'循环水','7e159a34-b2e6-4fd3-ba76-897d134abe06','m³',1.000,1.000), -(9, '热量','549f9cad-8db7-49d2-9473-95e37a3fc46a','KJ',1.000,1.000), -(10, '冷量','05aa257b-3cf6-4f19-808d-92e7dbf52b16','KJ',1.000,1.000), -(11, '中水','df6161b6-4a1b-46e7-b7c8-337b5b52d717','m³',1.000,1.000); -COMMIT; - -- --------------------------------------------------------------------------------------------------------------------- -- Table `myems_system_db`.`tbl_energy_items` -- --------------------------------------------------------------------------------------------------------------------- @@ -431,22 +211,6 @@ CREATE TABLE IF NOT EXISTS `myems_system_db`.`tbl_energy_items` ( PRIMARY KEY (`id`)); CREATE INDEX `tbl_energy_items_index_1` ON `myems_system_db`.`tbl_energy_items` (`name`); --- --------------------------------------------------------------------------------------------------------------------- --- Example Data for table `myems_system_db`.`tbl_energy_items` --- --------------------------------------------------------------------------------------------------------------------- -START TRANSACTION; -USE `myems_system_db`; - -INSERT INTO `myems_system_db`.`tbl_energy_items` -(`id`, `name`, `uuid`, `energy_category_id`) -VALUES -(1, '空调用电', 'c5eac07a-e889-4a56-aa1b-a0b688c4e953', 1), -(2, '动力用电', '6875e4e0-a2ec-47a5-a88e-becb10e9603a', 1), -(3, '照明用电', '79918598-6477-4130-a85c-4cb87d0eac23', 1); - -COMMIT; - - -- --------------------------------------------------------------------------------------------------------------------- -- Table `myems_system_db`.`tbl_energy_flow_diagrams` -- --------------------------------------------------------------------------------------------------------------------- @@ -459,19 +223,6 @@ CREATE TABLE IF NOT EXISTS `myems_system_db`.`tbl_energy_flow_diagrams` ( PRIMARY KEY (`id`)); CREATE INDEX `tbl_energy_flow_diagrams_index_1` ON `myems_system_db`.`tbl_energy_flow_diagrams` (`name`); --- --------------------------------------------------------------------------------------------------------------------- --- Example Data for table `myems_system_db`.`tbl_energy_flow_diagrams` --- --------------------------------------------------------------------------------------------------------------------- --- START TRANSACTION; --- USE `myems_system_db`; --- --- INSERT INTO `myems_system_db`.`tbl_energy_flow_diagrams` --- (`id`, `name`, `uuid`) --- VALUES --- (1, '低压配电系统', '3ccbc9c6-9575-4212-a63a-a688d1154302'); --- --- COMMIT; - -- --------------------------------------------------------------------------------------------------------------------- -- Table `myems_system_db`.`tbl_energy_flow_diagrams_links` -- --------------------------------------------------------------------------------------------------------------------- @@ -486,26 +237,6 @@ CREATE TABLE IF NOT EXISTS `myems_system_db`.`tbl_energy_flow_diagrams_links` ( PRIMARY KEY (`id`)); CREATE INDEX `tbl_energy_flow_diagrams_links_index_1` ON `myems_system_db`.`tbl_energy_flow_diagrams_links` (`energy_flow_diagram_id`); --- --------------------------------------------------------------------------------------------------------------------- --- Example Data for table `myems_system_db`.`tbl_energy_flow_diagrams_links` --- --------------------------------------------------------------------------------------------------------------------- --- START TRANSACTION; --- USE `myems_system_db`; --- --- INSERT INTO `myems_system_db`.`tbl_energy_flow_diagrams_links` --- (`id`, `energy_flow_diagram_id`, `name`) --- VALUES --- (1, 1, 1, 3, '5ca47bc5-22c2-47fc-b906-33222191ea40'), --- (2, 1, 2, 4, '5d4d2f06-6200-4671-b182-4cf32cd9228f'), --- (3, 1, 2, 5, '7897665b-66ac-481d-9c31-2ab2ecbda16c'), --- (4, 1, 2, 6, 'f0c278ec-eb32-4c5e-a35f-88643b00c367'), --- (5, 1, 3, 7, '9918aa6c-79e9-4579-8f2e-a76eb9fe4e3e'), --- (6, 1, 3, 8, '831cbc8c-1429-4840-946e-f0b389b2253e'), --- (7, 1, 4, 9, 'd2fc8464-3f13-42a9-8a57-63f95f677f0f'), --- (8, 1, 4, 10, '7e4b3831-887b-40e2-b7f8-4d77c6f206a9'); --- --- COMMIT; - -- --------------------------------------------------------------------------------------------------------------------- -- Table `myems_system_db`.`tbl_energy_flow_diagrams_nodes` -- --------------------------------------------------------------------------------------------------------------------- @@ -518,28 +249,6 @@ CREATE TABLE IF NOT EXISTS `myems_system_db`.`tbl_energy_flow_diagrams_nodes` ( PRIMARY KEY (`id`)); CREATE INDEX `tbl_energy_flow_diagrams_nodes_index_1` ON `myems_system_db`.`tbl_energy_flow_diagrams_nodes` (`name`); --- --------------------------------------------------------------------------------------------------------------------- --- Example Data for table `myems_system_db`.`tbl_energy_flow_diagrams_nodes` --- --------------------------------------------------------------------------------------------------------------------- --- START TRANSACTION; --- USE `myems_system_db`; --- --- INSERT INTO `myems_system_db`.`tbl_energy_flow_diagrams_nodes` --- (`id`, `energy_flow_diagram_id`, `name`) --- VALUES --- (1, 1, '10KV进线#1'), --- (2, 1, '10KV进线#2'), --- (3, 1, '租区'), --- (4, 1, '公区'), --- (5, 1, '酒店'), --- (6, 1, '车库'), --- (7, 1, '餐饮'), --- (8, 1, '零售'), --- (9, 1, '照明'), --- (10, 1, '电梯'); --- --- COMMIT; - -- --------------------------------------------------------------------------------------------------------------------- -- Table `myems_system_db`.`tbl_equipments` -- --------------------------------------------------------------------------------------------------------------------- @@ -556,21 +265,6 @@ CREATE TABLE IF NOT EXISTS `myems_system_db`.`tbl_equipments` ( PRIMARY KEY (`id`)); CREATE INDEX `tbl_equipments_index_1` ON `myems_system_db`.`tbl_equipments` (`name`); --- --------------------------------------------------------------------------------------------------------------------- --- Example Data for table `myems_system_db`.`tbl_equipments` --- --------------------------------------------------------------------------------------------------------------------- --- START TRANSACTION; --- USE `myems_system_db`; - --- INSERT INTO `myems_system_db`.`tbl_equipments` --- (`id`, `name`, `uuid`, `is_input_counted`, `is_output_counted`, `cost_center_id`, `description` ) --- VALUES --- (1, '设备1', 'bfa8b106-89a1-49ca-9b2b-a481ac41a873', true, false, 1, 'description'), --- (2, '设备2', 'ad5798ec-d827-43d9-bf08-fc7516f9c4c8', true, false, 1, 'description'); - --- COMMIT; - - -- --------------------------------------------------------------------------------------------------------------------- -- Table `myems_system_db`.`tbl_equipments_meters` -- --------------------------------------------------------------------------------------------------------------------- @@ -584,19 +278,6 @@ CREATE TABLE IF NOT EXISTS `myems_system_db`.`tbl_equipments_meters` ( PRIMARY KEY (`id`)); CREATE INDEX `tbl_equipments_meters_index_1` ON `myems_system_db`.`tbl_equipments_meters` (`equipment_id`); --- --------------------------------------------------------------------------------------------------------------------- --- Example Data for table `myems_system_db`.`tbl_equipments_meters` --- --------------------------------------------------------------------------------------------------------------------- --- START TRANSACTION; --- USE `myems_system_db`; - --- INSERT INTO `myems_system_db`.`tbl_equipments_meters` --- (`id`, `equipment_id`, `meter_id`, `is_output`) --- VALUES --- (1, 1, 1, false); - --- COMMIT; - -- --------------------------------------------------------------------------------------------------------------------- -- Table `myems_system_db`.`tbl_equipments_offline_meters` -- --------------------------------------------------------------------------------------------------------------------- @@ -610,19 +291,6 @@ CREATE TABLE IF NOT EXISTS `myems_system_db`.`tbl_equipments_offline_meters` ( PRIMARY KEY (`id`)); CREATE INDEX `tbl_equipments_offline_meters_index_1` ON `myems_system_db`.`tbl_equipments_offline_meters` (`equipment_id`); --- --------------------------------------------------------------------------------------------------------------------- --- Example Data for table `myems_system_db`.`tbl_equipments_offline_meters` --- --------------------------------------------------------------------------------------------------------------------- --- START TRANSACTION; --- USE `myems_system_db`; - --- INSERT INTO `myems_system_db`.`tbl_equipments_offline_meters` --- (`id`, `equipment_id`, `offline_meter_id`, `is_output`) --- VALUES --- (1, 1, 1, false); - --- COMMIT; - -- --------------------------------------------------------------------------------------------------------------------- -- Table `myems_system_db`.`tbl_equipments_parameters` -- --------------------------------------------------------------------------------------------------------------------- @@ -640,36 +308,6 @@ CREATE TABLE IF NOT EXISTS `myems_system_db`.`tbl_equipments_parameters` ( PRIMARY KEY (`id`)); CREATE INDEX `tbl_equipment_parameters_index_1` ON `myems_system_db`.`tbl_equipments_parameters` (`equipment_id`); --- --------------------------------------------------------------------------------------------------------------------- --- Example Data for table `myems_system_db`.`tbl_equipments_parameters` --- --------------------------------------------------------------------------------------------------------------------- --- START TRANSACTION; --- USE `myems_system_db`; --- --- INSERT INTO `myems_system_db`.`tbl_equipments_parameters` --- (`id`, `equipment_id`, `name`, `parameter_type`, `constant`, `point_id`, `numerator_meter_uuid`, `denominator_meter_uuid`) --- VALUES --- (1, 1, 'serial number', 'constant', 'bfa8b106', NULL, NULL, NULL), --- (2, 1, 'manufacturer', 'constant', 'York', NULL, NULL, NULL), --- (3, 1, 'maintainer', 'constant', 'Johnson Controls', NULL, NULL, NULL), --- (4, 1, 'use life start', 'constant', '2016-01-01', NULL, NULL, NULL), --- (5, 1, 'use life end', 'constant', '2025-12-31', NULL, NULL, NULL), --- (6, 1, 'model number', 'constant', 'CH01', NULL, NULL, NULL), --- (7, 1, 'nominal cooling capacity', 'constant', '90.000 kW', NULL, NULL, NULL), --- (8, 1, 'nominal cooling input power', 'constant', '100.000 kW', NULL, NULL, NULL), --- (9, 1, 'nominal cooling cop', 'constant', '5', NULL, NULL, NULL), --- (10, 1, 'nominal cooling operating current', 'constant', '120.000 A', NULL, NULL, NULL), --- (11, 1, 'rated input power', 'constant', '100.000 kW', NULL, NULL, NULL), --- (12, 1, 'nominal chilled water flow rate', 'constant', '30 m2/h', NULL, NULL, NULL), --- (13, 1, 'nominal cooling water flow_rate', 'constant', '50 m2/h', NULL, NULL, NULL), --- (14, 1, 'status', 'point', NULL, 1, NULL, NULL), --- (15, 1, 'inlet chilled water temperature', 'point', NULL, 2, NULL, NULL), --- (16, 1, 'chilled_water instantaneous flow rate', 'point', NULL, 3, NULL, NULL), --- (17, 1, 'instantaneous power', 'point', NULL, 4, NULL, NULL), --- (18, 1, 'COP', 'fraction', NULL, NULL, 'a4e0dbf0-528a-4cbb-88cc-563527900d40', '89ff5118-d0c2-4dd8-8098-a8698189b2ea'); --- --- COMMIT; - -- --------------------------------------------------------------------------------------------------------------------- -- Table `myems_system_db`.`tbl_equipments_virtual_meters` -- --------------------------------------------------------------------------------------------------------------------- @@ -682,18 +320,6 @@ CREATE TABLE IF NOT EXISTS `myems_system_db`.`tbl_equipments_virtual_meters` ( `is_output` BOOL NOT NULL, PRIMARY KEY (`id`)); CREATE INDEX `tbl_equipments_virtual_meters_index_1` ON `myems_system_db`.`tbl_equipments_virtual_meters` (`equipment_id`); --- --------------------------------------------------------------------------------------------------------------------- --- Example Data for table `myems_system_db`.`tbl_equipments_virtual_meters` --- --------------------------------------------------------------------------------------------------------------------- --- START TRANSACTION; --- USE `myems_system_db`; - --- INSERT INTO `myems_system_db`.`tbl_equipments_virtual_meters` --- (`id`, `equipment_id`, `virtual_meter_id`, `is_output`) --- VALUES --- (1, 1, 1, false); - --- COMMIT; -- --------------------------------------------------------------------------------------------------------------------- -- Table `myems_system_db`.`tbl_expressions` @@ -708,18 +334,6 @@ CREATE TABLE IF NOT EXISTS `myems_system_db`.`tbl_expressions` ( PRIMARY KEY (`id`)); CREATE INDEX `tbl_expressions_index_1` ON `myems_system_db`.`tbl_expressions` (`virtual_meter_id`); --- --------------------------------------------------------------------------------------------------------------------- --- Example Data for table `myems_system_db`.`tbl_expressions` --- --------------------------------------------------------------------------------------------------------------------- --- START TRANSACTION; --- USE `myems_system_db`; - --- INSERT INTO `myems_system_db`.`tbl_expressions` --- (`id`, `uuid`, `virtual_meter_id`, `equation`) --- VALUES --- (1, '3fff2cfb-f755-44c8-a919-6135205a8573', 1, 'x1+x2-x3'); --- COMMIT; - -- --------------------------------------------------------------------------------------------------------------------- -- Table `myems_system_db`.`tbl_gateways` -- --------------------------------------------------------------------------------------------------------------------- @@ -734,20 +348,6 @@ CREATE TABLE IF NOT EXISTS `myems_system_db`.`tbl_gateways` ( PRIMARY KEY (`id`)); CREATE INDEX `tbl_gateways_index_1` ON `myems_system_db`.`tbl_gateways` (`name`); --- --------------------------------------------------------------------------------------------------------------------- --- Example Data for table `myems_system_db`.`tbl_gateways` --- --------------------------------------------------------------------------------------------------------------------- -START TRANSACTION; -USE `myems_system_db`; - -INSERT INTO `myems_system_db`.`tbl_gateways` -(`id`, `name`, `uuid`, `token`, `last_seen_datetime_utc`) -VALUES -(1, 'MyEMS Gateway 1', 'dc681934-5053-4660-98ed-266c54227231', '983427af-1c35-42ba-8b4d-288675550225', null), -(2, 'MyEMS Gateway 2', '8f75c0ab-9296-49c7-9058-8139febd0c31', 'd3860971-e6e0-4c98-9eba-5492869c5b19', null); - -COMMIT; - -- --------------------------------------------------------------------------------------------------------------------- -- Table `myems_system_db`.`tbl_knowledge_files` -- --------------------------------------------------------------------------------------------------------------------- @@ -777,8 +377,8 @@ CREATE TABLE IF NOT EXISTS `myems_system_db`.`tbl_menus` ( `parent_menu_id` BIGINT, `is_hidden` BOOL NOT NULL, PRIMARY KEY (`id`)); - -INSERT INTO myems_system_db.tbl_menus (id,name,route, parent_menu_id,is_hidden) + +INSERT INTO myems_system_db.tbl_menus (id,name,route, parent_menu_id,is_hidden) VALUES (100,'Space Data','/space',NULL,0), (101,'Energy Category Data','/space/energycategory',100,0), @@ -869,9 +469,6 @@ VALUES (1100,'Advanced Reporting','/advancedreporting',NULL,0), (1200,'Knowledge Base','/knowledgebase',NULL,0); - - - -- --------------------------------------------------------------------------------------------------------------------- -- Table `myems_system_db`.`tbl_meters` -- --------------------------------------------------------------------------------------------------------------------- @@ -893,20 +490,6 @@ CREATE TABLE IF NOT EXISTS `myems_system_db`.`tbl_meters` ( CREATE INDEX `tbl_meters_index_1` ON `myems_system_db`.`tbl_meters` (`name`); CREATE INDEX `tbl_meters_index_2` ON `myems_system_db`.`tbl_meters` (`energy_category_id`); CREATE INDEX `tbl_meters_index_3` ON `myems_system_db`.`tbl_meters` (`energy_item_id`); --- --------------------------------------------------------------------------------------------------------------------- --- Example Data for table `myems_system_db`.`tbl_meters` --- --------------------------------------------------------------------------------------------------------------------- --- START TRANSACTION; --- USE `myems_system_db`; - --- INSERT INTO `myems_system_db`.`tbl_meters` --- (`id`, `name`, `uuid`, `energy_category_id`, `is_counted`, `hourly_low_limit`, `hourly_high_limit`, `cost_center_id`, `energy_item_id`, `master_meter_id`, `description`) --- VALUES --- (1, '示例表1', '5ca47bc5-22c2-47fc-b906-33222191ea40', 1, true, 0.000, 999.999, 1, 1, null, 'meter1'), --- (2, '示例表2', '5ca47bc5-22c2-47fc-b906-33222191ea40', 1, true, 0.000, 999.999, 1, 1, 1, 'meter2'), --- (3, '示例表3', '6db58cd6-33d3-58ed-a095-22333202fb51', 1, true, 0.000, 999.999, 1, 1, 1, 'meter3'); - --- COMMIT; -- --------------------------------------------------------------------------------------------------------------------- -- Table `myems_system_db`.`tbl_meters_points` @@ -919,17 +502,6 @@ CREATE TABLE IF NOT EXISTS `myems_system_db`.`tbl_meters_points` ( `point_id` BIGINT NOT NULL, PRIMARY KEY (`id`)); CREATE INDEX `tbl_meters_points_index_1` ON `myems_system_db`.`tbl_meters_points` (`meter_id`); --- --------------------------------------------------------------------------------------------------------------------- --- Example Data for table `myems_system_db`.`tbl_meters_points` --- --------------------------------------------------------------------------------------------------------------------- --- START TRANSACTION; --- USE `myems_system_db`; - --- INSERT INTO `myems_system_db`.`tbl_meters_points` --- (`id`, `meter_id`, `point_id`) --- VALUES (1, 1, 1); --- COMMIT; - -- --------------------------------------------------------------------------------------------------------------------- -- Table `myems_system_db`.`tbl_offline_meters` @@ -951,17 +523,6 @@ CREATE TABLE IF NOT EXISTS `myems_system_db`.`tbl_offline_meters` ( CREATE INDEX `tbl_offline_meters_index_1` ON `myems_system_db`.`tbl_offline_meters` (`name`); CREATE INDEX `tbl_offline_meters_index_2` ON `myems_system_db`.`tbl_offline_meters` (`energy_category_id`); CREATE INDEX `tbl_offline_meters_index_3` ON `myems_system_db`.`tbl_offline_meters` (`energy_item_id`); --- --------------------------------------------------------------------------------------------------------------------- --- Example Data for table `myems_system_db`.`tbl_offline_meters` --- --------------------------------------------------------------------------------------------------------------------- --- START TRANSACTION; --- USE `myems_system_db`; - --- INSERT INTO `myems_system_db`.`tbl_offline_meters` --- (`id`, `name`, `uuid`, `energy_category_id`, `is_counted`, `max_hourly_value`, `cost_center_id`, `energy_item_id`, `description`) --- VALUES --- (1, '示例离线表', '62f473e0-1a35-41f3-9c30-8110d75d65bb', 1, true, 999.99, 1, 1, 'offlinemeter1'); --- COMMIT; -- --------------------------------------------------------------------------------------------------------------------- -- Table `myems_system_db`.`tbl_points` @@ -985,52 +546,6 @@ CREATE TABLE IF NOT EXISTS `myems_system_db`.`tbl_points` ( CREATE INDEX `tbl_points_index_1` ON `myems_system_db`.`tbl_points` (`name`); CREATE INDEX `tbl_points_index_2` ON `myems_system_db`.`tbl_points` (`data_source_id`); CREATE INDEX `tbl_points_index_3` ON `myems_system_db`.`tbl_points` (`id`, `object_type`); --- --------------------------------------------------------------------------------------------------------------------- --- Example Data for table `myems_system_db`.`tbl_points` --- --------------------------------------------------------------------------------------------------------------------- --- List of Object Type --- ENERGY_VALUE --- ANALOG_VALUE --- DIGITAL_VALUE - --- START TRANSACTION; --- USE `myems_system_db`; - --- INSERT INTO `myems_system_db`.`tbl_points` --- (`id`, `name`, `data_source_id`, `object_type`, `units`, `high_limit`, `low_limit`, `ratio`, `is_trend`, `address`, `description` ) --- VALUES --- (1, 'Active Energy Import Tariff 1', 1, 'ENERGY_VALUE', 'kWh', 99999999999, 0, 1.000, true, --- '{\"slave_id\":1, \"function_code\":3, \"offset\":801, \"number_of_registers\":4, \"format\":\"=d\", \"swap_adjacent_bytes\":false}', null), - --- (2, 'Working hours counter', 1, 'ANALOG_VALUE', 'S', 999999999, 0, 1.000, true, --- '{\"slave_id\":1, \"function_code\":3, \"offset\":209, \"number_of_registers\":2, \"format\":\"=L\", \"swap_adjacent_bytes\":true}', null), - --- (3, 'Current a', 1, 'ANALOG_VALUE', 'A', 5, 0, 1.000, true, --- '{\"slave_id\":1, \"function_code\":3, \"offset\":13, \"number_of_registers\":2, \"format\":\"=f\", \"swap_adjacent_bytes\":false}', null), - --- (4, 'Active Power a', 1, 'ANALOG_VALUE', 'W', 3450, 0, 1.000, true, --- '{\"slave_id\":1, \"function_code\":3, \"offset\":25, \"number_of_registers\":2, \"format\":\"=f\", \"swap_adjacent_bytes\":false}', null), - --- (5, 'Power Factor a', 1, 'ANALOG_VALUE', 'W', 1, 0, 1.000, true, --- '{\"slave_id\":1, \"function_code\":3, \"offset\":37, \"number_of_registers\":2, \"format\":\"=f\", \"swap_adjacent_bytes\":false}', null), - --- (6, '示例ModbusTCP数据点6', 2, 'ENERGY_VALUE', 'Wh', 99999999999, 0, 1.000, true, --- '{\"slave_id\":1, \"function_code\":3, \"offset\":40001, \"number_of_registers\":2, \"format\":\"=f\", \"swap_adjacent_bytes\":false}', null), - --- (7, '示例数据点7', 2, 'ANALOG_VALUE', 'V', 690, 0, 1.000, true, --- '{\"slave_id\":1, \"function_code\":3, \"offset\":40002, \"number_of_registers\":2, \"format\":\"=f\", \"swap_adjacent_bytes\":false}', null), - --- (8, 'BACnet示例数据点1', 3, 'ANALOG_VALUE', 'V', 690, 0, 1.000, true, --- '{\"object_type\":\"analogValue\", \"object_id\":3004860, \"property_name\":\"presentValue\", \"property_array_index\":null}', null), --- BACnet Object Type --- analogValue, analogInput, analogOutput, binaryValue, binaryInput, binaryOutput - --- (9, 'S7示例数据点1', 4, 'ANALOG_VALUE', 'kWh', 99999999999, 0, 1.000, true, --- '{\"area\":\"DB\", \"db_number\":700, \"start\":8, \"size\":4', null); --- # S7 Area --- 'PE', 'PA', 'MK', 'DB', 'CT', 'TM' - --- COMMIT; -- --------------------------------------------------------------------------------------------------------------------- -- Table `myems_system_db`.`tbl_sensors` @@ -1044,17 +559,6 @@ CREATE TABLE IF NOT EXISTS `myems_system_db`.`tbl_sensors` ( `description` VARCHAR(255), PRIMARY KEY (`id`)); CREATE INDEX `tbl_sensors_index_1` ON `myems_system_db`.`tbl_sensors` (`name`); --- --------------------------------------------------------------------------------------------------------------------- --- Example Data for table `myems_system_db`.`tbl_sensors` --- --------------------------------------------------------------------------------------------------------------------- --- START TRANSACTION; --- USE `myems_system_db`; - --- INSERT INTO `myems_system_db`.`tbl_sensors` --- (`id`, `name`, `uuid`, `description`) --- VALUES --- (1, '示例传感器', 'ba450606-6f39-41e0-8caf-75b528635511', 'sensor description'); --- COMMIT; -- --------------------------------------------------------------------------------------------------------------------- -- Table `myems_system_db`.`tbl_sensors_points` @@ -1067,16 +571,6 @@ CREATE TABLE IF NOT EXISTS `myems_system_db`.`tbl_sensors_points` ( `point_id` BIGINT NOT NULL, PRIMARY KEY (`id`)); CREATE INDEX `tbl_sensors_points_index_1` ON `myems_system_db`.`tbl_sensors_points` (`sensor_id`); --- --------------------------------------------------------------------------------------------------------------------- --- Example Data for table `myems_system_db`.`tbl_sensors_points` --- --------------------------------------------------------------------------------------------------------------------- --- START TRANSACTION; --- USE `myems_system_db`; - --- INSERT INTO `myems_system_db`.`tbl_sensors_points` --- (`id`, `sensor_id`, `point_id`) --- VALUES (1, 1, 1); --- COMMIT; -- --------------------------------------------------------------------------------------------------------------------- -- Table `myems_system_db`.`tbl_shopfloors` @@ -1095,19 +589,6 @@ CREATE TABLE IF NOT EXISTS `myems_system_db`.`tbl_shopfloors` ( PRIMARY KEY (`id`)); CREATE INDEX `tbl_shopfloors_index_1` ON `myems_system_db`.`tbl_shopfloors` (`name`); --- --------------------------------------------------------------------------------------------------------------------- --- Example Data for table `myems_system_db`.`tbl_shopfloors` --- --------------------------------------------------------------------------------------------------------------------- -START TRANSACTION; -USE `myems_system_db`; - -INSERT INTO `myems_system_db`.`tbl_shopfloors` -(`id`, `name`, `uuid` , `area`, `contact_id`, `is_input_counted`, `cost_center_id`, `description`) -VALUES - (1, 'MyEMS Shopfloor', 'd03837fd-9d30-44fe-9443-154f7c7e15f1', 99999.999, 1, true, 1, 'MyEMS Project'); -COMMIT; - - -- --------------------------------------------------------------------------------------------------------------------- -- Table `myems_system_db`.`tbl_shopfloors_equipments` -- --------------------------------------------------------------------------------------------------------------------- @@ -1120,19 +601,6 @@ CREATE TABLE IF NOT EXISTS `myems_system_db`.`tbl_shopfloors_equipments` ( PRIMARY KEY (`id`)); CREATE INDEX `tbl_shopfloors_equipments_index_1` ON `myems_system_db`.`tbl_shopfloors_equipments` (`shopfloor_id`); --- --------------------------------------------------------------------------------------------------------------------- --- Example Data for table `myems_system_db`.`tbl_shopfloors_equipments` --- --------------------------------------------------------------------------------------------------------------------- --- START TRANSACTION; --- USE `myems_system_db`; - --- INSERT INTO `myems_system_db`.`tbl_shopfloors_equipments` --- (`id`, `shopfloor_id`, `equipment_id`) --- VALUES --- (1, 1, 1); - --- COMMIT; - -- --------------------------------------------------------------------------------------------------------------------- -- Table `myems_system_db`.`tbl_shopfloors_meters` -- --------------------------------------------------------------------------------------------------------------------- @@ -1145,19 +613,6 @@ CREATE TABLE IF NOT EXISTS `myems_system_db`.`tbl_shopfloors_meters` ( PRIMARY KEY (`id`)); CREATE INDEX `tbl_shopfloors_meters_index_1` ON `myems_system_db`.`tbl_shopfloors_meters` (`shopfloor_id`); --- --------------------------------------------------------------------------------------------------------------------- --- Example Data for table `myems_system_db`.`tbl_shopfloors_meters` --- --------------------------------------------------------------------------------------------------------------------- --- START TRANSACTION; --- USE `myems_system_db`; - --- INSERT INTO `myems_system_db`.`tbl_shopfloors_meters` --- (`id`, `shopfloor_id`, `meter_id`) --- VALUES --- (1, 1, 1); - --- COMMIT; - -- --------------------------------------------------------------------------------------------------------------------- -- Table `myems_system_db`.`tbl_shopfloors_offline_meters` -- --------------------------------------------------------------------------------------------------------------------- @@ -1170,19 +625,6 @@ CREATE TABLE IF NOT EXISTS `myems_system_db`.`tbl_shopfloors_offline_meters` ( PRIMARY KEY (`id`)); CREATE INDEX `tbl_shopfloors_offline_meters_index_1` ON `myems_system_db`.`tbl_shopfloors_offline_meters` (`shopfloor_id`); --- --------------------------------------------------------------------------------------------------------------------- --- Example Data for table `myems_system_db`.`tbl_shopfloors_offline_meters` --- --------------------------------------------------------------------------------------------------------------------- --- START TRANSACTION; --- USE `myems_system_db`; - --- INSERT INTO `myems_system_db`.`tbl_shopfloors_offline_meters` --- (`id`, `shopfloor_id`, `offline_meter_id`) --- VALUES --- (1, 1, 1); - --- COMMIT; - -- --------------------------------------------------------------------------------------------------------------------- -- Table `myems_system_db`.`tbl_shopfloors_sensors` -- --------------------------------------------------------------------------------------------------------------------- @@ -1195,19 +637,6 @@ CREATE TABLE IF NOT EXISTS `myems_system_db`.`tbl_shopfloors_sensors` ( PRIMARY KEY (`id`)); CREATE INDEX `tbl_shopfloors_sensors_index_1` ON `myems_system_db`.`tbl_shopfloors_sensors` (`shopfloor_id`); --- --------------------------------------------------------------------------------------------------------------------- --- Example Data for table `myems_system_db`.`tbl_shopfloors_sensors` --- --------------------------------------------------------------------------------------------------------------------- --- START TRANSACTION; --- USE `myems_system_db`; - --- INSERT INTO `myems_system_db`.`tbl_shopfloors_sensors` --- (`id`, `shopfloor_id`, `sensor_id`) --- VALUES --- (1, 1, 1); - --- COMMIT; - -- --------------------------------------------------------------------------------------------------------------------- -- Table `myems_system_db`.`tbl_shopfloors_virtual_meters` -- --------------------------------------------------------------------------------------------------------------------- @@ -1220,19 +649,6 @@ CREATE TABLE IF NOT EXISTS `myems_system_db`.`tbl_shopfloors_virtual_meters` ( PRIMARY KEY (`id`)); CREATE INDEX `tbl_shopfloors_virtual_meters_index_1` ON `myems_system_db`.`tbl_shopfloors_virtual_meters` (`shopfloor_id`); --- --------------------------------------------------------------------------------------------------------------------- --- Example Data for table `myems_system_db`.`tbl_shopfloors_virtual_meters` --- --------------------------------------------------------------------------------------------------------------------- --- START TRANSACTION; --- USE `myems_system_db`; - --- INSERT INTO `myems_system_db`.`tbl_shopfloors_virtual_meters` --- (`id`, `shopfloor_id`, `virtual_meter_id`) --- VALUES --- (1, 1, 1); - --- COMMIT; - -- --------------------------------------------------------------------------------------------------------------------- -- Table `myems_system_db`.`tbl_shopfloors_points` -- --------------------------------------------------------------------------------------------------------------------- @@ -1245,23 +661,6 @@ CREATE TABLE IF NOT EXISTS `myems_system_db`.`tbl_shopfloors_points` ( PRIMARY KEY (`id`)); CREATE INDEX `tbl_shopfloors_points_index_1` ON `myems_system_db`.`tbl_shopfloors_points` (`shopfloor_id`); --- --------------------------------------------------------------------------------------------------------------------- --- Example Data for table `myems_system_db`.`tbl_shopfloors_points` --- --------------------------------------------------------------------------------------------------------------------- --- START TRANSACTION; --- USE `myems_system_db`; - --- INSERT INTO `myems_system_db`.`tbl_shopfloors_points` --- (`id`, `shopfloor_id`, `point_id`) --- VALUES --- (1, 3, 2000001), --- (2, 3, 2000002), --- (3, 3, 2000003), --- (4, 3, 2000006); - --- COMMIT; - - -- --------------------------------------------------------------------------------------------------------------------- -- Table `myems_system_db`.`tbl_spaces` -- --------------------------------------------------------------------------------------------------------------------- @@ -1284,7 +683,7 @@ CREATE INDEX `tbl_spaces_index_1` ON `myems_system_db`.`tbl_spaces` (`name`); CREATE INDEX `tbl_spaces_index_2` ON `myems_system_db`.`tbl_spaces` (`parent_space_id`); -- --------------------------------------------------------------------------------------------------------------------- --- Example Data for table `myems_system_db`.`tbl_spaces` +-- Default Data for table `myems_system_db`.`tbl_spaces` -- --------------------------------------------------------------------------------------------------------------------- START TRANSACTION; USE `myems_system_db`; @@ -1292,10 +691,8 @@ USE `myems_system_db`; INSERT INTO `myems_system_db`.`tbl_spaces` (`id`, `name`, `uuid`, `parent_space_id`, `area`, `timezone_id`, `contact_id`, `is_input_counted`, `is_output_counted`, `cost_center_id`, `description`) VALUES - -- DO NOT deleted the record which ID is 1. It's the root space. - (1, 'MyEMS Headquarter', '9dfb7cff-f19f-4a1e-8c79-3adf6425bfd9', NULL, 99999.999, 56, 1, true, true, 1, 'MyEMS Project'), - (2, 'MyEMS Building #1', '8f25b33b-db93-49b3-b0f8-b01e0c19df29', 1, 88888.888, 56, 1, true, true, 1, 'MyEMS Project'), - (3, 'MyEMS Building #2', '195d7ea8-17b4-4e9c-bb37-546428155438', 1, 66666.666, 56, 1, true, true, 1, 'MyEMS Project'); +-- DO NOT deleted the record which ID is 1. It's the root space. +(1, 'MyEMS Headquarter', '9dfb7cff-f19f-4a1e-8c79-3adf6425bfd9', NULL, 99999.999, 56, 1, true, true, 1, 'MyEMS Project'); COMMIT; -- --------------------------------------------------------------------------------------------------------------------- @@ -1310,19 +707,6 @@ CREATE TABLE IF NOT EXISTS `myems_system_db`.`tbl_spaces_combined_equipments` ( PRIMARY KEY (`id`)); CREATE INDEX `tbl_spaces_combined_equipments_index_1` ON `myems_system_db`.`tbl_spaces_combined_equipments` (`space_id`); --- --------------------------------------------------------------------------------------------------------------------- --- Example Data for table `myems_system_db`.`tbl_spaces_combined_equipments` --- --------------------------------------------------------------------------------------------------------------------- --- START TRANSACTION; --- USE `myems_system_db`; - --- INSERT INTO `myems_system_db`.`tbl_spaces_combined_equipments` --- (`id`, `space_id`, `combined_equipment_id`) --- VALUES --- (1, 1, 1); - --- COMMIT; - -- --------------------------------------------------------------------------------------------------------------------- -- Table `myems_system_db`.`tbl_spaces_equipments` -- --------------------------------------------------------------------------------------------------------------------- @@ -1335,19 +719,6 @@ CREATE TABLE IF NOT EXISTS `myems_system_db`.`tbl_spaces_equipments` ( PRIMARY KEY (`id`)); CREATE INDEX `tbl_spaces_equipments_index_1` ON `myems_system_db`.`tbl_spaces_equipments` (`space_id`); --- --------------------------------------------------------------------------------------------------------------------- --- Example Data for table `myems_system_db`.`tbl_spaces_equipments` --- --------------------------------------------------------------------------------------------------------------------- --- START TRANSACTION; --- USE `myems_system_db`; - --- INSERT INTO `myems_system_db`.`tbl_spaces_equipments` --- (`id`, `space_id`, `equipment_id`) --- VALUES --- (1, 1, 1); - --- COMMIT; - -- --------------------------------------------------------------------------------------------------------------------- -- Table `myems_system_db`.`tbl_spaces_meters` -- --------------------------------------------------------------------------------------------------------------------- @@ -1360,19 +731,6 @@ CREATE TABLE IF NOT EXISTS `myems_system_db`.`tbl_spaces_meters` ( PRIMARY KEY (`id`)); CREATE INDEX `tbl_spaces_meters_index_1` ON `myems_system_db`.`tbl_spaces_meters` (`space_id`); --- --------------------------------------------------------------------------------------------------------------------- --- Example Data for table `myems_system_db`.`tbl_spaces_meters` --- --------------------------------------------------------------------------------------------------------------------- --- START TRANSACTION; --- USE `myems_system_db`; - --- INSERT INTO `myems_system_db`.`tbl_spaces_meters` --- (`id`, `space_id`, `meter_id`) --- VALUES --- (1, 1, 1); - --- COMMIT; - -- --------------------------------------------------------------------------------------------------------------------- -- Table `myems_system_db`.`tbl_spaces_offline_meters` -- --------------------------------------------------------------------------------------------------------------------- @@ -1385,19 +743,6 @@ CREATE TABLE IF NOT EXISTS `myems_system_db`.`tbl_spaces_offline_meters` ( PRIMARY KEY (`id`)); CREATE INDEX `tbl_spaces_offline_meters_index_1` ON `myems_system_db`.`tbl_spaces_offline_meters` (`space_id`); --- --------------------------------------------------------------------------------------------------------------------- --- Example Data for table `myems_system_db`.`tbl_spaces_offline_meters` --- --------------------------------------------------------------------------------------------------------------------- --- START TRANSACTION; --- USE `myems_system_db`; - --- INSERT INTO `myems_system_db`.`tbl_spaces_offline_meters` --- (`id`, `space_id`, `offline_meter_id`) --- VALUES --- (1, 1, 1); - --- COMMIT; - -- --------------------------------------------------------------------------------------------------------------------- -- Table `myems_system_db`.`tbl_spaces_sensors` -- --------------------------------------------------------------------------------------------------------------------- @@ -1410,19 +755,6 @@ CREATE TABLE IF NOT EXISTS `myems_system_db`.`tbl_spaces_sensors` ( PRIMARY KEY (`id`)); CREATE INDEX `tbl_spaces_sensors_index_1` ON `myems_system_db`.`tbl_spaces_sensors` (`space_id`); --- --------------------------------------------------------------------------------------------------------------------- --- Example Data for table `myems_system_db`.`tbl_spaces_sensors` --- --------------------------------------------------------------------------------------------------------------------- --- START TRANSACTION; --- USE `myems_system_db`; - --- INSERT INTO `myems_system_db`.`tbl_spaces_sensors` --- (`id`, `space_id`, `sensor_id`) --- VALUES --- (1, 1, 1); - --- COMMIT; - -- --------------------------------------------------------------------------------------------------------------------- -- Table `myems_system_db`.`tbl_spaces_shopfloors` -- --------------------------------------------------------------------------------------------------------------------- @@ -1435,19 +767,6 @@ CREATE TABLE IF NOT EXISTS `myems_system_db`.`tbl_spaces_shopfloors` ( PRIMARY KEY (`id`)); CREATE INDEX `tbl_spaces_sensors_index_1` ON `myems_system_db`.`tbl_spaces_shopfloors` (`space_id`); --- --------------------------------------------------------------------------------------------------------------------- --- Example Data for table `myems_system_db`.`tbl_spaces_shopfloors` --- --------------------------------------------------------------------------------------------------------------------- --- START TRANSACTION; --- USE `myems_system_db`; - --- INSERT INTO `myems_system_db`.`tbl_spaces_shopfloors` --- (`id`, `space_id`, `shopfloor_id`) --- VALUES --- (1, 1, 1); - --- COMMIT; - -- --------------------------------------------------------------------------------------------------------------------- -- Table `myems_system_db`.`tbl_spaces_stores` -- --------------------------------------------------------------------------------------------------------------------- @@ -1460,19 +779,6 @@ CREATE TABLE IF NOT EXISTS `myems_system_db`.`tbl_spaces_stores` ( PRIMARY KEY (`id`)); CREATE INDEX `tbl_spaces_stores_index_1` ON `myems_system_db`.`tbl_spaces_stores` (`space_id`); --- --------------------------------------------------------------------------------------------------------------------- --- Example Data for table `myems_system_db`.`tbl_spaces_stores` --- --------------------------------------------------------------------------------------------------------------------- --- START TRANSACTION; --- USE `myems_system_db`; - --- INSERT INTO `myems_system_db`.`tbl_spaces_stores` --- (`id`, `space_id`, `store_id`) --- VALUES --- (1, 1, 1); - --- COMMIT; - -- --------------------------------------------------------------------------------------------------------------------- -- Table `myems_system_db`.`tbl_spaces_tenants` -- --------------------------------------------------------------------------------------------------------------------- @@ -1485,19 +791,6 @@ CREATE TABLE IF NOT EXISTS `myems_system_db`.`tbl_spaces_tenants` ( PRIMARY KEY (`id`)); CREATE INDEX `tbl_spaces_tenants_index_1` ON `myems_system_db`.`tbl_spaces_tenants` (`space_id`); --- --------------------------------------------------------------------------------------------------------------------- --- Example Data for table `myems_system_db`.`tbl_spaces_tenants` --- --------------------------------------------------------------------------------------------------------------------- --- START TRANSACTION; --- USE `myems_system_db`; - --- INSERT INTO `myems_system_db`.`tbl_spaces_tenants` --- (`id`, `space_id`, `tenant_id`) --- VALUES --- (1, 1, 1); - --- COMMIT; - -- --------------------------------------------------------------------------------------------------------------------- -- Table `myems_system_db`.`tbl_spaces_virtual_meters` -- --------------------------------------------------------------------------------------------------------------------- @@ -1510,19 +803,6 @@ CREATE TABLE IF NOT EXISTS `myems_system_db`.`tbl_spaces_virtual_meters` ( PRIMARY KEY (`id`)); CREATE INDEX `tbl_spaces_virtual_meters_index_1` ON `myems_system_db`.`tbl_spaces_virtual_meters` (`space_id`); --- --------------------------------------------------------------------------------------------------------------------- --- Example Data for table `myems_system_db`.`tbl_spaes_virtual_meters` --- --------------------------------------------------------------------------------------------------------------------- --- START TRANSACTION; --- USE `myems_system_db`; - --- INSERT INTO `myems_system_db`.`tbl_spaes_virtual_meters` --- (`id`, `space_id`, `virtual_meter_id`) --- VALUES --- (1, 1, 1); - --- COMMIT; - -- --------------------------------------------------------------------------------------------------------------------- -- Table `myems_system_db`.`tbl_spaces_points` -- --------------------------------------------------------------------------------------------------------------------- @@ -1535,22 +815,6 @@ CREATE TABLE IF NOT EXISTS `myems_system_db`.`tbl_spaces_points` ( PRIMARY KEY (`id`)); CREATE INDEX `tbl_spaces_points_index_1` ON `myems_system_db`.`tbl_spaces_points` (`space_id`); --- --------------------------------------------------------------------------------------------------------------------- --- Example Data for table `myems_system_db`.`tbl_spaces_points` --- --------------------------------------------------------------------------------------------------------------------- --- START TRANSACTION; --- USE `myems_system_db`; - --- INSERT INTO `myems_system_db`.`tbl_spaces_points` --- (`id`, `space_id`, `point_id`) --- VALUES --- (1, 3, 2000001), --- (2, 3, 2000002), --- (3, 3, 2000003), --- (4, 3, 2000006); - --- COMMIT; - -- --------------------------------------------------------------------------------------------------------------------- -- Table `myems_system_db`.`tbl_tariffs` -- --------------------------------------------------------------------------------------------------------------------- @@ -1569,33 +833,6 @@ CREATE TABLE IF NOT EXISTS `myems_system_db`.`tbl_tariffs` ( CREATE INDEX `tbl_tariffs_parameters_index_1` ON `myems_system_db`.`tbl_tariffs` (`name`); CREATE INDEX `tbl_tariffs_parameters_index_2` ON `myems_system_db`.`tbl_tariffs` (`energy_category_id`, `valid_from_datetime_utc`, `valid_through_datetime_utc`); --- --------------------------------------------------------------------------------------------------------------------- --- Example Data for table `myems_system_db`.`tbl_tariffs` --- --------------------------------------------------------------------------------------------------------------------- -START TRANSACTION; -USE `myems_system_db`; - -INSERT INTO `myems_system_db`.`tbl_tariffs` -(`id`, `name`, `uuid`, `energy_category_id`, `tariff_type`, `unit_of_price`, `valid_from_datetime_utc`, `valid_through_datetime_utc`) -VALUES -(1, '2020分时电价1-6', '590efb36-8587-42a9-ae6f-c715d21496d6', 1, 'timeofuse', '元/千瓦时', '2019-12-31 16:00:00', '2020-06-30 15:59:59'), -(2, '2020分时电价7-9', 'f5966640-18fc-437a-9efd-cbc0c58b6373', 1, 'timeofuse', '元/千瓦时', '2020-06-30 16:00:00', '2020-09-30 15:59:59'), -(3, '2020分时电价10-12', '21727a1b-4b27-4186-b72e-db46e6e2d980', 1, 'timeofuse', '元/千瓦时', '2020-09-30 16:00:00', '2020-12-31 15:59:59'), -(4, '2021分时电价1-6', 'fe65e443-0ec2-4a16-823e-2365885e2598', 1, 'timeofuse', '元/千瓦时', '2020-12-31 16:00:00', '2021-06-30 15:59:59'), -(5, '2021分时电价7-9', 'd1285c81-4612-4d7c-9436-ed11b4e7abe4', 1, 'timeofuse', '元/千瓦时', '2021-06-30 16:00:00', '2021-09-30 15:59:59'), -(6, '2021分时电价10-12', 'e6c275b4-47eb-4f5d-bc59-edbe45c2a407', 1, 'timeofuse', '元/千瓦时', '2021-09-30 16:00:00', '2021-12-31 15:59:59'), -(7, '2022分时电价1-6', 'ca359f72-48ad-46a7-82af-cecbe98450e8', 1, 'timeofuse', '元/千瓦时', '2021-12-31 16:00:00', '2022-06-30 15:59:59'), -(8, '2022分时电价7-9', '9fdda603-0f8f-4452-ad59-c5df54bc35f4', 1, 'timeofuse', '元/千瓦时', '2022-06-30 16:00:00', '2022-09-30 15:59:59'), -(9, '2022分时电价10-12', 'fb0442e7-4d44-4bfd-8b20-cad3f77a2480', 1, 'timeofuse', '元/千瓦时', '2022-09-30 16:00:00', '2022-12-31 15:59:59'), -(10, '2023分时电价1-6', '3fa6e1f2-7d08-4f5a-bcbf-beb041d569c0', 1, 'timeofuse', '元/千瓦时', '2022-12-31 16:00:00', '2023-06-30 15:59:59'), -(11, '2023分时电价7-9', '787240fb-1694-403e-a0a7-83d7be1cc0b8', 1, 'timeofuse', '元/千瓦时', '2023-06-30 16:00:00', '2023-09-30 15:59:59'), -(12, '2023分时电价10-12', 'a07fdf76-edcf-4124-96e7-ab733a5a4b70', 1, 'timeofuse', '元/千瓦时', '2023-09-30 16:00:00', '2023-12-31 15:59:59'), -(13, '自来水', '6fcbc77e-effb-4d43-9b30-77b062435d34', 2, 'timeofuse', '元/m³', '2019-12-31 16:00:00', '2023-12-31 15:59:59'), -(14, '天然气', '6a4c56ff-b3e1-4555-9b1c-87d05bcfa4d9', 3, 'timeofuse', '元/m³', '2019-12-31 16:00:00', '2023-12-31 15:59:59'), -(15, '分量阶梯电价', 'd1b81d2f-d387-43d3-affd-d796b7236b60', 1, 'block', '元/千瓦时', '2019-12-31 16:00:00', '2023-12-31 15:59:59'); - -COMMIT; - -- --------------------------------------------------------------------------------------------------------------------- -- Table `myems_system_db`.`tbl_tariffs_timeofuses` -- --------------------------------------------------------------------------------------------------------------------- @@ -1611,128 +848,6 @@ CREATE TABLE IF NOT EXISTS `myems_system_db`.`tbl_tariffs_timeofuses` ( PRIMARY KEY (`id`)); CREATE INDEX `tbl_tariffs_timeofuses_index_1` ON `myems_system_db`.`tbl_tariffs_timeofuses` (`tariff_id`, `start_time_of_day`); --- --------------------------------------------------------------------------------------------------------------------- --- Example Data for table `myems_system_db`.`tbl_tariffs_timeofuses` --- --------------------------------------------------------------------------------------------------------------------- -START TRANSACTION; -USE `myems_system_db`; - -INSERT INTO `myems_system_db`.`tbl_tariffs_timeofuses` -(`id`, `tariff_id`, `start_time_of_day`, `end_time_of_day`, `peak_type`, `price`) -VALUES --- '2020分时电价1-6' -(1, 1, '00:00:00', '05:59:59', 'offpeak', 0.345), -(2, 1, '06:00:00', '07:59:59', 'midpeak', 0.708), -(3, 1, '08:00:00', '10:59:59', 'onpeak', 1.159), -(4, 1, '11:00:00', '17:59:59', 'midpeak', 0.708), -(5, 1, '18:00:00', '20:59:59', 'onpeak', 1.159), -(6, 1, '21:00:00', '21:59:59', 'midpeak', 0.708), -(7, 1, '22:00:00', '23:59:59', 'offpeak', 0.345), --- '2020分时电价7-9' -(8, 2, '00:00:00', '05:59:59', 'offpeak', 0.345), -(9, 2, '06:00:00', '07:59:59', 'midpeak', 0.708), -(10, 2, '08:00:00', '10:59:59', 'offpeak', 1.159), -(11, 2, '11:00:00', '12:59:59', 'midpeak', 0.708), -(12, 2, '13:00:00', '14:59:59', 'onpeak', 1.159), -(13, 2, '15:00:00', '17:59:59', 'midpeak', 0.708), -(14, 2, '18:00:00', '20:59:59', 'onpeak', 1.159), -(15, 2, '21:00:00', '21:59:59', 'midpeak', 0.708), -(16, 2, '22:00:00', '23:59:59', 'offpeak', 0.345), --- '2020分时电价10-12' -(17, 3, '00:00:00', '05:59:59', 'offpeak', 0.345), -(18, 3, '06:00:00', '07:59:59', 'midpeak', 0.708), -(19, 3, '08:00:00', '10:59:59', 'onpeak', 1.159), -(20, 3, '11:00:00', '17:59:59', 'midpeak', 0.708), -(21, 3, '18:00:00', '20:59:59', 'onpeak', 1.159), -(22, 3, '21:00:00', '21:59:59', 'midpeak', 0.708), -(23, 3, '22:00:00', '23:59:59', 'offpeak', 0.345), --- '2021分时电价1-6' -(24, 4, '00:00:00', '05:59:59', 'offpeak', 0.345), -(25, 4, '06:00:00', '07:59:59', 'midpeak', 0.708), -(26, 4, '08:00:00', '10:59:59', 'onpeak', 1.159), -(27, 4, '11:00:00', '17:59:59', 'midpeak', 0.708), -(28, 4, '18:00:00', '20:59:59', 'onpeak', 1.159), -(29, 4, '21:00:00', '21:59:59', 'midpeak', 0.708), -(30, 4, '22:00:00', '23:59:59', 'offpeak', 0.345), --- '2021分时电价7-9' -(31, 5, '00:00:00', '05:59:59', 'offpeak', 0.345), -(32, 5, '06:00:00', '07:59:59', 'midpeak', 0.708), -(33, 5, '08:00:00', '10:59:59', 'offpeak', 1.159), -(34, 5, '11:00:00', '12:59:59', 'midpeak', 0.708), -(35, 5, '13:00:00', '14:59:59', 'onpeak', 1.159), -(36, 5, '15:00:00', '17:59:59', 'midpeak', 0.708), -(37, 5, '18:00:00', '20:59:59', 'onpeak', 1.159), -(38, 5, '21:00:00', '21:59:59', 'midpeak', 0.708), -(39, 5, '22:00:00', '23:59:59', 'offpeak', 0.345), --- '2021分时电价10-12' -(40, 6, '00:00:00', '05:59:59', 'offpeak', 0.345), -(41, 6, '06:00:00', '07:59:59', 'midpeak', 0.708), -(42, 6, '08:00:00', '10:59:59', 'onpeak', 1.159), -(43, 6, '11:00:00', '17:59:59', 'midpeak', 0.708), -(44, 6, '18:00:00', '20:59:59', 'onpeak', 1.159), -(45, 6, '21:00:00', '21:59:59', 'midpeak', 0.708), -(46, 6, '22:00:00', '23:59:59', 'offpeak', 0.345), --- '2022分时电价1-6' -(47, 7, '00:00:00', '05:59:59', 'offpeak', 0.345), -(48, 7, '06:00:00', '07:59:59', 'midpeak', 0.708), -(49, 7, '08:00:00', '10:59:59', 'onpeak', 1.159), -(50, 7, '11:00:00', '17:59:59', 'midpeak', 0.708), -(51, 7, '18:00:00', '20:59:59', 'onpeak', 1.159), -(52, 7, '21:00:00', '21:59:59', 'midpeak', 0.708), -(53, 7, '22:00:00', '23:59:59', 'offpeak', 0.345), --- '2022分时电价7-9' -(54, 8, '00:00:00', '05:59:59', 'offpeak', 0.345), -(55, 8, '06:00:00', '07:59:59', 'midpeak', 0.708), -(56, 8, '08:00:00', '10:59:59', 'offpeak', 1.159), -(57, 8, '11:00:00', '12:59:59', 'midpeak', 0.708), -(58, 8, '13:00:00', '14:59:59', 'onpeak', 1.159), -(59, 8, '15:00:00', '17:59:59', 'midpeak', 0.708), -(60, 8, '18:00:00', '20:59:59', 'onpeak', 1.159), -(61, 8, '21:00:00', '21:59:59', 'midpeak', 0.708), -(62, 8, '22:00:00', '23:59:59', 'offpeak', 0.345), --- '2022分时电价10-12' -(63, 9, '00:00:00', '05:59:59', 'offpeak', 0.345), -(64, 9, '06:00:00', '07:59:59', 'midpeak', 0.708), -(65, 9, '08:00:00', '10:59:59', 'onpeak', 1.159), -(66, 9, '11:00:00', '17:59:59', 'midpeak', 0.708), -(67, 9, '18:00:00', '20:59:59', 'onpeak', 1.159), -(68, 9, '21:00:00', '21:59:59', 'midpeak', 0.708), -(69, 9, '22:00:00', '23:59:59', 'offpeak', 0.345), --- '2023分时电价1-6' -(70, 10, '00:00:00', '05:59:59', 'offpeak', 0.345), -(71, 10, '06:00:00', '07:59:59', 'midpeak', 0.708), -(72, 10, '08:00:00', '10:59:59', 'onpeak', 1.159), -(73, 10, '11:00:00', '17:59:59', 'midpeak', 0.708), -(74, 10, '18:00:00', '20:59:59', 'onpeak', 1.159), -(75, 10, '21:00:00', '21:59:59', 'midpeak', 0.708), -(76, 10, '22:00:00', '23:59:59', 'offpeak', 0.345), --- '2023分时电价7-9' -(77, 11, '00:00:00', '05:59:59', 'offpeak', 0.345), -(78, 11, '06:00:00', '07:59:59', 'midpeak', 0.708), -(79, 11, '08:00:00', '10:59:59', 'offpeak', 1.159), -(80, 11, '11:00:00', '12:59:59', 'midpeak', 0.708), -(81, 11, '13:00:00', '14:59:59', 'onpeak', 1.159), -(82, 11, '15:00:00', '17:59:59', 'midpeak', 0.708), -(83, 11, '18:00:00', '20:59:59', 'onpeak', 1.159), -(84, 11, '21:00:00', '21:59:59', 'midpeak', 0.708), -(85, 11, '22:00:00', '23:59:59', 'offpeak', 0.345), --- '2023分时电价10-12' -(86, 12, '00:00:00', '05:59:59', 'offpeak', 0.345), -(87, 12, '06:00:00', '07:59:59', 'midpeak', 0.708), -(88, 12, '08:00:00', '10:59:59', 'onpeak', 1.159), -(89, 12, '11:00:00', '17:59:59', 'midpeak', 0.708), -(90, 12, '18:00:00', '20:59:59', 'onpeak', 1.159), -(91, 12, '21:00:00', '21:59:59', 'midpeak', 0.708), -(92, 12, '22:00:00', '23:59:59', 'offpeak', 0.345), --- '自来水' --- 'Water' -(93, 13, '00:00:00', '23:59:59', 'midpeak', 5.95), --- '天然气' --- 'Natual Gas' -(94, 14, '00:00:00', '23:59:59', 'midpeak', 3.50); -COMMIT; - - -- --------------------------------------------------------------------------------------------------------------------- -- Table `myems_system_db`.`tbl_tariffs_blocks` -- --------------------------------------------------------------------------------------------------------------------- @@ -1747,24 +862,6 @@ CREATE TABLE IF NOT EXISTS `myems_system_db`.`tbl_tariffs_blocks` ( PRIMARY KEY (`id`)); CREATE INDEX `tbl_tariffs_blocks_index_1` ON `myems_system_db`.`tbl_tariffs_blocks` (`tariff_id`, `start_amount`); --- --------------------------------------------------------------------------------------------------------------------- --- Example Data for table `myems_system_db`.`tbl_tariffs_blocks` --- --------------------------------------------------------------------------------------------------------------------- -START TRANSACTION; -USE `myems_system_db`; - -INSERT INTO `myems_system_db`.`tbl_tariffs_blocks` -(`id`, `tariff_id`, `start_amount`, `end_amount`, `price`) -VALUES --- '分量阶梯电价' --- 'Block tariff of electrical' -(1, 15, 0, 10000, 0.345), -(2, 15, 10000, 30000, 0.456), -(3, 15, 30000, 100000, 0.567), -(4, 15, 100000, 1000000000, 0.678); - -COMMIT; - -- --------------------------------------------------------------------------------------------------------------------- -- Table `myems_system_db`.`tbl_stores` -- --------------------------------------------------------------------------------------------------------------------- @@ -1786,18 +883,6 @@ CREATE TABLE IF NOT EXISTS `myems_system_db`.`tbl_stores` ( PRIMARY KEY (`id`)); CREATE INDEX `tbl_stores_index_1` ON `myems_system_db`.`tbl_stores` (`name`); --- --------------------------------------------------------------------------------------------------------------------- --- Example Data for table `myems_system_db`.`tbl_stores` --- --------------------------------------------------------------------------------------------------------------------- -START TRANSACTION; -USE `myems_system_db`; - -INSERT INTO `myems_system_db`.`tbl_stores` -(`id`, `name`, `uuid`, `address`, `latitude`, `longitude`, `area`, `store_type_id`, `is_input_counted`, `contact_id`, `cost_center_id`, `description`) -VALUES - (1, '麦当劳(祈年大街得来速店)', 'd8a24322-4bab-4ba2-aedc-5d55a84c3db8', '北京市东城区东打磨厂街7号', 39.899493, 116.412041, 500.000, 1, true, 1, 1, 'MacDonalds'); -COMMIT; - -- --------------------------------------------------------------------------------------------------------------------- -- Table `myems_system_db`.`tbl_store_types` -- --------------------------------------------------------------------------------------------------------------------- @@ -1812,22 +897,6 @@ CREATE TABLE IF NOT EXISTS `myems_system_db`.`tbl_store_types` ( PRIMARY KEY (`id`)); CREATE INDEX `tbl_store_types_index_1` ON `myems_system_db`.`tbl_store_types` (`name`); --- --------------------------------------------------------------------------------------------------------------------- --- Example Data for table `myems_system_db`.`tbl_store_types` --- --------------------------------------------------------------------------------------------------------------------- -START TRANSACTION; -USE `myems_system_db`; - -INSERT INTO `myems_system_db`.`tbl_store_types` -(`id`, `name`, `uuid`, `description`, `simplified_code`) -VALUES -(1, 'Restaurant', '494d7d5e-e139-4629-b957-99ea4caf0401', '餐饮', 'RS'), -(2, 'Retail', '1f556579-9d5c-45ce-9bd8-f2dc1d033470', '零售', 'RT'), -(3, 'Hotel', 'cae697aa-ceca-435d-91bf-492b46607eb0', '酒店', 'HT'); - - -COMMIT; - -- --------------------------------------------------------------------------------------------------------------------- -- Table `myems_system_db`.`tbl_stores_meters` -- --------------------------------------------------------------------------------------------------------------------- @@ -1840,19 +909,6 @@ CREATE TABLE IF NOT EXISTS `myems_system_db`.`tbl_stores_meters` ( PRIMARY KEY (`id`)); CREATE INDEX `tbl_stores_meters_index_1` ON `myems_system_db`.`tbl_stores_meters` (`store_id`); --- --------------------------------------------------------------------------------------------------------------------- --- Example Data for table `myems_system_db`.`tbl_stores_meters` --- --------------------------------------------------------------------------------------------------------------------- --- START TRANSACTION; --- USE `myems_system_db`; - --- INSERT INTO `myems_system_db`.`tbl_stores_meters` --- (`id`, `store_id`, `meter_id`) --- VALUES --- (1, 1, 1); - --- COMMIT; - -- --------------------------------------------------------------------------------------------------------------------- -- Table `myems_system_db`.`tbl_stores_offline_meters` -- --------------------------------------------------------------------------------------------------------------------- @@ -1864,18 +920,6 @@ CREATE TABLE IF NOT EXISTS `myems_system_db`.`tbl_stores_offline_meters` ( `offline_meter_id` BIGINT NOT NULL, PRIMARY KEY (`id`)); CREATE INDEX `tbl_stores_offline_meters_index_1` ON `myems_system_db`.`tbl_stores_offline_meters` (`store_id`); --- --------------------------------------------------------------------------------------------------------------------- --- Example Data for table `myems_system_db`.`tbl_stores_offline_meters` --- --------------------------------------------------------------------------------------------------------------------- --- START TRANSACTION; --- USE `myems_system_db`; - --- INSERT INTO `myems_system_db`.`tbl_stores_offline_meters` --- (`id`, `store_id`, `offline_meter_id`) --- VALUES --- (1, 1, 1); - --- COMMIT; -- --------------------------------------------------------------------------------------------------------------------- -- Table `myems_system_db`.`tbl_stores_points` @@ -1889,22 +933,6 @@ CREATE TABLE IF NOT EXISTS `myems_system_db`.`tbl_stores_points` ( PRIMARY KEY (`id`)); CREATE INDEX `tbl_stores_points_index_1` ON `myems_system_db`.`tbl_stores_points` (`store_id`); --- --------------------------------------------------------------------------------------------------------------------- --- Example Data for table `myems_system_db`.`tbl_stores_points` --- --------------------------------------------------------------------------------------------------------------------- --- START TRANSACTION; --- USE `myems_system_db`; - --- INSERT INTO `myems_system_db`.`tbl_stores_points` --- (`id`, store_id`, `point_id`) --- VALUES --- (1, 3, 2000001), --- (2, 3, 2000002), --- (3, 3, 2000003), --- (4, 3, 2000006); - --- COMMIT; - -- --------------------------------------------------------------------------------------------------------------------- -- Table `myems_system_db`.`tbl_stores_sensors` -- --------------------------------------------------------------------------------------------------------------------- @@ -1917,19 +945,6 @@ CREATE TABLE IF NOT EXISTS `myems_system_db`.`tbl_stores_sensors` ( PRIMARY KEY (`id`)); CREATE INDEX `tbl_stores_sensors_index_1` ON `myems_system_db`.`tbl_stores_sensors` (`store_id`); --- --------------------------------------------------------------------------------------------------------------------- --- Example Data for table `myems_system_db`.`tbl_stores_sensors` --- --------------------------------------------------------------------------------------------------------------------- --- START TRANSACTION; --- USE `myems_system_db`; - --- INSERT INTO `myems_system_db`.`tbl_stores_sensors` --- (`id`, `store_id`, `sensor_id`) --- VALUES --- (1, 1, 1); - --- COMMIT; - -- --------------------------------------------------------------------------------------------------------------------- -- Table `myems_system_db`.`tbl_stores_virtual_meters` -- --------------------------------------------------------------------------------------------------------------------- @@ -1942,19 +957,6 @@ CREATE TABLE IF NOT EXISTS `myems_system_db`.`tbl_stores_virtual_meters` ( PRIMARY KEY (`id`)); CREATE INDEX `tbl_stores_virtual_meters_index_1` ON `myems_system_db`.`tbl_stores_virtual_meters` (`store_id`); --- --------------------------------------------------------------------------------------------------------------------- --- Example Data for table `myems_system_db`.`tbl_stores_virtual_meters` --- --------------------------------------------------------------------------------------------------------------------- --- START TRANSACTION; --- USE `myems_system_db`; - --- INSERT INTO `myems_system_db`.`tbl_stores_virtual_meters` --- (`id`, `store_id`, `virtual_meter_id`) --- VALUES --- (1, 1, 1); - --- COMMIT; - -- --------------------------------------------------------------------------------------------------------------------- -- Table `myems_system_db`.`tbl_tenants` -- --------------------------------------------------------------------------------------------------------------------- @@ -1981,20 +983,6 @@ CREATE TABLE IF NOT EXISTS `myems_system_db`.`tbl_tenants` ( PRIMARY KEY (`id`)); CREATE INDEX `tbl_tenants_index_1` ON `myems_system_db`.`tbl_tenants` (`name`); --- --------------------------------------------------------------------------------------------------------------------- --- Example Data for table `myems_system_db`.`tbl_tenants` --- --------------------------------------------------------------------------------------------------------------------- -START TRANSACTION; -USE `myems_system_db`; - -INSERT INTO `myems_system_db`.`tbl_tenants` -(`id`, `name`, `uuid`, `buildings`, `floors`, `rooms`, `area`, `tenant_type_id`, `is_input_counted`, `is_key_tenant`, - `lease_number`, `lease_start_datetime_utc`, `lease_end_datetime_utc`, `is_in_lease`, `contact_id`, `cost_center_id`, `description`) -VALUES - (1, 'Starbucks星巴克', '6b0da806-a4cd-431a-8116-2915e90aaf8b', 'Building #1', 'L1 L2 L3', '1201b+2247+3F', 418.8, 9, true, true, - '6b0da806', '2019-12-31 16:00:00', '2022-12-31 16:00:00', true, 1, 1, 'my description'); -COMMIT; - -- --------------------------------------------------------------------------------------------------------------------- -- Table `myems_system_db`.`tbl_tenant_types` -- --------------------------------------------------------------------------------------------------------------------- @@ -2009,28 +997,6 @@ CREATE TABLE IF NOT EXISTS `myems_system_db`.`tbl_tenant_types` ( PRIMARY KEY (`id`)); CREATE INDEX `tbl_tenant_types_index_1` ON `myems_system_db`.`tbl_tenant_types` (`name`); --- --------------------------------------------------------------------------------------------------------------------- --- Example Data for table `myems_system_db`.`tbl_tenant_types` --- --------------------------------------------------------------------------------------------------------------------- -START TRANSACTION; -USE `myems_system_db`; - -INSERT INTO `myems_system_db`.`tbl_tenant_types` -(`id`, `name`, `uuid`, `description`, `simplified_code`) -VALUES -(1, '餐饮租户', '83fffba1-9e22-4397-a93a-3742772c3753', 'Food and Beverage', 'FNB'), -(2, '燃气餐饮租户', 'ad95ed16-1c57-49a9-a85e-71e389393089', 'Food and Beverage (Gas)', 'FNBGas'), -(3, '电餐饮租户', '1dc21e83-4333-40f8-9e25-ea049becba37', 'Food and Beverage (Electrical)', 'FNBElec'), -(4, '高照度租户', '4208a60d-d8e6-4fe5-8cea-a55109e9b397', 'High Illuminance Tenant', 'HighIllu'), -(5, '主力租户', 'fc4ae534-544a-4a22-b83b-9f4aa99494aa', 'Anchor Tenant', 'ANCH'), -(6, '普通商业租户', '6d1dca30-1cbe-463d-8a78-cdd5e0f8ac8b', 'Normal Tenant', 'Normal'), -(7, '其他商业租户', '2078e1c0-3936-4ae7-9253-08e0aa1d84b6', 'Other Retail Tenants', 'Other'), -(8, '整层办公租户', 'b2a580a3-edc9-4838-ae1d-7b7265860a9a', 'Whole Floor Office Tenant', 'WhFlr'), -(9, '非整层办公租户', '55bbcba7-d8a0-44a0-9a9f-2f085e3cb044', 'None-Whole Floor Office Tenant', 'NonWhFlr'); - - -COMMIT; - -- --------------------------------------------------------------------------------------------------------------------- -- Table `myems_system_db`.`tbl_tenants_meters` -- --------------------------------------------------------------------------------------------------------------------- @@ -2043,19 +1009,6 @@ CREATE TABLE IF NOT EXISTS `myems_system_db`.`tbl_tenants_meters` ( PRIMARY KEY (`id`)); CREATE INDEX `tbl_tenants_meters_index_1` ON `myems_system_db`.`tbl_tenants_meters` (`tenant_id`); --- --------------------------------------------------------------------------------------------------------------------- --- Example Data for table `myems_system_db`.`tbl_tenants_meters` --- --------------------------------------------------------------------------------------------------------------------- --- START TRANSACTION; --- USE `myems_system_db`; - --- INSERT INTO `myems_system_db`.`tbl_tenants_meters` --- (`id`, `tenant_id`, `meter_id`) --- VALUES --- (1, 1, 1); - --- COMMIT; - -- --------------------------------------------------------------------------------------------------------------------- -- Table `myems_system_db`.`tbl_tenants_offline_meters` -- --------------------------------------------------------------------------------------------------------------------- @@ -2067,18 +1020,6 @@ CREATE TABLE IF NOT EXISTS `myems_system_db`.`tbl_tenants_offline_meters` ( `offline_meter_id` BIGINT NOT NULL, PRIMARY KEY (`id`)); CREATE INDEX `tbl_tenants_offline_meters_index_1` ON `myems_system_db`.`tbl_tenants_offline_meters` (`tenant_id`); --- --------------------------------------------------------------------------------------------------------------------- --- Example Data for table `myems_system_db`.`tbl_tenants_offline_meters` --- --------------------------------------------------------------------------------------------------------------------- --- START TRANSACTION; --- USE `myems_system_db`; - --- INSERT INTO `myems_system_db`.`tbl_tenants_offline_meters` --- (`id`, `tenant_id`, `offline_meter_id`) --- VALUES --- (1, 1, 1); - --- COMMIT; -- --------------------------------------------------------------------------------------------------------------------- -- Table `myems_system_db`.`tbl_tenants_points` @@ -2092,22 +1033,6 @@ CREATE TABLE IF NOT EXISTS `myems_system_db`.`tbl_tenants_points` ( PRIMARY KEY (`id`)); CREATE INDEX `tbl_tenants_points_index_1` ON `myems_system_db`.`tbl_tenants_points` (`tenant_id`); --- --------------------------------------------------------------------------------------------------------------------- --- Example Data for table `myems_system_db`.`tbl_tenants_points` --- --------------------------------------------------------------------------------------------------------------------- --- START TRANSACTION; --- USE `myems_system_db`; - --- INSERT INTO `myems_system_db`.`tbl_tenants_points` --- (`id`, tenant_id`, `point_id`) --- VALUES --- (1, 3, 2000001), --- (2, 3, 2000002), --- (3, 3, 2000003), --- (4, 3, 2000006); - --- COMMIT; - -- --------------------------------------------------------------------------------------------------------------------- -- Table `myems_system_db`.`tbl_tenants_sensors` -- --------------------------------------------------------------------------------------------------------------------- @@ -2120,19 +1045,6 @@ CREATE TABLE IF NOT EXISTS `myems_system_db`.`tbl_tenants_sensors` ( PRIMARY KEY (`id`)); CREATE INDEX `tbl_tenants_sensors_index_1` ON `myems_system_db`.`tbl_tenants_sensors` (`tenant_id`); --- --------------------------------------------------------------------------------------------------------------------- --- Example Data for table `myems_system_db`.`tbl_tenants_sensors` --- --------------------------------------------------------------------------------------------------------------------- --- START TRANSACTION; --- USE `myems_system_db`; - --- INSERT INTO `myems_system_db`.`tbl_tenants_sensors` --- (`id`, `tenant_id`, `sensor_id`) --- VALUES --- (1, 1, 1); - --- COMMIT; - -- --------------------------------------------------------------------------------------------------------------------- -- Table `myems_system_db`.`tbl_tenants_virtual_meters` -- --------------------------------------------------------------------------------------------------------------------- @@ -2145,19 +1057,6 @@ CREATE TABLE IF NOT EXISTS `myems_system_db`.`tbl_tenants_virtual_meters` ( PRIMARY KEY (`id`)); CREATE INDEX `tbl_tenants_virtual_meters_index_1` ON `myems_system_db`.`tbl_tenants_virtual_meters` (`tenant_id`); --- --------------------------------------------------------------------------------------------------------------------- --- Example Data for table `myems_system_db`.`tbl_tenants_virtual_meters` --- --------------------------------------------------------------------------------------------------------------------- --- START TRANSACTION; --- USE `myems_system_db`; - --- INSERT INTO `myems_system_db`.`tbl_tenants_virtual_meters` --- (`id`, `tenant_id`, `virtual_meter_id`) --- VALUES --- (1, 1, 1); - --- COMMIT; - -- --------------------------------------------------------------------------------------------------------------------- -- Table `myems_system_db`.`tbl_timezones` -- --------------------------------------------------------------------------------------------------------------------- @@ -2274,6 +1173,7 @@ VALUES (93, 'Kamchatka Standard Time', '(GMT+12:00) Petropavlovsk-Kamchatsky', '+12:00'); COMMIT; + -- --------------------------------------------------------------------------------------------------------------------- -- Table `myems_system_db`.`tbl_virtual_meters` -- --------------------------------------------------------------------------------------------------------------------- @@ -2293,19 +1193,6 @@ CREATE INDEX `tbl_virtual_meters_index_1` ON `myems_system_db`.`tbl_virtual_met CREATE INDEX `tbl_virtual_meters_index_2` ON `myems_system_db`.`tbl_virtual_meters` (`energy_category_id`); CREATE INDEX `tbl_virtual_meters_index_3` ON `myems_system_db`.`tbl_virtual_meters` (`energy_item_id`); --- --------------------------------------------------------------------------------------------------------------------- --- Example Data for table `myems_system_db`.`tbl_virtual_meters` --- --------------------------------------------------------------------------------------------------------------------- --- START TRANSACTION; --- USE `myems_system_db`; - --- INSERT INTO `myems_system_db`.`tbl_virtual_meters` --- (`id`, `name`, `uuid`, `energy_category_id`, `is_counted`, `cost_center_id`, `energy_item_id`, `description`) --- VALUES --- (1, '示例虚拟表', '3fff2cfb-f755-44c8-a919-6135205a8573', 1, true, 1, 1, `virtual description`); - --- COMMIT; - -- --------------------------------------------------------------------------------------------------------------------- -- Table `myems_system_db`.`tbl_variables` -- --------------------------------------------------------------------------------------------------------------------- @@ -2321,23 +1208,6 @@ CREATE TABLE IF NOT EXISTS `myems_system_db`.`tbl_variables` ( CREATE INDEX `tbl_variables_index_1` ON `myems_system_db`.`tbl_variables` (`expression_id`); CREATE INDEX `tbl_variables_index_2` ON `myems_system_db`.`tbl_variables` (`meter_id`, `meter_type`, `expression_id`); --- --------------------------------------------------------------------------------------------------------------------- --- Example Data for table `myems_system_db`.`tbl_variables` --- --------------------------------------------------------------------------------------------------------------------- --- START TRANSACTION; --- USE `myems_system_db`; --- -- id 1 --- -- meter_type = {'meter', 'virtual_meter', 'offline_meter'} --- -- --- INSERT INTO `myems_system_db`.`tbl_variables` --- (`id`, `name`, `expression_id`, `meter_type`, `meter_id`) --- VALUES --- (1, 'x', 1, 'meter', 1), --- (2, 'y', 1, 'meter', 2), --- (3, 'z', 1, 'meter', 3); - --- COMMIT; - -- --------------------------------------------------------------------------------------------------------------------- -- Table `myems_system_db`.`tbl_versions` -- --------------------------------------------------------------------------------------------------------------------- @@ -2350,7 +1220,7 @@ CREATE TABLE IF NOT EXISTS `myems_system_db`.`tbl_versions` ( PRIMARY KEY (`id`)); -- --------------------------------------------------------------------------------------------------------------------- --- Example Data for table `myems_system_db`.`tbl_versions` +-- Data for table `myems_system_db`.`tbl_versions` -- --------------------------------------------------------------------------------------------------------------------- START TRANSACTION; USE `myems_system_db`; From 69ca031d8ccf1180396f1bed89210de3caa1d9be Mon Sep 17 00:00:00 2001 From: "13621160019@163.com" <13621160019@163.com> Date: Fri, 6 Aug 2021 14:57:18 +0800 Subject: [PATCH 8/8] updated README --- README.md | 4 ---- README_DE.md | 4 ---- README_EN.md | 4 ---- 3 files changed, 12 deletions(-) diff --git a/README.md b/README.md index 7aa674cf..551206e7 100644 --- a/README.md +++ b/README.md @@ -38,10 +38,6 @@ MyEMS项目由下列组件构成: [安装 admin UI](./admin/README.md) -### MyEMS BACnet/IP 数据采集服务 (Python) - -[安装 myems-bacnet](../myems-bacnet/README.md) - ### MyEMS Modbus TCP 数据采集服务 (Python) [安装 myems-modbus-tcp](./myems-modbus-tcp/README.md) diff --git a/README_DE.md b/README_DE.md index 6d0f833c..d21d862e 100644 --- a/README_DE.md +++ b/README_DE.md @@ -39,10 +39,6 @@ Dieses Projekt besteht aus folgenden Komponenten: [Installieren admin UI](./admin/README.md) -### MyEMS BACnet/IP Acquisition Service (Python) - -[Installieren myems-bacnet](../myems-bacnet/README.md) - ### MyEMS Modbus TCP Acquisition Service (Python) [Installieren myems-modbus-tcp](./myems-modbus-tcp/README.md) diff --git a/README_EN.md b/README_EN.md index 5293829b..68a7a159 100644 --- a/README_EN.md +++ b/README_EN.md @@ -39,10 +39,6 @@ This project is compose of following components: [Install admin UI](./admin/README.md) -### MyEMS BACnet/IP Acquisition Service (Python) - -[Install myems-bacnet](../myems-bacnet/README.md) - ### MyEMS Modbus TCP Acquisition Service (Python) [Install myems-modbus-tcp](./myems-modbus-tcp/README.md)