From a8a89c77b88f3dd8a85d21962cb34e2b13e72eae Mon Sep 17 00:00:00 2001 From: YangZhang-GitHub <2533471770@qq.com> Date: Mon, 17 May 2021 18:10:38 +0800 Subject: [PATCH] The StoreBatch page display function is completed --- web/src/components/MyEMS/Store/StoreBatch.js | 330 +++++++++++++++++++ web/src/layouts/MyEMSRoutes.js | 2 + web/src/routes.js | 1 + 3 files changed, 333 insertions(+) create mode 100644 web/src/components/MyEMS/Store/StoreBatch.js diff --git a/web/src/components/MyEMS/Store/StoreBatch.js b/web/src/components/MyEMS/Store/StoreBatch.js new file mode 100644 index 00000000..ab03eac3 --- /dev/null +++ b/web/src/components/MyEMS/Store/StoreBatch.js @@ -0,0 +1,330 @@ +import React, { Fragment, useEffect, useState } from 'react'; +import { + Breadcrumb, + BreadcrumbItem, + Row, + Col, + Card, + CardBody, + Button, + ButtonGroup, + Form, + FormGroup, + Input, + Label, + CustomInput, + Spinner, +} from 'reactstrap'; +import Datetime from 'react-datetime'; +import moment from 'moment'; +import loadable from '@loadable/component'; +import Cascader from 'rc-cascader'; +import { getCookieValue, createCookie } from '../../../helpers/utils'; +import withRedirect from '../../../hoc/withRedirect'; +import { withTranslation } from 'react-i18next'; +import { toast } from 'react-toastify'; +import ButtonIcon from '../../common/ButtonIcon'; +import { APIBaseURL } from '../../../config'; + + +const DetailedDataTable = loadable(() => import('../common/DetailedDataTable')); + + +const StoreBatch = ({ setRedirect, setRedirectUrl, t }) => { + let current_moment = moment(); + useEffect(() => { + let is_logged_in = getCookieValue('is_logged_in'); + let user_name = getCookieValue('user_name'); + let user_display_name = getCookieValue('user_display_name'); + let user_uuid = getCookieValue('user_uuid'); + let token = getCookieValue('token'); + if (is_logged_in === null || !is_logged_in) { + setRedirectUrl(`/authentication/basic/login`); + setRedirect(true); + } else { + //update expires time of cookies + createCookie('is_logged_in', true, 1000 * 60 * 60 * 8); + createCookie('user_name', user_name, 1000 * 60 * 60 * 8); + createCookie('user_display_name', user_display_name, 1000 * 60 * 60 * 8); + createCookie('user_uuid', user_uuid, 1000 * 60 * 60 * 8); + createCookie('token', token, 1000 * 60 * 60 * 8); + } + }); + // State + // Query Parameters + const [selectedSpaceName, setSelectedSpaceName] = useState(undefined); + const [selectedSpaceID, setSelectedSpaceID] = useState(undefined); + const [storeList, setStoreList] = useState([]); + const [reportingPeriodBeginsDatetime, setReportingPeriodBeginsDatetime] = useState(current_moment.clone().startOf('month')); + const [reportingPeriodEndsDatetime, setReportingPeriodEndsDatetime] = useState(current_moment); + const [cascaderOptions, setCascaderOptions] = useState(undefined); + + // buttons + const [submitButtonDisabled, setSubmitButtonDisabled] = useState(false); + const [spinnerHidden, setSpinnerHidden] = useState(true); + const [exportButtonHidden, setExportButtonHidden] = useState(true); + + //Results + const [detailedDataTableColumns, setDetailedDataTableColumns] = useState( + [{dataField: 'name', text: t('Name'), sort: true}, {dataField: 'space', text: t('Space'), sort: true}]); + const [excelBytesBase64, setExcelBytesBase64] = useState(undefined); + + useEffect(() => { + let isResponseOK = false; + fetch(APIBaseURL + '/spaces/tree', { + method: 'GET', + headers: { + "Content-type": "application/json", + "User-UUID": getCookieValue('user_uuid'), + "Token": getCookieValue('token') + }, + body: null, + + }).then(response => { + console.log(response); + if (response.ok) { + isResponseOK = true; + } + return response.json(); + }).then(json => { + console.log(json); + if (isResponseOK) { + // rename keys + json = JSON.parse(JSON.stringify([json]).split('"id":').join('"value":').split('"name":').join('"label":')); + setCascaderOptions(json); + // set the default selected space + setSelectedSpaceName([json[0]].map(o => o.label)); + setSelectedSpaceID([json[0]].map(o => o.value)); + + setSubmitButtonDisabled(false); + setSpinnerHidden(true); + } else { + toast.error(json.description); + } + }).catch(err => { + console.log(err); + }); + + }, []); + + const labelClasses = 'ls text-uppercase text-600 font-weight-semi-bold mb-0'; + + let onSpaceCascaderChange = (value, selectedOptions) => { + setSelectedSpaceName(selectedOptions.map(o => o.label).join('/')); + setSelectedSpaceID(value[value.length - 1]); + setStoreList([]); + setExportButtonHidden(true); + setSubmitButtonDisabled(false); + } + let onReportingPeriodBeginsDatetimeChange = (newDateTime) => { + setReportingPeriodBeginsDatetime(newDateTime); + } + + let onReportingPeriodEndsDatetimeChange = (newDateTime) => { + setReportingPeriodEndsDatetime(newDateTime); + } + + var getValidReportingPeriodBeginsDatetimes = function (currentDate) { + return currentDate.isBefore(moment(reportingPeriodEndsDatetime, 'MM/DD/YYYY, hh:mm:ss a')); + } + + var getValidReportingPeriodEndsDatetimes = function (currentDate) { + return currentDate.isAfter(moment(reportingPeriodBeginsDatetime, 'MM/DD/YYYY, hh:mm:ss a')); + } + + // Handler + const handleSubmit = e => { + e.preventDefault(); + console.log('handleSubmit'); + console.log(selectedSpaceID); + console.log(reportingPeriodBeginsDatetime.format('YYYY-MM-DDTHH:mm:ss')); + console.log(reportingPeriodEndsDatetime.format('YYYY-MM-DDTHH:mm:ss')); + + // disable submit button + setSubmitButtonDisabled(true); + // show spinner + setSpinnerHidden(false); + // hide export buttion + setExportButtonHidden(true) + + // Reinitialize tables + setStoreList([]); + + let isResponseOK = false; + fetch(APIBaseURL + '/reports/storebatch?' + + 'spaceid=' + selectedSpaceID + + '&reportingperiodstartdatetime=' + reportingPeriodBeginsDatetime.format('YYYY-MM-DDTHH:mm:ss') + + '&reportingperiodenddatetime=' + reportingPeriodEndsDatetime.format('YYYY-MM-DDTHH:mm:ss'), { + method: 'GET', + headers: { + "Content-type": "application/json", + "User-UUID": getCookieValue('user_uuid'), + "Token": getCookieValue('token') + }, + body: null, + + }).then(response => { + if (response.ok) { + isResponseOK = true; + }; + return response.json(); + }).then(json => { + if (isResponseOK) { + console.log(json) + let stores = []; + if (json['stores'].length > 0) { + json['stores'].forEach((currentStore, index) => { + let detailed_value = {}; + detailed_value['id'] = currentStore['id']; + detailed_value['name'] = currentStore['store_name']; + detailed_value['space'] = currentStore['space_name']; + detailed_value['costcenter'] = currentStore['cost_center_name']; + currentStore['values'].forEach((currentValue, energyCategoryIndex) => { + detailed_value['a' + energyCategoryIndex] = currentValue.toFixed(2); + }); + stores.push(detailed_value); + }); + }; + + setStoreList(stores); + + let detailed_column_list = []; + detailed_column_list.push({ + dataField: 'name', + text: t('Name'), + sort: true + }); + detailed_column_list.push({ + dataField: 'space', + text: t('Space'), + sort: true + }); + json['energycategories'].forEach((currentValue, index) => { + detailed_column_list.push({ + dataField: 'a' + index, + text: currentValue['name'] + ' (' + currentValue['unit_of_measure'] + ')', + sort: true + }) + }); + setDetailedDataTableColumns(detailed_column_list); + + setExcelBytesBase64(json['excel_bytes_base64']); + + // enable submit button + setSubmitButtonDisabled(false); + // hide spinner + setSpinnerHidden(true); + // show export buttion + setExportButtonHidden(false); + + } else { + toast.error(json.description) + } + }).catch(err => { + console.log(err); + }); + }; + + const handleExport = e => { + e.preventDefault(); + const mimeType='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' + const fileName = 'storebatch.xlsx' + var fileUrl = "data:" + mimeType + ";base64," + excelBytesBase64; + fetch(fileUrl) + .then(response => response.blob()) + .then(blob => { + var link = window.document.createElement("a"); + link.href = window.URL.createObjectURL(blob, { type: mimeType }); + link.download = fileName; + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + }); + }; + + + + return ( + +
+ + {t('Store Data')}{t('Batch Analysis')} + +
+ + +
+ + + + +
+ + + +
+ + + + + + + + + + + + + + + + +

+ + + +
+ + + +

+
+ + +

+ + +
+
+
+
+ + + +
+ ); +}; + +export default withTranslation()(withRedirect(StoreBatch)); diff --git a/web/src/layouts/MyEMSRoutes.js b/web/src/layouts/MyEMSRoutes.js index 95bfc8a9..f1429c54 100644 --- a/web/src/layouts/MyEMSRoutes.js +++ b/web/src/layouts/MyEMSRoutes.js @@ -150,6 +150,7 @@ import StoreCost from '../components/MyEMS/Store/StoreCost'; import StoreLoad from '../components/MyEMS/Store/StoreLoad'; import StoreStatistics from '../components/MyEMS/Store/StoreStatistics'; import StoreSaving from '../components/MyEMS/Store/StoreSaving'; +import StoreBatch from "../components/MyEMS/Store/StoreBatch"; // Shopfloor import ShopfloorEnergyCategory from '../components/MyEMS/Shopfloor/ShopfloorEnergyCategory'; import ShopfloorEnergyItem from '../components/MyEMS/Shopfloor/ShopfloorEnergyItem'; @@ -385,6 +386,7 @@ const MyEMSRoutes = () => ( + {/*Shopfloor*/} diff --git a/web/src/routes.js b/web/src/routes.js index c5b4f592..c8953f7b 100644 --- a/web/src/routes.js +++ b/web/src/routes.js @@ -390,6 +390,7 @@ export const storeRoutes = { { to: '/store/load', name: 'Load' }, { to: '/store/statistics', name: 'Statistics' }, { to: '/store/saving', name: 'Saving' }, + { to: '/store/batch', name: 'Batch Analysis' }, ] };