From abb45dadbc07f20f74453193207cdeb5757f0f86 Mon Sep 17 00:00:00 2001
From: "13621160019@163.com" <13621160019@163.com>
Date: Mon, 19 Jul 2021 19:48:00 +0800
Subject: [PATCH] added Cost File to API and Admin UI and upgraded to v1.1.4
---
CHANGELOG.md | 38 +-
admin/app/config.router.js | 44 +-
.../costcenter/cost-file.controller.js | 181 -------
.../knowledgefile/knowledgefile.controller.js | 2 -
.../meter/offline-meter-file.controller.js | 195 -------
.../meter/offline-meter.controller.js | 302 -----------
.../meter/virtual-meter.controller.js | 494 ------------------
.../settings/costcenter/cost-file.service.js | 34 --
.../meter/offline-meter-file.service.js | 68 ---
.../settings/meter/offline-meter.service.js | 59 ---
.../settings/meter/virtual-meter.service.js | 50 --
admin/app/translations.js | 19 +-
admin/views/common/footer-login.html | 2 +-
admin/views/common/footer.html | 2 +-
.../views/settings/costcenter/costcenter.html | 235 +++++----
...ter.model.html => offlinemeter.model.html} | 0
database/myems_historical_db.sql | 28 +-
database/myems_system_db.sql | 26 +-
database/upgrade1.1.4.sql | 21 +
myems-api/MyEMS.postman_collection.json | 261 ++++-----
myems-api/README.md | 34 +-
myems-api/app.py | 12 +-
.../core/{offlinecostfile.py => costfile.py} | 83 ++-
web/package-lock.json | 2 +-
web/package.json | 2 +-
web/src/config.js | 2 +-
26 files changed, 485 insertions(+), 1711 deletions(-)
delete mode 100644 admin/app/controllers/settings/costcenter/cost-file.controller.js
delete mode 100644 admin/app/controllers/settings/meter/offline-meter-file.controller.js
delete mode 100644 admin/app/controllers/settings/meter/offline-meter.controller.js
delete mode 100644 admin/app/controllers/settings/meter/virtual-meter.controller.js
delete mode 100644 admin/app/services/settings/costcenter/cost-file.service.js
delete mode 100644 admin/app/services/settings/meter/offline-meter-file.service.js
delete mode 100644 admin/app/services/settings/meter/offline-meter.service.js
delete mode 100644 admin/app/services/settings/meter/virtual-meter.service.js
rename admin/views/settings/meter/{offline-meter.model.html => offlinemeter.model.html} (100%)
create mode 100644 database/upgrade1.1.4.sql
rename myems-api/core/{offlinecostfile.py => costfile.py} (73%)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 919c446f..f9d9c351 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -16,6 +16,41 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
### Removed
- None.
+## [v1.1.4] - 2021-07-19
+### Added
+- added tbl_email_messages to myems_reporting_db
+- added data sort to FDD messages in Admin UI
+- added new category to FDD rule in API & Admin UI
+- added Search Input for meters in Web UI
+- added last year data to dashboard
+- added ChildSpaceProportion SharePies to Space Energy Category report of Web UI
+- added ORDER BY utc_date_time to all digital parameters data in API
+- added the pagination for meter realtime page
+- added pagination to MeterRealtime in Web UI
+- added internationalization of Vertical Navigation Bar in Web UI
+- added Equipment Batch Analysis report API
+- added Cost File to API and Admin UI
+- added restore button to offline meter file in API and Admin UI
+
+### Changed
+- changed GET Data Source Point Collection to order by ID
+- changed equipment and combined equipment associated points name to parameters name in reports API
+- updated validate expression of rule in API
+- updated i18n in Web UI
+- upgraded Web UI library to 2.10.2
+
+### Fixed
+- fixed typo for deleting email messages in Admin UI
+- fixed issues of deleting text message and wechat message in Admin UI
+- fixed base period cost units issue of Dashboard API
+- fixed selected meter issues in onSearchMeter of Web UI
+- fixed wrong HTTP Status Code issues in API
+- fixed Child Space Share Pie issue in excel exporter of spaceenergycategory
+
+### Removed
+- Drop table tbl_sms_recipients from myems_fdd_db
+- deleted parameters data from Dashboard
+
## [v1.1.3] - 2021-05-25
### Added
- added Combined Equipment Batch Analysis Report
@@ -256,7 +291,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
### Removed
- None.
-[Unreleased]: https://github.com/MyEMS/myems/compare/v1.1.3...HEAD
+[Unreleased]: https://github.com/MyEMS/myems/compare/v1.1.4...HEAD
+[v1.1.4]: https://github.com/MyEMS/myems/compare/v1.1.3...v1.1.4
[v1.1.3]: https://github.com/MyEMS/myems/compare/v1.1.2...v1.1.3
[v1.1.2]: https://github.com/MyEMS/myems/compare/v1.1.1...v1.1.2
[v1.1.1]: https://github.com/MyEMS/myems/compare/v1.1.0...v1.1.1
diff --git a/admin/app/config.router.js b/admin/app/config.router.js
index 8c0969c1..754ef9d5 100644
--- a/admin/app/config.router.js
+++ b/admin/app/config.router.js
@@ -430,8 +430,8 @@ app
'app/services/settings/datasource/datasource.service.js',
'app/services/settings/datasource/point.service.js',
'app/services/settings/meter/meter.service.js',
- 'app/services/settings/meter/virtual-meter.service.js',
- 'app/services/settings/meter/offline-meter.service.js',
+ 'app/services/settings/meter/virtualmeter.service.js',
+ 'app/services/settings/meter/offlinemeter.service.js',
'app/services/settings/equipment/equipment.service.js',
'app/services/settings/combinedequipment/combinedequipment.service.js',
'app/services/settings/tenant/tenant.service.js',
@@ -497,8 +497,8 @@ app
'app/services/settings/tenant/tenant.service.js',
'app/services/settings/tenant/tenanttype.service.js',
'app/services/settings/meter/meter.service.js',
- 'app/services/settings/meter/virtual-meter.service.js',
- 'app/services/settings/meter/offline-meter.service.js',
+ 'app/services/settings/meter/virtualmeter.service.js',
+ 'app/services/settings/meter/offlinemeter.service.js',
'app/services/settings/costcenter/costcenter.service.js',
'app/services/settings/contact/contact.service.js',
'app/services/settings/tenant/tenantmeter.service.js',
@@ -553,8 +553,8 @@ app
'app/services/settings/store/store.service.js',
'app/services/settings/store/storetype.service.js',
'app/services/settings/meter/meter.service.js',
- 'app/services/settings/meter/virtual-meter.service.js',
- 'app/services/settings/meter/offline-meter.service.js',
+ 'app/services/settings/meter/virtualmeter.service.js',
+ 'app/services/settings/meter/offlinemeter.service.js',
'app/services/settings/costcenter/costcenter.service.js',
'app/services/settings/contact/contact.service.js',
'app/services/settings/store/storemeter.service.js',
@@ -608,8 +608,8 @@ app
files: [
'app/services/settings/shopfloor/shopfloor.service.js',
'app/services/settings/meter/meter.service.js',
- 'app/services/settings/meter/virtual-meter.service.js',
- 'app/services/settings/meter/offline-meter.service.js',
+ 'app/services/settings/meter/virtualmeter.service.js',
+ 'app/services/settings/meter/offlinemeter.service.js',
'app/services/settings/costcenter/costcenter.service.js',
'app/services/settings/contact/contact.service.js',
'app/services/settings/shopfloor/shopfloorequipment.service.js',
@@ -660,8 +660,8 @@ app
'app/services/settings/costcenter/costcenter.service.js',
'app/services/settings/datasource/point.service.js',
'app/services/settings/meter/meter.service.js',
- 'app/services/settings/meter/offline-meter.service.js',
- 'app/services/settings/meter/virtual-meter.service.js',
+ 'app/services/settings/meter/offlinemeter.service.js',
+ 'app/services/settings/meter/virtualmeter.service.js',
'app/services/settings/equipment/equipmentmeter.service.js',
'app/services/settings/equipment/equipmentparameter.service.js',
'app/controllers/settings/equipment/equipment.master.controller.js',
@@ -702,8 +702,8 @@ app
'app/services/settings/datasource/point.service.js',
'app/services/settings/equipment/equipment.service.js',
'app/services/settings/meter/meter.service.js',
- 'app/services/settings/meter/offline-meter.service.js',
- 'app/services/settings/meter/virtual-meter.service.js',
+ 'app/services/settings/meter/offlinemeter.service.js',
+ 'app/services/settings/meter/virtualmeter.service.js',
'app/services/settings/combinedequipment/combinedequipmentequipment.service.js',
'app/services/settings/combinedequipment/combinedequipmentmeter.service.js',
'app/services/settings/combinedequipment/combinedequipmentparameter.service.js',
@@ -749,17 +749,17 @@ app
'app/services/settings/category/category.service.js',
'app/services/settings/category/energyitem.service.js',
'app/services/settings/meter/meter.service.js',
- 'app/services/settings/meter/offline-meter.service.js',
- 'app/services/settings/meter/offline-meter-file.service.js',
- 'app/services/settings/meter/virtual-meter.service.js',
+ 'app/services/settings/meter/offlinemeter.service.js',
+ 'app/services/settings/meter/offlinemeterfile.service.js',
+ 'app/services/settings/meter/virtualmeter.service.js',
'app/services/settings/meter/meterpoint.service.js',
'app/services/settings/datasource/datasource.service.js',
'app/services/settings/datasource/point.service.js',
'app/controllers/settings/meter/meter.master.controller.js',
'app/controllers/settings/meter/meter.controller.js',
- 'app/controllers/settings/meter/offline-meter.controller.js',
- 'app/controllers/settings/meter/offline-meter-file.controller.js',
- 'app/controllers/settings/meter/virtual-meter.controller.js',
+ 'app/controllers/settings/meter/offlinemeter.controller.js',
+ 'app/controllers/settings/meter/offlinemeterfile.controller.js',
+ 'app/controllers/settings/meter/virtualmeter.controller.js',
'app/controllers/settings/meter/meterpoint.controller.js'
]
}]);
@@ -832,11 +832,11 @@ app
'app/services/settings/costcenter/costcenter.service.js',
'app/services/settings/costcenter/costcentertariff.service.js',
'app/services/settings/tariff/tariff.service.js',
- 'app/services/settings/costcenter/cost-file.service.js',
+ 'app/services/settings/costcenter/costfile.service.js',
'app/controllers/settings/costcenter/costcenter.master.controller.js',
'app/controllers/settings/costcenter/costcenter.controller.js',
'app/controllers/settings/costcenter/costcentertariff.controller.js',
- 'app/controllers/settings/costcenter/cost-file.controller.js'
+ 'app/controllers/settings/costcenter/costfile.controller.js'
]
}]);
}
@@ -936,8 +936,8 @@ app
'app/services/settings/energyflowdiagram/energyflowdiagramnode.service.js',
'app/services/settings/energyflowdiagram/energyflowdiagramlink.service.js',
'app/services/settings/meter/meter.service.js',
- 'app/services/settings/meter/offline-meter.service.js',
- 'app/services/settings/meter/virtual-meter.service.js',
+ 'app/services/settings/meter/offlinemeter.service.js',
+ 'app/services/settings/meter/virtualmeter.service.js',
'app/controllers/settings/energyflowdiagram/energyflowdiagram.master.controller.js',
'app/controllers/settings/energyflowdiagram/energyflowdiagram.controller.js',
'app/controllers/settings/energyflowdiagram/energyflowdiagramnode.controller.js',
diff --git a/admin/app/controllers/settings/costcenter/cost-file.controller.js b/admin/app/controllers/settings/costcenter/cost-file.controller.js
deleted file mode 100644
index 0cad0e27..00000000
--- a/admin/app/controllers/settings/costcenter/cost-file.controller.js
+++ /dev/null
@@ -1,181 +0,0 @@
-'use strict';
-
-app.controller('CostFileController', function (
- $scope,
- $window,
- $common,
- $translate,
- $uibModal,
- $interval,
- CostFileService,
- toaster,
- SweetAlert) {
-
- $scope.cur_user = JSON.parse($window.localStorage.getItem("currentUser"));
-
- $scope.getAllCostFiles = function () {
- CostFileService.getAllCostFiles(function (error, data) {
- if (!error) {
- $scope.costfiles = data;
- } else {
- $scope.costfiles = [];
- }
- });
-
- };
-
- $scope.dzOptions = {
- url: getAPI() + 'offlinecostfiles',
- acceptedFiles: '.xlsx',
- dictDefaultMessage: 'Click(or Drop) to add files',
- maxFilesize: '100',
- headers: { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token }
- };
-
- $scope.dzCallbacks = {
- 'addedfile': function (file) {
- console.info('File added.', file);
- },
- 'success': function (file, xhr) {
- //console.log('File success to upload from dropzone', file, xhr);
- var popType = 'TOASTER.SUCCESS';
- var popTitle = $common.toaster.success_title;
- var popBody = $common.toaster.success_add_body.format(file.name);
-
- popType = $translate.instant(popType);
- popTitle = $translate.instant(popTitle);
- popBody = $translate.instant(popBody);
-
- toaster.pop({
- type: popType,
- title: popTitle,
- body: popBody,
- showCloseButton: true,
- });
-
- // toaster.pop({
- // type: 'success',
- // title: $common.toaster.success_title,
- // body: $common.toaster.success_add_body.format(file.name),
- // showCloseButton: true,
- // });
- $scope.getAllCostFiles();
- },
- 'error': function (file, xhr) {
- //console.warn('File failed to upload from dropzone', file, xhr);
-
-
- var popType = 'TOASTER.ERROR';
- var popTitle = $common.toaster.error_title;
- var popBody = $common.toaster.error_add_body.format(file.name);
-
- popType = $translate.instant(popType);
- popTitle = $translate.instant(popTitle);
- popBody = $translate.instant(popBody);
-
- toaster.pop({
- type: popType,
- title: popTitle,
- body: popBody,
- showCloseButton: true,
- });
-
- // toaster.pop({
- // type: 'error',
- // title: $common.toaster.error_title,
- // body: $common.toaster.error_add_body.format(file.name),
- // showCloseButton: true,
- // });
- }
- };
-
-
- $scope.deleteCostFile = function (costfile) {
- SweetAlert.swal({
- title: $translate.instant($common.sweet.title),
- text: $translate.instant($common.sweet.text),
- type: "warning",
- showCancelButton: true,
- confirmButtonColor: "#DD6B55",
- confirmButtonText: $translate.instant($common.sweet.confirmButtonText),
- cancelButtonText: $translate.instant($common.sweet.cancelButtonText),
- closeOnConfirm: true,
- closeOnCancel: true
- },
- function (isConfirm) {
- if (isConfirm) {
- CostFileService.deleteCostFile(costfile, function (error, status) {
- if (angular.isDefined(status) && status == 204) {
- var templateName = "TOASTER.COST_FILE";
- templateName = $translate.instant(templateName);
-
- var popType = 'TOASTER.SUCCESS';
- var popTitle = $common.toaster.success_title;
- var popBody = $common.toaster.success_delete_body;
-
- popType = $translate.instant(popType);
- popTitle = $translate.instant(popTitle);
- popBody = $translate.instant(popBody, {template: templateName});
-
- toaster.pop({
- type: popType,
- title: popTitle,
- body: popBody,
- showCloseButton: true,
- });
-
-
- $scope.getAllCostFiles();
- } else if (angular.isDefined(status) && status == 400) {
- var popType = 'TOASTER.ERROR';
- var popTitle = error.title;
- var popBody = error.description;
-
- popType = $translate.instant(popType);
- popTitle = $translate.instant(popTitle);
- popBody = $translate.instant(popBody);
-
-
- toaster.pop({
- type: popType,
- title: popTitle,
- body: popBody,
- showCloseButton: true,
- });
- } else {
- var templateName = "TOASTER.COST_FILE";
- templateName = $translate.instant(templateName);
-
- var popType = 'TOASTER.ERROR';
- var popTitle = $common.toaster.error_title;
- var popBody = $common.toaster.error_delete_body;
-
- popType = $translate.instant(popType);
- popTitle = $translate.instant(popTitle);
- popBody = $translate.instant(popBody, {template: templateName});
-
- toaster.pop({
- type: popType,
- title: popTitle,
- body: popBody,
- showCloseButton: true,
- });
- }
- });
- }
- });
- };
-
- $scope.getAllCostFiles();
- $interval.cancel();
-
- $scope.$on('$destroy', function () {
- // Make sure that the interval is destroyed too
- if (angular.isDefined($scope.refeshfiles)) {
- $interval.cancel($scope.refeshfiles);
- $scope.refeshfiles = undefined;
- }
- });
- $scope.refeshfiles = $interval($scope.getAllCostFiles, 1000 * 8);
-
-});
\ No newline at end of file
diff --git a/admin/app/controllers/settings/knowledgefile/knowledgefile.controller.js b/admin/app/controllers/settings/knowledgefile/knowledgefile.controller.js
index 997f315b..176f0c60 100644
--- a/admin/app/controllers/settings/knowledgefile/knowledgefile.controller.js
+++ b/admin/app/controllers/settings/knowledgefile/knowledgefile.controller.js
@@ -56,8 +56,6 @@ app.controller('KnowledgeFileController', function (
$scope.getAllKnowledgeFiles();
},
'error': function (file, xhr) {
- //console.warn('File failed to upload from dropzone', file, xhr);
-
var popType = 'TOASTER.ERROR';
var popTitle = $common.toaster.error_title;
var popBody = $common.toaster.error_add_body.format(file.name);
diff --git a/admin/app/controllers/settings/meter/offline-meter-file.controller.js b/admin/app/controllers/settings/meter/offline-meter-file.controller.js
deleted file mode 100644
index e72c9f7e..00000000
--- a/admin/app/controllers/settings/meter/offline-meter-file.controller.js
+++ /dev/null
@@ -1,195 +0,0 @@
-'use strict';
-
-app.controller('OfflineMeterFileController', function(
- $scope,
- $window,
- $common,
- $translate,
- $uibModal,
- $interval,
- OfflineMeterFileService,
- toaster,
- SweetAlert) {
-
- $scope.cur_user = JSON.parse($window.localStorage.getItem("currentUser"));
-
- $scope.getAllOfflineMeterFiles = function() {
- OfflineMeterFileService.getAllOfflineMeterFiles(function(error, data) {
- if (!error) {
- $scope.offlinemeterfiles = data;
- } else {
- $scope.offlinemeterfiles = [];
- }
- });
-
- };
-
- $scope.dzOptions = {
- url: getAPI() + 'offlinemeterfiles',
- acceptedFiles: '.xlsx',
- dictDefaultMessage: 'Click(or Drop) to add files',
- maxFilesize: '100',
- headers: { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token }
- };
-
- $scope.dzCallbacks = {
- 'addedfile': function(file) {
- console.info('File added.', file);
- },
- 'success': function(file, xhr) {
- //console.log('File success to upload from dropzone', file, xhr);
- var templateName = file.name;
-
- var popType = 'TOASTER.SUCCESS';
- var popTitle = $common.toaster.success_title;
- var popBody = $common.toaster.success_add_body;
-
- popType = $translate.instant(popType);
- popTitle = $translate.instant(popTitle);
- popBody = $translate.instant(popBody,{template: templateName});
-
- toaster.pop({
- type: popType,
- title: popTitle,
- body: popBody,
- showCloseButton: true,
- });
-
- // toaster.pop({
- // type: 'success',
- // title: $common.toaster.success_title,
- // body: $common.toaster.success_add_body.format(file.name),
- // showCloseButton: true,
- // });
- $scope.getAllOfflineMeterFiles();
- },
- 'error': function (file, xhr) {
- //console.warn('File failed to upload from dropzone', file, xhr);
- var templateName = file.name;
-
- var popType = 'TOASTER.ERROR';
- var popTitle = $common.toaster.error_title;
- var popBody = $common.toaster.error_add_body;
-
- popType = $translate.instant(popType);
- popTitle = $translate.instant(popTitle);
- popBody = $translate.instant(popBody, {template: templateName});
-
- toaster.pop({
- type: popType,
- title: popTitle,
- body: popBody,
- showCloseButton: true,
- });
- }
- };
-
- $scope.restoreOfflineMeterFile = function (offlinemeterfile) {
- OfflineMeterFileService.restoreOfflineMeterFile(offlinemeterfile, function (error, data) {
- if (!error) {
- toaster.pop({
- type: $translate.instant('TOASTER.SUCCESS'),
- title: $translate.instant('TOASTER.SUCCESS_TITLE'),
- body: $translate.instant('SETTING.RESTORE_SUCCESS'),
- showCloseButton: true,
- });
- $scope.getAllOfflineMeterFiles();
- } else {
- toaster.pop({
- type: $translate.instant('TOASTER.ERROR'),
- title: $translate.instant(error.title),
- body: $translate.instant(error.description),
- showCloseButton: true,
- });
- }
- });
- };
-
- $scope.deleteOfflineMeterFile = function(offlinemeterfile) {
- SweetAlert.swal({
- title: $translate.instant($common.sweet.title),
- text: $translate.instant($common.sweet.text),
- type: "warning",
- showCancelButton: true,
- confirmButtonColor: "#DD6B55",
- confirmButtonText: $translate.instant($common.sweet.confirmButtonText),
- cancelButtonText: $translate.instant($common.sweet.cancelButtonText),
- closeOnConfirm: true,
- closeOnCancel: true
- },
- function(isConfirm) {
- if (isConfirm) {
- OfflineMeterFileService.deleteOfflineMeterFile(offlinemeterfile, function(error, status) {
- if (angular.isDefined(status) && status == 204) {
- var templateName = "SETTING.OFFLINE_METER_FILE";
- templateName = $translate.instant(templateName);
-
- var popType = 'TOASTER.SUCCESS';
- var popTitle = $common.toaster.success_title;
- var popBody = $common.toaster.success_delete_body;
-
- popType = $translate.instant(popType);
- popTitle = $translate.instant(popTitle);
- popBody = $translate.instant(popBody, {template: templateName});
-
- toaster.pop({
- type: popType,
- title: popTitle,
- body: popBody,
- showCloseButton: true,
- });
-
- $scope.getAllOfflineMeterFiles();
- } else if (angular.isDefined(status) && status == 400) {
- var popType = 'TOASTER.ERROR';
- var popTitle = error.title;
- var popBody = error.description;
-
- popType = $translate.instant(popType);
- popTitle = $translate.instant(popTitle);
- popBody = $translate.instant(popBody);
-
-
- toaster.pop({
- type: popType,
- title: popTitle,
- body: popBody,
- showCloseButton: true,
- });
- } else {
- var templateName = "SETTING.OFFLINE_METER_FILE";
- templateName = $translate.instant(templateName);
-
- var popType = 'TOASTER.ERROR';
- var popTitle = $common.toaster.error_title;
- var popBody = $common.toaster.error_delete_body;
-
- popType = $translate.instant(popType);
- popTitle = $translate.instant(popTitle);
- popBody = $translate.instant(popBody, {template: templateName});
-
- toaster.pop({
- type: popType,
- title: popTitle,
- body: popBody,
- showCloseButton: true,
- });
- }
- });
- }
- });
- };
-
- $scope.getAllOfflineMeterFiles();
- $interval.cancel();
-
- $scope.$on('$destroy', function() {
- // Make sure that the interval is destroyed too
- if (angular.isDefined($scope.refeshfiles)) {
- $interval.cancel($scope.refeshfiles);
- $scope.refeshfiles = undefined;
- }
- });
- $scope.refeshfiles=$interval($scope.getAllOfflineMeterFiles,1000*8);
-
-});
diff --git a/admin/app/controllers/settings/meter/offline-meter.controller.js b/admin/app/controllers/settings/meter/offline-meter.controller.js
deleted file mode 100644
index a7358a6d..00000000
--- a/admin/app/controllers/settings/meter/offline-meter.controller.js
+++ /dev/null
@@ -1,302 +0,0 @@
-'use strict';
-
-app.controller('OfflineMeterController', function($scope, $common, $translate, $uibModal, OfflineMeterService, CategoryService, EnergyItemService, CostCenterService, toaster, SweetAlert) {
- $scope.getAllCostCenters = function() {
- CostCenterService.getAllCostCenters(function(error, data) {
- if (!error) {
- $scope.costcenters = data;
- } else {
- $scope.costcenters = [];
- }
- });
- };
-
- $scope.getAllCategories = function() {
- CategoryService.getAllCategories(function(error, data) {
- if (!error) {
- $scope.categories = data;
- } else {
- $scope.categories = [];
- }
- });
- };
-
- $scope.getAllEnergyItems = function() {
- EnergyItemService.getAllEnergyItems(function(error, data) {
- if (!error) {
- $scope.energyitems = data;
- } else {
- $scope.energyitems = [];
- }
- });
- };
-
- $scope.getAllOfflineMeters = function() {
- OfflineMeterService.getAllOfflineMeters(function(error, data) {
- if (!error) {
- $scope.offlinemeters = data;
- } else {
- $scope.offlinemeters = [];
- }
- });
-
- };
-
- $scope.addOfflineMeter = function() {
- var modalInstance = $uibModal.open({
- templateUrl: 'views/settings/meter/offline-meter.model.html',
- controller: 'ModalAddOfflineMeterCtrl',
- windowClass: "animated fadeIn",
- resolve: {
- params: function() {
- return {
- offlinemeters: angular.copy($scope.offlinemeters),
- categories: angular.copy($scope.categories),
- energyitems: angular.copy($scope.energyitems),
- costcenters: angular.copy($scope.costcenters)
- };
- }
- }
- });
- modalInstance.result.then(function(offlinemeter) {
- offlinemeter.energy_category_id = offlinemeter.energy_category.id;
- if(angular.isDefined(offlinemeter.energy_item)) {
- offlinemeter.energy_item_id = offlinemeter.energy_item.id;
- } else {
- offlinemeter.energy_item_id = undefined;
- }
- offlinemeter.cost_center_id = offlinemeter.cost_center.id;
- OfflineMeterService.addOfflineMeter(offlinemeter, function(error, status) {
- if (angular.isDefined(status) && status == 201) {
- var templateName = "SETTING.OFFLINE_METER";
- templateName = $translate.instant(templateName);
-
- var popType = 'TOASTER.SUCCESS';
- var popTitle = $common.toaster.success_title;
- var popBody = $common.toaster.success_add_body;
-
- popType = $translate.instant(popType);
- popTitle = $translate.instant(popTitle);
- popBody = $translate.instant(popBody,{template: templateName});
-
- toaster.pop({
- type: popType,
- title: popTitle,
- body: popBody,
- showCloseButton: true,
- });
-
- $scope.getAllOfflineMeters();
- $scope.$emit('handleEmitOfflineMeterChanged');
- } else {
- var templateName = "SETTING.OFFLINE_METER";
- templateName = $translate.instant(templateName);
-
- var popType = 'TOASTER.ERROR';
- var popTitle = $common.toaster.error_title;
- var popBody = $common.toaster.error_add_body;
-
- popType = $translate.instant(popType);
- popTitle = $translate.instant(popTitle);
- popBody = $translate.instant(popBody,{template: templateName});
-
- toaster.pop({
- type: popType,
- title: popTitle,
- body: popBody,
- showCloseButton: true,
- });
- }
- });
- }, function() {
-
- });
- };
-
- $scope.editOfflineMeter = function(offlinemeter) {
- var modalInstance = $uibModal.open({
- windowClass: "animated fadeIn",
- templateUrl: 'views/settings/meter/offline-meter.model.html',
- controller: 'ModalEditOfflineMeterCtrl',
- resolve: {
- params: function() {
- return {
- offlinemeter: angular.copy(offlinemeter),
- offlinemeters: angular.copy($scope.offlinemeters),
- categories: angular.copy($scope.categories),
- energyitems: angular.copy($scope.energyitems),
- costcenters: angular.copy($scope.costcenters)
- };
- }
- }
- });
-
- modalInstance.result.then(function(modifiedOfflineMeter) {
- modifiedOfflineMeter.energy_category_id = modifiedOfflineMeter.energy_category.id;
- if (modifiedOfflineMeter.energy_item != null && modifiedOfflineMeter.energy_item.id != null ) {
- modifiedOfflineMeter.energy_item_id = modifiedOfflineMeter.energy_item.id;
- } else {
- modifiedOfflineMeter.energy_item_id = undefined;
- }
- modifiedOfflineMeter.cost_center_id = modifiedOfflineMeter.cost_center.id;
- OfflineMeterService.editOfflineMeter(modifiedOfflineMeter, function(error, status) {
- if (angular.isDefined(status) && status == 200) {
- var templateName = "SETTING.OFFLINE_METER";
- templateName = $translate.instant(templateName);
-
- var popType = 'TOASTER.SUCCESS';
- var popTitle = $common.toaster.success_title;
- var popBody = $common.toaster.success_update_body;
-
- popType = $translate.instant(popType);
- popTitle = $translate.instant(popTitle);
- popBody = $translate.instant(popBody,{template: templateName});
-
- toaster.pop({
- type: popType,
- title: popTitle,
- body: popBody,
- showCloseButton: true,
- });
- $scope.getAllOfflineMeters();
- $scope.$emit('handleEmitOfflineMeterChanged');
- } else {
- var templateName = "SETTING.OFFLINE_METER";
- templateName = $translate.instant(templateName);
-
- var popType = 'TOASTER.ERROR';
- var popTitle = $common.toaster.error_title;
- var popBody = $common.toaster.error_update_body;
-
- popType = $translate.instant(popType);
- popTitle = $translate.instant(popTitle);
- popBody = $translate.instant(popBody,{template: templateName});
-
- toaster.pop({
- type: popType,
- title: popTitle,
- body: popBody,
- showCloseButton: true,
- });
- }
- });
- }, function() {
- //do nothing;
- });
- };
-
- $scope.deleteOfflineMeter = function(offlinemeter) {
- SweetAlert.swal({
- title: $translate.instant($common.sweet.title),
- text: $translate.instant($common.sweet.text),
- type: "warning",
- showCancelButton: true,
- confirmButtonColor: "#DD6B55",
- confirmButtonText: $translate.instant($common.sweet.confirmButtonText),
- cancelButtonText: $translate.instant($common.sweet.cancelButtonText),
- closeOnConfirm: true,
- closeOnCancel: true
- },
- function(isConfirm) {
- if (isConfirm) {
- OfflineMeterService.deleteOfflineMeter(offlinemeter, function(error, status) {
- if (angular.isDefined(status) && status == 204) {
- var templateName = "SETTING.OFFLINE_METER";
- templateName = $translate.instant(templateName);
-
- var popType = 'TOASTER.SUCCESS';
- var popTitle = $common.toaster.success_title;
- var popBody = $common.toaster.success_delete_body;
-
- popType = $translate.instant(popType);
- popTitle = $translate.instant(popTitle);
- popBody = $translate.instant(popBody, {template: templateName});
-
- toaster.pop({
- type: popType,
- title: popTitle,
- body: popBody,
- showCloseButton: true,
- });
- $scope.getAllOfflineMeters();
- $scope.$emit('handleEmitOfflineMeterChanged');
- } else if (angular.isDefined(status) && status == 400) {
- var popType = 'TOASTER.ERROR';
- var popTitle = error.title;
- var popBody = error.description;
-
- popType = $translate.instant(popType);
- popTitle = $translate.instant(popTitle);
- popBody = $translate.instant(popBody);
-
-
- toaster.pop({
- type: popType,
- title: popTitle,
- body: popBody,
- showCloseButton: true,
- });
- } else {
- var templateName = "SETTING.OFFLINE_METER";
- templateName = $translate.instant(templateName);
-
- var popType = 'TOASTER.ERROR';
- var popTitle = $common.toaster.error_title;
- var popBody = $common.toaster.error_delete_body;
-
- popType = $translate.instant(popType);
- popTitle = $translate.instant(popTitle);
- popBody = $translate.instant(popBody, {template: templateName});
-
- toaster.pop({
- type: popType,
- title: popTitle,
- body: popBody,
- showCloseButton: true,
- });
- }
- });
- }
- });
- };
-
- $scope.getAllOfflineMeters();
- $scope.getAllCategories();
- $scope.getAllEnergyItems();
- $scope.getAllCostCenters();
-});
-
-app.controller('ModalAddOfflineMeterCtrl', function($scope, $uibModalInstance, params) {
-
- $scope.operation = "SETTING.ADD_OFFLINE_METER";
- $scope.categories = params.categories;
- $scope.energyitems = params.energyitems;
- $scope.costcenters = params.costcenters;
- $scope.offlinemeter = {
- is_counted: false
- };
- $scope.ok = function() {
- $uibModalInstance.close($scope.offlinemeter);
- };
-
- $scope.cancel = function() {
- $uibModalInstance.dismiss('cancel');
- };
-});
-
-app.controller('ModalEditOfflineMeterCtrl', function($scope, $uibModalInstance, params) {
- $scope.operation = "SETTING.EDIT_OFFLINE_METER";
- $scope.offlinemeter = params.offlinemeter;
- $scope.offlinemeters = params.offlinemeters;
- $scope.categories = params.categories;
- $scope.energyitems = params.energyitems;
- $scope.costcenters = params.costcenters;
-
- $scope.ok = function() {
- $uibModalInstance.close($scope.offlinemeter);
- };
-
- $scope.cancel = function() {
- $uibModalInstance.dismiss('cancel');
- };
-});
diff --git a/admin/app/controllers/settings/meter/virtual-meter.controller.js b/admin/app/controllers/settings/meter/virtual-meter.controller.js
deleted file mode 100644
index 40fa5738..00000000
--- a/admin/app/controllers/settings/meter/virtual-meter.controller.js
+++ /dev/null
@@ -1,494 +0,0 @@
-'use strict';
-
-app.controller('VirtualMeterController', function($scope, $common, $uibModal, $translate, MeterService, VirtualMeterService, OfflineMeterService, CategoryService, EnergyItemService, CostCenterService, toaster, SweetAlert) {
- $scope.getAllCostCenters = function() {
- CostCenterService.getAllCostCenters(function(error, data) {
- if (!error) {
- $scope.costcenters = data;
- } else {
- $scope.costcenters = [];
- }
- });
- };
-
- $scope.getAllCategories = function() {
- CategoryService.getAllCategories(function(error, data) {
- if (!error) {
- $scope.categories = data;
- } else {
- $scope.categories = [];
- }
- });
- };
-
-$scope.getAllEnergyItems = function() {
- EnergyItemService.getAllEnergyItems(function(error, data) {
- if (!error) {
- $scope.energyitems = data;
- } else {
- $scope.energyitems = [];
- }
- });
-};
-
- $scope.getAllVirtualMeters = function() {
- VirtualMeterService.getAllVirtualMeters(function(error, data) {
- if (!error) {
- $scope.virtualmeters = data;
- } else {
- $scope.virtualmeters = [];
- }
- });
-
- };
- $scope.getAllMeters = function() {
- MeterService.getAllMeters(function(error, data) {
- if (!error) {
- $scope.meters = data;
- } else {
- $scope.meters = [];
- }
- });
- };
-
- $scope.getAllOfflineMeters = function() {
- OfflineMeterService.getAllOfflineMeters(function(error, data) {
- if (!error) {
- $scope.offlinemeters = data;
- } else {
- $scope.offlinemeters = [];
- }
- });
- };
-
-
-
- $scope.addVirtualMeter = function() {
- var modalInstance = $uibModal.open({
- templateUrl: 'views/settings/meter/virtual-meter.model.html',
- controller: 'ModalAddVirtualMeterCtrl',
- windowClass: 'animated fadeIn',
- size: 'lg',
- resolve: {
- params: function() {
- return {
- virtualmeters: angular.copy($scope.virtualmeters),
- meters: angular.copy($scope.meters),
- offlinemeters: angular.copy($scope.offlinemeters),
- categories: angular.copy($scope.categories),
- energyitems: angular.copy($scope.energyitems),
- costcenters: angular.copy($scope.costcenters)
- };
- }
- }
- });
- modalInstance.result.then(function(virtualmeter) {
- virtualmeter.energy_category_id = virtualmeter.energy_category.id;
- if(angular.isDefined(virtualmeter.energy_item)) {
- virtualmeter.energy_item_id = virtualmeter.energy_item.id;
- } else {
- virtualmeter.energy_item_id = undefined;
- }
- virtualmeter.cost_center_id = virtualmeter.cost_center.id;
- VirtualMeterService.addVirtualMeter(virtualmeter, function(error, status) {
- if (angular.isDefined(status) && status == 201) {
- var templateName = "SETTING.VIRTUAL_METER";
- templateName = $translate.instant(templateName);
-
- var popType = 'TOASTER.SUCCESS';
- var popTitle = $common.toaster.success_title;
- var popBody = $common.toaster.success_add_body;
-
- popType = $translate.instant(popType);
- popTitle = $translate.instant(popTitle);
- popBody = $translate.instant(popBody,{template: templateName});
-
- toaster.pop({
- type: popType,
- title: popTitle,
- body: popBody,
- showCloseButton: true,
- });
- $scope.getAllVirtualMeters();
- $scope.$emit('handleEmitVirtualMeterChanged');
- } else {
- var templateName = "SETTING.VIRTUAL_METER";
- templateName = $translate.instant(templateName);
-
- var popType = 'TOASTER.ERROR';
- var popTitle = $common.toaster.error_title;
- var popBody = $common.toaster.error_add_body;
-
- popType = $translate.instant(popType);
- popTitle = $translate.instant(popTitle);
- popBody = $translate.instant(popBody,{template: templateName});
-
- toaster.pop({
- type: popType,
- title: popTitle,
- body: popBody,
- showCloseButton: true,
- });
- }
- });
- }, function() {
-
- });
- };
-
- $scope.editVirtualMeter = function(virtualmeter) {
- var modalInstance = $uibModal.open({
- windowClass: "animated fadeIn",
- templateUrl: 'views/settings/meter/virtual-meter.model.html',
- controller: 'ModalEditVirtualMeterCtrl',
- size: 'lg',
- resolve: {
- params: function() {
- return {
- virtualmeter: angular.copy(virtualmeter),
- virtualmeters: angular.copy($scope.virtualmeters),
- meters: angular.copy($scope.meters),
- offlinemeters: angular.copy($scope.offlinemeters),
- categories: angular.copy($scope.categories),
- energyitems: angular.copy($scope.energyitems),
- costcenters: angular.copy($scope.costcenters)
- };
- }
- }
- });
-
- modalInstance.result.then(function(modifiedVirtualMeter) {
- modifiedVirtualMeter.energy_category_id = modifiedVirtualMeter.energy_category.id;
- if (modifiedVirtualMeter.energy_item != null && modifiedVirtualMeter.energy_item.id != null ) {
- modifiedVirtualMeter.energy_item_id = modifiedVirtualMeter.energy_item.id;
- } else {
- modifiedVirtualMeter.energy_item_id = undefined;
- }
- modifiedVirtualMeter.cost_center_id = modifiedVirtualMeter.cost_center.id;
- VirtualMeterService.editVirtualMeter(modifiedVirtualMeter, function(error, status) {
- if (angular.isDefined(status) && status == 200) {
- var templateName = "SETTING.VIRTUAL_METER";
- templateName = $translate.instant(templateName);
-
- var popType = 'TOASTER.SUCCESS';
- var popTitle = $common.toaster.success_title;
- var popBody = $common.toaster.success_update_body;
-
- popType = $translate.instant(popType);
- popTitle = $translate.instant(popTitle);
- popBody = $translate.instant(popBody,{template: templateName});
-
- toaster.pop({
- type: popType,
- title: popTitle,
- body: popBody,
- showCloseButton: true,
- });
- $scope.getAllVirtualMeters();
- $scope.$emit('handleEmitVirtualMeterChanged');
- } else {
- var templateName = "SETTING.VIRTUAL_METER";
- templateName = $translate.instant(templateName);
-
- var popType = 'TOASTER.ERROR';
- var popTitle = $common.toaster.error_title;
- var popBody = $common.toaster.error_update_body;
-
- popType = $translate.instant(popType);
- popTitle = $translate.instant(popTitle);
- popBody = $translate.instant(popBody,{template: templateName});
-
- toaster.pop({
- type: popType,
- title: popTitle,
- body: popBody,
- showCloseButton: true,
- });
- }
- });
- }, function() {
- //do nothing;
- });
- };
-
- $scope.deleteVirtualMeter = function(virtualmeter) {
- SweetAlert.swal({
- title: $translate.instant($common.sweet.title),
- text: $translate.instant($common.sweet.text),
- type: "warning",
- showCancelButton: true,
- confirmButtonColor: "#DD6B55",
- confirmButtonText: $translate.instant($common.sweet.confirmButtonText),
- cancelButtonText: $translate.instant($common.sweet.cancelButtonText),
- closeOnConfirm: true,
- closeOnCancel: true
- },
- function(isConfirm) {
- if (isConfirm) {
- VirtualMeterService.deleteVirtualMeter(virtualmeter, function(error, status) {
- if (angular.isDefined(status) && status == 204) {
- var templateName = "SETTING.VIRTUAL_METER";
- templateName = $translate.instant(templateName);
-
- var popType = 'TOASTER.SUCCESS';
- var popTitle = $common.toaster.success_title;
- var popBody = $common.toaster.success_delete_body;
-
- popType = $translate.instant(popType);
- popTitle = $translate.instant(popTitle);
- popBody = $translate.instant(popBody, {template: templateName});
-
- toaster.pop({
- type: popType,
- title: popTitle,
- body: popBody,
- showCloseButton: true,
- });
- $scope.getAllVirtualMeters();
- $scope.$emit('handleEmitVirtualMeterChanged');
- } else if (angular.isDefined(status) && status == 400) {
- var popType = 'TOASTER.ERROR';
- var popTitle = error.title;
- var popBody = error.description;
-
- popType = $translate.instant(popType);
- popTitle = $translate.instant(popTitle);
- popBody = $translate.instant(popBody);
-
- toaster.pop({
- type: popType,
- title: popTitle,
- body: popBody,
- showCloseButton: true,
- });
- } else {
- var templateName = "SETTING.VIRTUAL_METER";
- templateName = $translate.instant(templateName);
-
- var popType = 'TOASTER.ERROR';
- var popTitle = $common.toaster.error_title;
- var popBody = $common.toaster.error_delete_body;
-
- popType = $translate.instant(popType);
- popTitle = $translate.instant(popTitle);
- popBody = $translate.instant(popBody, {template: templateName});
-
- toaster.pop({
- type: popType,
- title: popTitle,
- body: popBody,
- showCloseButton: true,
- });
- }
- });
- }
- });
- };
-
- $scope.getAllMeters();
- $scope.getAllVirtualMeters();
- $scope.getAllOfflineMeters();
- $scope.getAllCategories();
- $scope.getAllEnergyItems();
- $scope.getAllCostCenters();
-
- $scope.$on('handleBroadcastMeterChanged', function(event) {
- $scope.getAllMeters();
- });
-
- $scope.$on('handleBroadcastOfflineMeterChanged', function(event) {
- $scope.getAllOfflineMeters();
- });
-
- $scope.$on('handleBroadcastVirtualMeterChanged', function(event) {
- $scope.getAllVirtualMeters();
- });
-
-});
-
-app.controller('ModalAddVirtualMeterCtrl', function($timeout, $scope,
- $uibModalInstance,
- params) {
-
- $scope.operation = "SETTING.ADD_VIRTUAL_METER";
- $scope.categories = params.categories;
- $scope.energyitems = params.energyitems;
- $scope.costcenters = params.costcenters;
- $scope.meters = params.meters;
- $scope.virtualmeters = params.virtualmeters;
- $scope.offlinemeters = params.offlinemeters;
- $scope.currentMeterType = {};
- $scope.currentMeter = {};
- $scope.virtualmeter = {
- is_counted: false,
- expression: {
- variables: []
- }
- };
- $scope.metertypes = [{
- sid: 'meter',
- name: 'SETTING.METER'
- }, {
- sid: 'virtual_meter',
- name: 'SETTING.VIRTUAL_METER'
- }, {
- sid: 'offline_meter',
- name: 'SETTING.OFFLINE_METER'
- }];
- $scope.metertypemap = {
- meter: 'SETTING.METER',
- virtual_meter: 'SETTING.VIRTUAL_METER',
- offline_meter: 'SETTING.OFFLINE_METER'
- };
- $scope.counter = 1;
- $scope.ok = function() {
- $uibModalInstance.close($scope.virtualmeter);
- };
-
- $scope.cancel = function() {
- $uibModalInstance.dismiss('cancel');
- };
-
- $scope.add = function() {
- var variable = {
- name: 'x' + ($scope.counter),
- meter_type: $scope.currentMeterType.selected.sid,
- meter_id: $scope.currentMeter.selected.id,
- //metertype:$scope.currentMeterType.selected.name,
- meter_name: $scope.currentMeter.selected.name
- }
- if ($scope.virtualmeter.expression.variables.length > 0) {
- $scope.virtualmeter.expression.variables.unshift(variable);
- } else {
- $scope.virtualmeter.expression.variables.push(variable);
- }
-
- $timeout(function() {
- angular.element('#variablesTable').trigger('footable_redraw');
- }, 10);
-
- $scope.counter++;
- $scope.currentMeter.selected=undefined;
-
- };
- $scope.delete = function(key) {
- $scope.virtualmeter.expression.variables.splice(key, 1);
- $timeout(function() {
- angular.element('#variablesTable').trigger('footable_redraw');
- }, 10);
-
- };
-
- $scope.changeMeterType = function() {
- switch ($scope.currentMeterType.selected.sid) {
- case 'meter':
- $scope.currentmeters = $scope.meters;
- break;
- case 'virtual_meter':
- $scope.currentmeters = $scope.virtualmeters;
- break;
- case 'offline_meter':
- $scope.currentmeters = $scope.offlinemeters;
- break;
- }
- };
-
-
-
-});
-
-app.controller('ModalEditVirtualMeterCtrl', function($timeout, $scope, $uibModalInstance, params) {
- $scope.operation = "SETTING.EDIT_VIRTUAL_METER";
- $scope.virtualmeter = params.virtualmeter;
- $scope.virtualmeters = params.virtualmeters;
- $scope.meters = params.meters;
- $scope.offlinemeters = params.offlinemeters;
- $scope.categories = params.categories;
- $scope.energyitems = params.energyitems;
- $scope.costcenters = params.costcenters;
- $scope.currentMeterType = {};
- $scope.currentMeter = {};
- $scope.metertypes = [{
- sid: 'meter',
- name: 'SETTING.METER'
- }, {
- sid: 'virtual_meter',
- name: 'SETTING.VIRTUAL_METER'
- }, {
- sid: 'offline_meter',
- name: 'SETTING.OFFLINE_METER'
- }];
- $scope.metertypemap = {
- meter: 'SETTING.METER',
- virtual_meter: 'SETTING.VIRTUAL_METER',
- offline_meter: 'SETTING.OFFLINE_METER'
- };
- $scope.counter = 1;
- if (angular.isUndefined($scope.virtualmeter.expression.variables)) {
- $scope.virtualmeter.expression.variables = [];
- } else {
- if ($scope.virtualmeter.expression.variables.length > 0) {
- var arrIndex = [];
- angular.forEach($scope.virtualmeter.expression.variables, function(item, index) {
- arrIndex.push(parseInt(item.name.substr(1)));
- });
- var maxval = Math.max.apply(null, arrIndex);
- $scope.counter = maxval + 1;
- }
- }
- $scope.ok = function() {
- $uibModalInstance.close($scope.virtualmeter);
- };
-
- $scope.cancel = function() {
- $uibModalInstance.dismiss('cancel');
- };
-
- $timeout(function() {
- angular.element('#variablesTable').trigger('footable_redraw');
- }, 100);
-
- $scope.add = function() {
- var variable = {
- name: 'x' + ($scope.counter),
- meter_type: $scope.currentMeterType.selected.sid,
- meter_id: $scope.currentMeter.selected.id,
- //metertype:$scope.currentMeterType.selected.name,
- meter_name: $scope.currentMeter.selected.name
- }
- if ($scope.virtualmeter.expression.variables.length > 0) {
- $scope.virtualmeter.expression.variables.unshift(variable);
- } else {
- $scope.virtualmeter.expression.variables.push(variable);
- }
-
- $timeout(function() {
- angular.element('#variablesTable').trigger('footable_redraw');
- }, 10);
- $scope.counter++;
- $scope.currentMeter.selected=undefined;
-
- };
- $scope.delete = function(key) {
- $scope.virtualmeter.expression.variables.splice(key, 1);
- $timeout(function() {
- angular.element('#variablesTable').trigger('footable_redraw');
- }, 10);
-
- };
-
- $scope.changeMeterType = function() {
- switch ($scope.currentMeterType.selected.sid) {
- case 'meter':
- $scope.currentmeters = $scope.meters;
- break;
- case 'virtual_meter':
- $scope.currentmeters = $scope.virtualmeters;
- break;
- case 'offline_meter':
- $scope.currentmeters = $scope.offlinemeters;
- break;
- }
- };
-
-});
diff --git a/admin/app/services/settings/costcenter/cost-file.service.js b/admin/app/services/settings/costcenter/cost-file.service.js
deleted file mode 100644
index 2fc7bb0b..00000000
--- a/admin/app/services/settings/costcenter/cost-file.service.js
+++ /dev/null
@@ -1,34 +0,0 @@
-'use strict';
-app.factory('CostFileService', function($http) {
- return {
- getAllCostFiles:function(callback){
- $http.get(getAPI()+'offlinecostfiles')
- .success(function (response, status, headers, config) {
- callback(null, response);
- })
- .error(function (e,status) {
- callback(e,status);
- });
- },
-
- addCostFile: function(costfile, callback) {
- $http.post(getAPI()+'offlinecostfiles',{data:costfile})
- .success(function (response, status, headers, config) {
- callback(null, status);
- })
- .error(function (e,status) {
- callback(e,status);
- });
- },
-
- deleteCostFile: function(costfile, callback) {
- $http.delete(getAPI()+'offlinecostfiles/'+costfile.id)
- .success(function (response, status, headers, config) {
- callback(null, status);
- })
- .error(function (e,status) {
- callback(e,status);
- });
- }
- };
-});
\ No newline at end of file
diff --git a/admin/app/services/settings/meter/offline-meter-file.service.js b/admin/app/services/settings/meter/offline-meter-file.service.js
deleted file mode 100644
index 94e4b2d7..00000000
--- a/admin/app/services/settings/meter/offline-meter-file.service.js
+++ /dev/null
@@ -1,68 +0,0 @@
-'use strict';
-app.factory('OfflineMeterFileService', function($http) {
- return {
- getAllOfflineMeterFiles:function(callback){
- $http.get(getAPI()+'offlinemeterfiles')
- .success(function (response, status, headers, config) {
- callback(null, response);
- })
- .error(function (e,status) {
- callback(e,status);
- });
- },
- searchOfflineMeterFiles: function(query, callback) {
- $http.get(getAPI()+'offlinemeterfiles', { params: { q: query } })
- .success(function (response, status, headers, config) {
- callback(null, response);
- })
- .error(function (e,status) {
- callback(e,status);
- });
- },
- addOfflineMeterFile: function(offlinemeterfile, callback) {
- $http.post(getAPI()+'offlinemeterfiles',{data:offlinemeterfile})
- .success(function (response, status, headers, config) {
- callback(null, status);
- })
- .error(function (e,status) {
- callback(e,status);
- });
- },
- editOfflineMeterFile: function(offlinemeterfile, callback) {
- $http.put(getAPI()+'offlinemeterfiles/'+offlinemeterfile.id,{data:offlinemeterfile})
- .success(function (response, status, headers, config) {
- callback(null, status);
- })
- .error(function (e,status) {
- callback(e,status);
- });
- },
- restoreOfflineMeterFile: function (offlinemeterfile, callback) {
- $http.get(getAPI() + 'offlinemeterfiles/' + offlinemeterfile.id + '/restore')
- .success(function (response, status, headers, config) {
- callback(null, response);
- })
- .error(function (e, status) {
- callback(e, status);
- });
- },
- deleteOfflineMeterFile: function(offlinemeterfile, callback) {
- $http.delete(getAPI()+'offlinemeterfiles/'+offlinemeterfile.id)
- .success(function (response, status, headers, config) {
- callback(null, status);
- })
- .error(function (e,status) {
- callback(e,status);
- });
- },
- getOfflineMeterFile: function(id, callback) {
- $http.get(getAPI()+'offlinemeterfiles/'+id)
- .success(function (response, status, headers, config) {
- callback(null, response);
- })
- .error(function (e,status) {
- callback(e,status);
- });
- }
- };
-});
\ No newline at end of file
diff --git a/admin/app/services/settings/meter/offline-meter.service.js b/admin/app/services/settings/meter/offline-meter.service.js
deleted file mode 100644
index 6bbad22c..00000000
--- a/admin/app/services/settings/meter/offline-meter.service.js
+++ /dev/null
@@ -1,59 +0,0 @@
-'use strict';
-app.factory('OfflineMeterService', function($http) {
- return {
- getAllOfflineMeters:function(callback){
- $http.get(getAPI()+'offlinemeters')
- .success(function (response, status, headers, config) {
- callback(null, response);
- })
- .error(function (e,status) {
- callback(e,status);
- });
- },
- searchOfflineMeters: function(query, callback) {
- $http.get(getAPI()+'offlinemeters', { params: { q: query } })
- .success(function (response, status, headers, config) {
- callback(null, response);
- })
- .error(function (e,status) {
- callback(e,status);
- });
- },
- addOfflineMeter: function(offlinemeter, callback) {
- $http.post(getAPI()+'offlinemeters',{data:offlinemeter})
- .success(function (response, status, headers, config) {
- callback(null, status);
- })
- .error(function (e,status) {
- callback(e,status);
- });
- },
- editOfflineMeter: function(offlinemeter, callback) {
- $http.put(getAPI()+'offlinemeters/'+offlinemeter.id,{data:offlinemeter})
- .success(function (response, status, headers, config) {
- callback(null, status);
- })
- .error(function (e,status) {
- callback(e,status);
- });
- },
- deleteOfflineMeter: function(offlinemeter, callback) {
- $http.delete(getAPI()+'offlinemeters/'+offlinemeter.id)
- .success(function (response, status, headers, config) {
- callback(null, status);
- })
- .error(function (e,status) {
- callback(e,status);
- });
- },
- getOfflineMeter: function(id, callback) {
- $http.get(getAPI()+'offlinemeters/'+id)
- .success(function (response, status, headers, config) {
- callback(null, response);
- })
- .error(function (e,status) {
- callback(e,status);
- });
- }
- };
-});
\ No newline at end of file
diff --git a/admin/app/services/settings/meter/virtual-meter.service.js b/admin/app/services/settings/meter/virtual-meter.service.js
deleted file mode 100644
index 03a853c3..00000000
--- a/admin/app/services/settings/meter/virtual-meter.service.js
+++ /dev/null
@@ -1,50 +0,0 @@
-'use strict';
-app.factory('VirtualMeterService', function($http) {
- return {
- getAllVirtualMeters:function(callback){
- $http.get(getAPI()+'virtualmeters')
- .success(function (response, status, headers, config) {
- callback(null, response);
- })
- .error(function (e,status) {
- callback(e,status);
- });
- },
- searchVirtualMeters: function(query, callback) {
- $http.get(getAPI()+'virtualmeters', { params: { q: query } })
- .success(function (response, status, headers, config) {
- callback(null, response);
- })
- .error(function (e,status) {
- callback(e,status);
- });
- },
- addVirtualMeter: function(virtualmeter, callback) {
- $http.post(getAPI()+'virtualmeters',{data:virtualmeter})
- .success(function (response, status, headers, config) {
- callback(null, status);
- })
- .error(function (e,status) {
- callback(e,status);
- });
- },
- editVirtualMeter: function(virtualmeter, callback) {
- $http.put(getAPI()+'virtualmeters/'+virtualmeter.id,{data:virtualmeter})
- .success(function (response, status, headers, config) {
- callback(null, status);
- })
- .error(function (e,status) {
- callback(e,status);
- });
- },
- deleteVirtualMeter: function(virtualmeter, callback) {
- $http.delete(getAPI()+'virtualmeters/'+virtualmeter.id)
- .success(function (response, status, headers, config) {
- callback(null, status);
- })
- .error(function (e,status) {
- callback(e,status);
- });
- }
- };
-});
diff --git a/admin/app/translations.js b/admin/app/translations.js
index 5d38a3ec..1b4b7e22 100644
--- a/admin/app/translations.js
+++ b/admin/app/translations.js
@@ -298,7 +298,7 @@ function config($translateProvider) {
DRAG_TO_BIND: 'Drag to left to bind',
DRAG_TO_UNBIND: 'Drag to trash to unbind',
- FINANCIAL_COST: 'Offline Cost File',
+ COST_FILE: 'Cost File',
NAME: 'Name',
AREA: 'Area',
UNIT: 'Unit',
@@ -882,11 +882,10 @@ function config($translateProvider) {
INVALID_GROUP_ID: 'Invalid Group ID',
INVALID_KNOWLEDGE_FILE_ID: 'Invalid Knowledge File ID',
INVALID_ID: 'Invalid ID',
- INVALID_LINE_ID: 'Invalid Line ID',
INVALID_MESSAGE_ID: 'Invalid Message ID',
INVALID_METER_ID: 'Invalid Meter ID',
INVALID_METER_UUID: 'Invalid Meter UUID',
- INVALID_OFFLINE_COST_FILE_ID: 'Invalid Offline Cost File ID',
+ 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',
@@ -970,7 +969,7 @@ function config($translateProvider) {
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',
- OFFLINE_COST_FILE_NOT_FOUND: 'Offline Cost File 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',
@@ -1328,7 +1327,7 @@ function config($translateProvider) {
TRASH: '回收桶',
DRAG_TO_BIND: '请拖拽完成绑定',
DRAG_TO_UNBIND: '请拖拽至回收桶解除绑定',
- FINANCIAL_COST: '财务分摊成本录入',
+ COST_FILE: '成本文件',
NAME: '名称',
AREA: '面积',
UNIT: '单位',
@@ -1928,7 +1927,7 @@ function config($translateProvider) {
INVALID_MESSAGE_ID: '无效的消息ID',
INVALID_METER_ID: '无效的计量表ID',
INVALID_METER_UUID: '无效的计量表UUID',
- INVALID_OFFLINE_COST_FILE_ID: '无效的离线成本文件ID',
+ INVALID_COST_FILE_ID: '无效的成本文件ID',
INVALID_OFFLINE_METER_FILE__ID: '无效的离线表文件ID',
INVALID_OFFLINE_METER_FILE_ID: '无效的离线表文件ID',
INVALID_OFFLINE_METER_ID: '无效的离线表ID',
@@ -1994,7 +1993,7 @@ function config($translateProvider) {
METER_POINT_RELATIONSHIP_EXISTED: '存在计量表和点的关系',
METER_POINT_RELATIONSHIP_NOT_FOUND: '未找到计量表和点的关系',
METER_OF_VARIABLE_NOT_FOUND: '未找到变量关联的计量表',
- OFFLINE_COST_FILE_NOT_FOUND: '未找到离线费用文件',
+ COST_FILE_NOT_FOUND: '未找到成本文件',
OFFLINE_METER_FILE_NOT_FOUND: '未找到离线表文件',
OFFLINE_METER_NOT_FOUND: '未找到离线表',
OFFLINE_METER_OF_VARIABLE_NOT_FOUND: '未找到变量关联的离线表',
@@ -2346,7 +2345,7 @@ function config($translateProvider) {
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',
- FINANCIAL_COST: 'Erfassung der finanziellen Allokationskosten',
+ COST_FILE: 'Datei der Kosten',
NAME: 'Name',
AREA: 'Bereich',
UNIT: 'Einheit',
@@ -2946,7 +2945,7 @@ function config($translateProvider) {
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_OFFLINE_COST_FILE_ID: 'Ungültige Offline-Kostendatei-ID',
+ 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',
@@ -3012,7 +3011,7 @@ function config($translateProvider) {
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',
- OFFLINE_COST_FILE_NOT_FOUND: 'Offline-Kostendatei nicht 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',
diff --git a/admin/views/common/footer-login.html b/admin/views/common/footer-login.html
index 42c3c809..b1475cd9 100644
--- a/admin/views/common/footer-login.html
+++ b/admin/views/common/footer-login.html
@@ -1,5 +1,5 @@
diff --git a/admin/views/common/footer.html b/admin/views/common/footer.html
index 6225bdae..eb30f48e 100644
--- a/admin/views/common/footer.html
+++ b/admin/views/common/footer.html
@@ -3,6 +3,6 @@
https://myems.io
- {{'MY_EMS_NAME' | translate}} v1.1.3
+ {{'MY_EMS_NAME' | translate}} v1.1.4
diff --git a/admin/views/settings/costcenter/costcenter.html b/admin/views/settings/costcenter/costcenter.html
index 096db72a..6f2f09e8 100644
--- a/admin/views/settings/costcenter/costcenter.html
+++ b/admin/views/settings/costcenter/costcenter.html
@@ -1,141 +1,140 @@
-
+
-
-
-
+
+
+
-
-
-
-
{{'SETTING.ADD_COSTCENTER' | translate}}
-
-
-
- {{'SETTING.ID' | translate}} |
- {{'SETTING.NAME' | translate}} |
- {{'COSTCENTER.EXTERNAL_ID' | translate}} |
- {{'SETTING.ACTION' | translate}} |
-
-
-
-
- {{ costcenter.id }} |
- {{ costcenter.name }} |
- {{ costcenter.external_id }} |
-
- {{'SETTING.EDIT' | translate}}
- {{'SETTING.DELETE' | translate}}
-
- |
-
-
-
-
-
-
-
-
-
-
-
- {{'SETTING.SELECT_COSTCENTER' | translate}}
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+ {{'SETTING.SELECT_COSTCENTER' | translate}}
-
-
-
- {{currentCostCenter.name}}{{'SETTING.N_S_TARIFF' | translate}}
-
-
-
-
{{costcentertariff.name}}
-
+
-
-
- {{'SETTING.TRASH' | translate}}
-
-
-

+
+
+
+
+
+
+
+ {{currentCostCenter.name}}{{'SETTING.N_S_TARIFF' | translate}}
+
+
+
+
{{costcentertariff.name}}
+
+
+ {{'SETTING.TRASH' | translate}}
+
+
+

+
+
+
-
-
-
- {{'SETTING.TARIFF_LIST' | translate}}
-
-
+
+
+ {{'SETTING.TARIFF_LIST' | translate}}
+
+
-
{{tariff.name}}
+ x-hjc-draggable="true"> {{tariff.name}}
-
-
-
-
+
+
-
-
-
-
-
-
- {{'SETTING.NAME' | translate}} |
- {{'SETTING.STATUS' | translate}} |
- {{'SETTING.UPLOAD_TIME' | translate}} |
- {{'SETTING.ACTION' | translate}} |
-
-
-
-
- {{ costfile.file_name }} |
- {{ costfile.status }} |
- {{ costfile.upload_datetime | date:'yyyy-MM-dd HH:mm'}} |
+
+
+
+
+
+
+ {{'SETTING.ID' | translate}} |
+ {{'SETTING.NAME' | translate}} |
+ {{'SETTING.STATUS' | translate}} |
+ {{'SETTING.UPLOAD_TIME' | translate}} |
+ {{'SETTING.ACTION' | translate}} |
+
+
+
+
+ {{ costfile.id }} |
+ {{ costfile.file_name }}
+ |
+ {{ costfile.status }} |
+ {{ costfile.upload_datetime | date:'yyyy-MM-dd HH:mm'}} |
-
- {{'SETTING.DELETE' | translate}}
-
- |
-
-
-
-
-
-
-
-
-
+
+ {{'SETTING.RESTORE' | translate}}
+ {{'SETTING.DELETE' | translate}}
+ |
+
+
+
+
+
+
-
-
-
+
diff --git a/admin/views/settings/meter/offline-meter.model.html b/admin/views/settings/meter/offlinemeter.model.html
similarity index 100%
rename from admin/views/settings/meter/offline-meter.model.html
rename to admin/views/settings/meter/offlinemeter.model.html
diff --git a/database/myems_historical_db.sql b/database/myems_historical_db.sql
index bada59f0..7cba42d6 100644
--- a/database/myems_historical_db.sql
+++ b/database/myems_historical_db.sql
@@ -36,6 +36,20 @@ CREATE TABLE IF NOT EXISTS `myems_historical_db`.`tbl_analog_value_latest` (
CREATE INDEX `tbl_analog_value_latest_index_1` ON `myems_historical_db`.`tbl_analog_value_latest` (`point_id` , `utc_date_time`);
CREATE INDEX `tbl_analog_value_latest_index_2` ON `myems_historical_db`.`tbl_analog_value_latest` (`utc_date_time`);
+-- ---------------------------------------------------------------------------------------------------------------------
+-- Table `myems_historical_db`.`tbl_cost_files`
+-- ---------------------------------------------------------------------------------------------------------------------
+DROP TABLE IF EXISTS `myems_historical_db`.`tbl_cost_files` ;
+
+CREATE TABLE IF NOT EXISTS `myems_historical_db`.`tbl_cost_files` (
+ `id` BIGINT NOT NULL AUTO_INCREMENT,
+ `file_name` VARCHAR(255) NOT NULL,
+ `uuid` CHAR(36) NOT NULL,
+ `upload_datetime_utc` DATETIME NOT NULL,
+ `status` VARCHAR(45) NOT NULL COMMENT 'new, done, error',
+ `file_object` LONGBLOB NOT NULL,
+ PRIMARY KEY (`id`));
+
-- ---------------------------------------------------------------------------------------------------------------------
-- Table `myems_historical_db`.`tbl_digital_value`
-- ---------------------------------------------------------------------------------------------------------------------
@@ -109,18 +123,4 @@ CREATE TABLE IF NOT EXISTS `myems_historical_db`.`tbl_offline_meter_files` (
PRIMARY KEY (`id`));
--- ---------------------------------------------------------------------------------------------------------------------
--- Table `myems_historical_db`.`tbl_offline_cost_files`
--- ---------------------------------------------------------------------------------------------------------------------
-DROP TABLE IF EXISTS `myems_historical_db`.`tbl_offline_cost_files` ;
-
-CREATE TABLE IF NOT EXISTS `myems_historical_db`.`tbl_offline_cost_files` (
- `id` BIGINT NOT NULL AUTO_INCREMENT,
- `file_name` VARCHAR(255) NOT NULL,
- `uuid` CHAR(36) NOT NULL,
- `upload_datetime_utc` DATETIME NOT NULL,
- `status` VARCHAR(45) NOT NULL COMMENT 'new, done, error',
- `file_object` LONGBLOB NOT NULL,
- PRIMARY KEY (`id`));
-
COMMIT;
diff --git a/database/myems_system_db.sql b/database/myems_system_db.sql
index c98de9bc..6c673342 100644
--- a/database/myems_system_db.sql
+++ b/database/myems_system_db.sql
@@ -2250,6 +2250,30 @@ USE `myems_system_db`;
INSERT INTO `myems_system_db`.`tbl_versions`
(`id`, `version`, `release_date`)
VALUES
-(1, '1.1.3', '2021-05-25');
+(1, '1.1.4', '2021-07-19');
+
+COMMIT;
+
+-- ---------------------------------------------------------------------------------------------------------------------
+-- Table `myems_system_db`.`tbl_web_menus`
+-- ---------------------------------------------------------------------------------------------------------------------
+DROP TABLE IF EXISTS `myems_system_db`.`tbl_web_menus` ;
+
+CREATE TABLE IF NOT EXISTS `myems_system_db`.`tbl_web_menus` (
+ `id` BIGINT NOT NULL AUTO_INCREMENT,
+ `version` VARCHAR(256) NOT NULL,
+ `release_date` DATE NOT NULL,
+ PRIMARY KEY (`id`));
+
+-- ---------------------------------------------------------------------------------------------------------------------
+-- Example Data for table `myems_system_db`.`tbl_versions`
+-- ---------------------------------------------------------------------------------------------------------------------
+START TRANSACTION;
+USE `myems_system_db`;
+
+INSERT INTO `myems_system_db`.`tbl_versions`
+(`id`, `version`, `release_date`)
+VALUES
+(1, '1.1.4', '2021-07-19');
COMMIT;
diff --git a/database/upgrade1.1.4.sql b/database/upgrade1.1.4.sql
new file mode 100644
index 00000000..d2f50723
--- /dev/null
+++ b/database/upgrade1.1.4.sql
@@ -0,0 +1,21 @@
+
+DROP TABLE myems_fdd_db.tbl_sms_recipients;
+
+CREATE TABLE IF NOT EXISTS `myems_reporting_db`.`tbl_email_messages` (
+ `id` BIGINT NOT NULL AUTO_INCREMENT,
+ `recipient_name` VARCHAR(128) NOT NULL,
+ `recipient_email` VARCHAR(128) NOT NULL,
+ `subject` VARCHAR(128) NOT NULL,
+ `message` LONGTEXT NOT NULL,
+ `attachment_file_name` VARCHAR(128) NULL,
+ `attachment_file_object` LONGBLOB NULL,
+ `created_datetime_utc` DATETIME NOT NULL,
+ `scheduled_datetime_utc` DATETIME NOT NULL,
+ `status` VARCHAR(32) NOT NULL COMMENT 'new, sent, timeout',
+ PRIMARY KEY (`id`));
+CREATE INDEX `tbl_email_messages_index_1` ON `myems_reporting_db`.`tbl_email_messages` (`status`, `scheduled_datetime_utc`);
+
+RENAME TABLE myems_historical_db.tbl_offline_cost_files TO myems_historical_db.tbl_cost_files;
+
+-- UPDATE VERSION NUMBER
+UPDATE myems_system_db.tbl_versions SET version='1.1.4', release_date='2021-07-19' WHERE id=1;
diff --git a/myems-api/MyEMS.postman_collection.json b/myems-api/MyEMS.postman_collection.json
index 106b66ce..12178bd1 100644
--- a/myems-api/MyEMS.postman_collection.json
+++ b/myems-api/MyEMS.postman_collection.json
@@ -837,6 +837,121 @@
}
]
},
+ {
+ "name": "Cost File",
+ "item": [
+ {
+ "name": "GET All Cost Files",
+ "request": {
+ "method": "GET",
+ "header": [],
+ "url": {
+ "raw": "{{base_url}}/costfiles",
+ "host": [
+ "{{base_url}}"
+ ],
+ "path": [
+ "costfiles"
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "GET a Cost File by ID",
+ "request": {
+ "method": "GET",
+ "header": [],
+ "url": {
+ "raw": "{{base_url}}/costfiles/1",
+ "host": [
+ "{{base_url}}"
+ ],
+ "path": [
+ "costfiles",
+ "1"
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "POST Upload a Cost File",
+ "request": {
+ "method": "POST",
+ "header": [
+ {
+ "key": "User_UUID",
+ "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4",
+ "type": "text"
+ },
+ {
+ "key": "Token",
+ "value": "6b0622f8974b2e6f2d7a7470baf073b78bddffd4",
+ "type": "text"
+ }
+ ],
+ "body": {
+ "mode": "formdata",
+ "formdata": [
+ {
+ "key": "file",
+ "type": "file",
+ "src": "/zh/myems/myems-doc/offlinemeters.xlsx"
+ }
+ ]
+ },
+ "url": {
+ "raw": "{{base_url}}/costfiles",
+ "host": [
+ "{{base_url}}"
+ ],
+ "path": [
+ "costfiles"
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "DELETE a Cost File by ID",
+ "request": {
+ "method": "DELETE",
+ "header": [],
+ "url": {
+ "raw": "{{base_url}}/costfiles/1",
+ "host": [
+ "{{base_url}}"
+ ],
+ "path": [
+ "costfiles",
+ "1"
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "Rstore a Cost File by ID",
+ "request": {
+ "method": "GET",
+ "header": [],
+ "url": {
+ "raw": "{{base_url}}/costfiles/1/restore",
+ "host": [
+ "{{base_url}}"
+ ],
+ "path": [
+ "costfiles",
+ "1",
+ "restore"
+ ]
+ }
+ },
+ "response": []
+ }
+ ]
+ },
{
"name": "Data Source",
"item": [
@@ -2712,25 +2827,6 @@
},
"response": []
},
- {
- "name": "GET Rstore an Offline Meter File by ID",
- "request": {
- "method": "GET",
- "header": [],
- "url": {
- "raw": "{{base_url}}/offlinemeterfiles/1/restore",
- "host": [
- "{{base_url}}"
- ],
- "path": [
- "offlinemeterfiles",
- "1",
- "restore"
- ]
- }
- },
- "response": []
- },
{
"name": "POST Upload a Knowledge File",
"request": {
@@ -2786,6 +2882,25 @@
}
},
"response": []
+ },
+ {
+ "name": "Rstore a Knowledge File by ID",
+ "request": {
+ "method": "GET",
+ "header": [],
+ "url": {
+ "raw": "{{base_url}}/knowledgefiles/1/restore",
+ "host": [
+ "{{base_url}}"
+ ],
+ "path": [
+ "knowledgefiles",
+ "1",
+ "restore"
+ ]
+ }
+ },
+ "response": []
}
]
},
@@ -3264,25 +3379,6 @@
},
"response": []
},
- {
- "name": "GET Rstore a Knowledge File by ID",
- "request": {
- "method": "GET",
- "header": [],
- "url": {
- "raw": "{{base_url}}/knowledgefiles/1/restore",
- "host": [
- "{{base_url}}"
- ],
- "path": [
- "knowledgefiles",
- "1",
- "restore"
- ]
- }
- },
- "response": []
- },
{
"name": "POST Upload a Offline Meter File",
"request": {
@@ -3338,98 +3434,21 @@
}
},
"response": []
- }
- ]
- },
- {
- "name": "Offline Cost File",
- "item": [
+ },
{
- "name": "GET All Offline Cost Files",
+ "name": "Rstore an Offline Meter File by ID",
"request": {
"method": "GET",
"header": [],
"url": {
- "raw": "{{base_url}}/offlinecostfiles",
+ "raw": "{{base_url}}/offlinemeterfiles/1/restore",
"host": [
"{{base_url}}"
],
"path": [
- "offlinecostfiles"
- ]
- }
- },
- "response": []
- },
- {
- "name": "GET a Offline Cost File by ID",
- "request": {
- "method": "GET",
- "header": [],
- "url": {
- "raw": "{{base_url}}/offlinecostfiles/1",
- "host": [
- "{{base_url}}"
- ],
- "path": [
- "offlinecostfiles",
- "1"
- ]
- }
- },
- "response": []
- },
- {
- "name": "POST Upload a Offline Cost File",
- "request": {
- "method": "POST",
- "header": [
- {
- "key": "User_UUID",
- "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4",
- "type": "text"
- },
- {
- "key": "Token",
- "value": "6b0622f8974b2e6f2d7a7470baf073b78bddffd4",
- "type": "text"
- }
- ],
- "body": {
- "mode": "formdata",
- "formdata": [
- {
- "key": "file",
- "type": "file",
- "src": "/zh/myems/myems-doc/offlinemeters.xlsx"
- }
- ]
- },
- "url": {
- "raw": "{{base_url}}/offlinecostfiles",
- "host": [
- "{{base_url}}"
- ],
- "path": [
- "offlinecostfiles"
- ]
- }
- },
- "response": []
- },
- {
- "name": "DELETE a Offline Cost File by ID",
- "request": {
- "method": "DELETE",
- "header": [],
- "url": {
- "raw": "{{base_url}}/offlinecostfiles/1",
- "host": [
- "{{base_url}}"
- ],
- "path": [
- "offlinecostfiles",
- "1"
+ "offlinemeterfiles",
+ "1",
+ "restore"
]
}
},
diff --git a/myems-api/README.md b/myems-api/README.md
index 53de1156..1a010be2 100644
--- a/myems-api/README.md
+++ b/myems-api/README.md
@@ -159,7 +159,7 @@ View in Postman: import the file MyEMS.postman_collection.json with Postman
[Data Source](#Data-Source) | [Point](#Point)
-[Tariff](#Tariff) | [Cost Center](#Cost-Center) | [Offline Cost File](#Offline-Cost-File)
+[Tariff](#Tariff) | [Cost Center](#Cost-Center) | [Cost File](#Offline-Cost-File)
[Meter](#Meter) | [Virtual Meter](#Virtual-Meter) | [Offline Meter](#Offline-Meter) | [Offline Meter File](#Offline-Meter-File)
@@ -250,35 +250,39 @@ $ curl -i -H "Content-Type: application/json" -X POST -d '{"data":{"tariff_id":"
$ curl -i -X DELETE {{base_url}}/costcenters/{id}/tariffs/{tid}
```
-### Offline Cost File
-* GET an Offline Cost File by ID
+### Cost File
+* GET an Cost File by ID
```bash
-$ curl -i -X GET {{base_url}}/offlinecostfiles/{id}
+$ curl -i -X GET {{base_url}}/costfiles/{id}
```
Result
| Name | Data Type | Description |
|---------------|-----------|-------------------------------------------|
-| id | integer | Offline Cost File ID |
-| file_name | string | Offline Cost File name |
-| uuid | string | Offline Cost File UUID |
+| id | integer | Cost File ID |
+| file_name | string | Cost File name |
+| uuid | string | Cost File UUID |
| upload_datetime | float | the number of milliseconds since January 1, 1970, 00:00:00, universal time |
-| status | string | Offline Cost File processing status (new, done, error) |
-| file_object | BLOB | Offline Cost File Object |
+| status | string | Cost File processing status (new, done, error) |
+| file_object | BLOB | Cost File Object |
-* GET All Offline Cost Files
+* GET All Cost Files
```bash
-$ curl -i -X GET {{base_url}}/offlinecostfiles
+$ curl -i -X GET {{base_url}}/costfiles
```
-* DELETE an Offline Cost File by ID
+* DELETE a Cost File by ID
```bash
-$ curl -i -X DELETE {{base_url}}/offlinecostfiles/{id}
+$ curl -i -X DELETE {{base_url}}/costfiles/{id}
```
-* POST Upload an Offline Cost File
+* POST Upload a Cost File
(user must login first to get cookie)
```bash
-$ curl -i -H "Content-Type: application/TBD" -X POST -d 'file: (binary)' {{base_url}}/offlinecostfiles
+$ curl -i -H "Content-Type: application/TBD" -X POST -d 'file: (binary)' {{base_url}}/costfiles
+```
+* GET Restore a Cost File by ID from database to disk
+```bash
+$ curl -i -X GET {{base_url}}/costfiles/{id}/restore
```
### Data Source
diff --git a/myems-api/app.py b/myems-api/app.py
index 083a0fed..bab9cb1f 100644
--- a/myems-api/app.py
+++ b/myems-api/app.py
@@ -3,7 +3,7 @@ from falcon_cors import CORS
from falcon_multipart.middleware import MultipartMiddleware
from core import energyflowdiagram, privilege, textmessage, distributioncircuit, virtualmeter, \
costcenter, point, knowledgefile, meter, gsmmodem, tariff, user, storetype, timezone, \
- offlinecostfile, offlinemeterfile, version, contact, emailserver, combinedequipment, datasource, equipment, tenant, shopfloor, \
+ costfile, offlinemeterfile, version, contact, emailserver, combinedequipment, datasource, equipment, tenant, shopfloor, \
webmessage, distributionsystem, store, emailmessage, tenanttype, wechatmessage, space, gateway, offlinemeter, \
rule, energycategory, sensor, energyitem, notification
from reports import advancedreport
@@ -140,10 +140,12 @@ api.add_route('/costcenters/{id_}/tariffs',
api.add_route('/costcenters/{id_}/tariffs/{tid}',
costcenter.CostCenterTariffItem())
-api.add_route('/offlinecostfiles',
- offlinecostfile.OfflineCostFileCollection())
-api.add_route('/offlinecostfiles/{id_}',
- offlinecostfile.OfflineCostFileItem())
+api.add_route('/costfiles',
+ costfile.CostFileCollection())
+api.add_route('/costfiles/{id_}',
+ costfile.CostFileItem())
+api.add_route('/costfiles/{id_}/restore',
+ costfile.CostFileRestore())
api.add_route('/datasources',
datasource.DataSourceCollection())
diff --git a/myems-api/core/offlinecostfile.py b/myems-api/core/costfile.py
similarity index 73%
rename from myems-api/core/offlinecostfile.py
rename to myems-api/core/costfile.py
index 875f5eab..d73f2538 100644
--- a/myems-api/core/offlinecostfile.py
+++ b/myems-api/core/costfile.py
@@ -7,7 +7,7 @@ from datetime import datetime, timezone
import os
-class OfflineCostFileCollection:
+class CostFileCollection:
@staticmethod
def __init__():
pass
@@ -22,7 +22,7 @@ class OfflineCostFileCollection:
cursor = cnx.cursor()
query = (" SELECT id, file_name, uuid, upload_datetime_utc, status "
- " FROM tbl_offline_cost_files "
+ " FROM tbl_cost_files "
" ORDER BY upload_datetime_utc desc ")
cursor.execute(query)
rows = cursor.fetchall()
@@ -68,7 +68,7 @@ class OfflineCostFileCollection:
os.rename(temp_file_path, file_path)
except Exception as ex:
raise falcon.HTTPError(falcon.HTTP_400, title='API.ERROR',
- description='API.FAILED_TO_UPLOAD_OFFLINE_COST_FILE')
+ description='API.FAILED_TO_UPLOAD_COST_FILE')
# Verify User Session
token = req.headers.get('TOKEN')
@@ -124,7 +124,7 @@ class OfflineCostFileCollection:
cnx = mysql.connector.connect(**config.myems_historical_db)
cursor = cnx.cursor()
- add_values = (" INSERT INTO tbl_offline_cost_files "
+ add_values = (" INSERT INTO tbl_cost_files "
" (file_name, uuid, upload_datetime_utc, status, file_object ) "
" VALUES (%s, %s, %s, %s, %s) ")
cursor.execute(add_values, (filename,
@@ -138,10 +138,10 @@ class OfflineCostFileCollection:
cnx.disconnect()
resp.status = falcon.HTTP_201
- resp.location = '/offlinecostfiles/' + str(new_id)
+ resp.location = '/costfiles/' + str(new_id)
-class OfflineCostFileItem:
+class CostFileItem:
@staticmethod
def __init__():
pass
@@ -155,13 +155,13 @@ class OfflineCostFileItem:
if not id_.isdigit() or int(id_) <= 0:
raise falcon.HTTPError(falcon.HTTP_400,
title='API.BAD_REQUEST',
- description='API.INVALID_OFFLINE_COST_FILE_ID')
+ description='API.INVALID_COST_FILE_ID')
cnx = mysql.connector.connect(**config.myems_historical_db)
cursor = cnx.cursor()
query = (" SELECT id, file_name, uuid, upload_datetime_utc, status "
- " FROM tbl_offline_cost_files "
+ " FROM tbl_cost_files "
" WHERE id = %s ")
cursor.execute(query, (id_,))
row = cursor.fetchone()
@@ -169,7 +169,7 @@ class OfflineCostFileItem:
cnx.disconnect()
if row is None:
raise falcon.HTTPError(falcon.HTTP_404, title='API.NOT_FOUND',
- description='API.OFFLINE_COST_FILE_NOT_FOUND')
+ description='API.COST_FILE_NOT_FOUND')
upload_datetime = row[3]
upload_datetime = upload_datetime.replace(tzinfo=timezone.utc)
@@ -185,20 +185,20 @@ class OfflineCostFileItem:
def on_delete(req, resp, id_):
if not id_.isdigit() or int(id_) <= 0:
raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST',
- description='API.INVALID_OFFLINE_COST_FILE_ID')
+ description='API.INVALID_COST_FILE_ID')
cnx = mysql.connector.connect(**config.myems_historical_db)
cursor = cnx.cursor()
cursor.execute(" SELECT uuid "
- " FROM tbl_offline_cost_files "
+ " FROM tbl_cost_files "
" WHERE id = %s ", (id_,))
row = cursor.fetchone()
if row is None:
cursor.close()
cnx.disconnect()
raise falcon.HTTPError(falcon.HTTP_404, title='API.NOT_FOUND',
- description='API.OFFLINE_COST_FILE_NOT_FOUND')
+ description='API.COST_FILE_NOT_FOUND')
try:
file_uuid = row[0]
@@ -208,14 +208,69 @@ class OfflineCostFileItem:
# remove the file from disk
os.remove(file_path)
except Exception as ex:
- # ignore exception and don't return API.OFFLINE_COST_FILE_NOT_FOUND error
+ # ignore exception and don't return API.COST_FILE_NOT_FOUND error
pass
# Note: the energy data imported from the deleted file will not be deleted
- cursor.execute(" DELETE FROM tbl_offline_cost_files WHERE id = %s ", (id_,))
+ cursor.execute(" DELETE FROM tbl_cost_files WHERE id = %s ", (id_,))
cnx.commit()
cursor.close()
cnx.disconnect()
resp.status = falcon.HTTP_204
+
+
+class CostFileRestore:
+ @staticmethod
+ def __init__():
+ pass
+
+ @staticmethod
+ def on_options(req, resp, id_):
+ resp.status = falcon.HTTP_200
+
+ @staticmethod
+ def on_get(req, resp, id_):
+ if not id_.isdigit() or int(id_) <= 0:
+ raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST',
+ description='API.INVALID_COST_FILE_ID')
+
+ cnx = mysql.connector.connect(**config.myems_historical_db)
+ cursor = cnx.cursor()
+
+ query = (" SELECT uuid, file_object "
+ " FROM tbl_cost_files "
+ " WHERE id = %s ")
+ cursor.execute(query, (id_,))
+ row = cursor.fetchone()
+ cursor.close()
+ cnx.disconnect()
+
+ if row is None:
+ raise falcon.HTTPError(falcon.HTTP_404, title='API.NOT_FOUND',
+ description='API.COST_FILE_NOT_FOUND')
+
+ result = {"uuid": row[0],
+ "file_object": row[1]}
+ try:
+ raw_blob = result["file_object"]
+ file_uuid = result["uuid"]
+
+ # Define file_path
+ file_path = os.path.join(config.upload_path, file_uuid)
+
+ # Write to a temporary file to prevent incomplete files from
+ # being used.
+ temp_file_path = file_path + '~'
+
+ open(temp_file_path, 'wb').write(raw_blob)
+
+ # Now that we know the file has been fully saved to disk
+ # move it into place.
+ os.replace(temp_file_path, file_path)
+ except Exception as ex:
+ raise falcon.HTTPError(falcon.HTTP_400, title='API.ERROR',
+ description='API.FAILED_TO_RESTORE_COST_FILE')
+ resp.body = 'success'
+ resp.status = falcon.HTTP_200
diff --git a/web/package-lock.json b/web/package-lock.json
index e9502f64..c13bc18c 100644
--- a/web/package-lock.json
+++ b/web/package-lock.json
@@ -1,6 +1,6 @@
{
"name": "myems",
- "version": "1.1.3",
+ "version": "1.1.4",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
diff --git a/web/package.json b/web/package.json
index 91a6d7fe..7aa98511 100644
--- a/web/package.json
+++ b/web/package.json
@@ -1,6 +1,6 @@
{
"name": "myems",
- "version": "1.1.3",
+ "version": "1.1.4",
"private": true,
"dependencies": {
"@fortawesome/fontawesome-free": "^5.15.1",
diff --git a/web/src/config.js b/web/src/config.js
index db538afe..7a4c1a0d 100644
--- a/web/src/config.js
+++ b/web/src/config.js
@@ -1,4 +1,4 @@
-export const version = '1.1.3';
+export const version = '1.1.4';
export const navbarBreakPoint = 'xl'; // Vertical navbar breakpoint
export const topNavbarBreakpoint = 'lg';
//export const APIBaseURL = 'http://127.0.0.1:8000';