提交 1fcee5d4 编写于 作者: nengyuangzhang's avatar nengyuangzhang

added energy storage power station relation to space in myems-api

上级 d5e33541
......@@ -9,6 +9,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
- added SectionLineChart into myems-web
- added start datetime, end datetime and update datetime to fdd webmessage
- added is_cost_data_displayed to microgrid and energy storage power station
- added energy storage power station relation to space in myems-api
### Changed
- changed map marker in myems-web
### Fixed
......
此差异已折叠。
......@@ -16295,6 +16295,128 @@
},
"response": []
},
{
"name": "GET All Energy Storage Power Stations of a Space",
"request": {
"method": "GET",
"header": [
{
"key": "User-UUID",
"value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4",
"type": "text",
"description": "Any admin users' UUID"
},
{
"key": "Token",
"value": "c5f872b51ed40ccf55f1c1d6dbd8cb86eefba5d1010e23b2386bd82be431f3eafc0e3360dee18a5327d9e9852e3cf7caad3b81e252f9f311790c22f7a62a90e1",
"type": "text",
"description": "Login first to get a valid token"
},
{
"key": "API-Key",
"value": "c5ee62be2792ed4a59de1096511934288f4c192363529dafc00b3b35f81f224a5cc44c9aae46ac8966dc52f1ea0039395551bdf3f86aff6bb2b6b032834fc139",
"type": "default",
"description": "Create API Key at myems-admin",
"disabled": true
}
],
"url": {
"raw": "{{base_url}}/spaces/1/energystoragepowerstations",
"host": [
"{{base_url}}"
],
"path": [
"spaces",
"1",
"energystoragepowerstations"
]
}
},
"response": []
},
{
"name": "Bind an Energe Storage Power Station to a Space",
"request": {
"method": "POST",
"header": [
{
"key": "User-UUID",
"value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4",
"type": "text",
"description": "Any admin users' UUID"
},
{
"key": "Token",
"value": "c5f872b51ed40ccf55f1c1d6dbd8cb86eefba5d1010e23b2386bd82be431f3eafc0e3360dee18a5327d9e9852e3cf7caad3b81e252f9f311790c22f7a62a90e1",
"type": "text",
"description": "Login first to get a valid token"
},
{
"key": "API-Key",
"value": "c5ee62be2792ed4a59de1096511934288f4c192363529dafc00b3b35f81f224a5cc44c9aae46ac8966dc52f1ea0039395551bdf3f86aff6bb2b6b032834fc139",
"type": "default",
"description": "Create API Key at myems-admin",
"disabled": true
}
],
"body": {
"mode": "raw",
"raw": "{\"data\":{\"equipment_id\":1}}"
},
"url": {
"raw": "{{base_url}}/spaces/1/energystoragepowerstations",
"host": [
"{{base_url}}"
],
"path": [
"spaces",
"1",
"energystoragepowerstations"
]
}
},
"response": []
},
{
"name": "DELETE an Energy Storage Power Station from Space",
"request": {
"method": "DELETE",
"header": [
{
"key": "User-UUID",
"value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4",
"type": "text",
"description": "Any admin users' UUID"
},
{
"key": "Token",
"value": "c5f872b51ed40ccf55f1c1d6dbd8cb86eefba5d1010e23b2386bd82be431f3eafc0e3360dee18a5327d9e9852e3cf7caad3b81e252f9f311790c22f7a62a90e1",
"type": "text",
"description": "Login first to get a valid token"
},
{
"key": "API-Key",
"value": "c5ee62be2792ed4a59de1096511934288f4c192363529dafc00b3b35f81f224a5cc44c9aae46ac8966dc52f1ea0039395551bdf3f86aff6bb2b6b032834fc139",
"type": "default",
"description": "Create API Key at myems-admin",
"disabled": true
}
],
"url": {
"raw": "{{base_url}}/spaces/1/energystoragepowerstations/1",
"host": [
"{{base_url}}"
],
"path": [
"spaces",
"1",
"energystoragepowerstations",
"1"
]
}
},
"response": []
},
{
"name": "GET All Equipments of a Space",
"request": {
......@@ -609,6 +609,10 @@ api.add_route('/spaces/{id_}/combinedequipments',
space.SpaceCombinedEquipmentCollection())
api.add_route('/spaces/{id_}/combinedequipments/{eid}',
space.SpaceCombinedEquipmentItem())
api.add_route('/spaces/{id_}/energystoragepowerstations',
space.SpaceEnergyStoragePowerStationCollection())
api.add_route('/spaces/{id_}/energystoragepowerstations/{eid}',
space.SpaceEnergyStoragePowerStationItem())
api.add_route('/spaces/{id_}/equipments',
space.SpaceEquipmentCollection())
api.add_route('/spaces/{id_}/equipments/{eid}',
......
......@@ -995,6 +995,184 @@ class SpaceCombinedEquipmentItem:
resp.status = falcon.HTTP_204
class SpaceEnergyStoragePowerStationCollection:
@staticmethod
def __init__():
"""Initializes Class"""
pass
@staticmethod
def on_options(req, resp, id_):
resp.status = falcon.HTTP_200
@staticmethod
def on_get(req, resp, id_):
if 'API-KEY' not in req.headers or \
not isinstance(req.headers['API-KEY'], str) or \
len(str.strip(req.headers['API-KEY'])) == 0:
access_control(req)
else:
api_key_control(req)
if not id_.isdigit() or int(id_) <= 0:
raise falcon.HTTPError(status=falcon.HTTP_400, title='API.BAD_REQUEST',
description='API.INVALID_SPACE_ID')
cnx = mysql.connector.connect(**config.myems_system_db)
cursor = cnx.cursor()
cursor.execute(" SELECT name "
" FROM tbl_spaces "
" WHERE id = %s ", (id_,))
if cursor.fetchone() is None:
cursor.close()
cnx.close()
raise falcon.HTTPError(status=falcon.HTTP_404, title='API.NOT_FOUND',
description='API.SPACE_NOT_FOUND')
query = (" SELECT e.id, e.name, e.uuid "
" FROM tbl_spaces s, tbl_spaces_energy_storage_power_stations se, tbl_energy_storage_power_stations e "
" WHERE se.space_id = s.id AND e.id = se.energy_storage_power_station_id AND s.id = %s "
" ORDER BY e.id ")
cursor.execute(query, (id_,))
rows = cursor.fetchall()
result = list()
if rows is not None and len(rows) > 0:
for row in rows:
meta_result = {"id": row[0], "name": row[1], "uuid": row[2]}
result.append(meta_result)
resp.text = json.dumps(result)
@staticmethod
@user_logger
def on_post(req, resp, id_):
"""Handles POST requests"""
admin_control(req)
try:
raw_json = req.stream.read().decode('utf-8')
except Exception as ex:
raise falcon.HTTPError(status=falcon.HTTP_400,
title='API.BAD_REQUEST',
description='API.FAILED_TO_READ_REQUEST_STREAM')
if not id_.isdigit() or int(id_) <= 0:
raise falcon.HTTPError(status=falcon.HTTP_400, title='API.BAD_REQUEST',
description='API.INVALID_SPACE_ID')
new_values = json.loads(raw_json)
if 'energy_storage_power_station_id' not in new_values['data'].keys() or \
not isinstance(new_values['data']['energy_storage_power_station_id'], int) or \
new_values['data']['energy_storage_power_station_id'] <= 0:
raise falcon.HTTPError(status=falcon.HTTP_400, title='API.BAD_REQUEST',
description='API.INVALID_ENERGY_STORAGE_POWER_STATION_ID')
energy_storage_power_station_id = new_values['data']['energy_storage_power_station_id']
cnx = mysql.connector.connect(**config.myems_system_db)
cursor = cnx.cursor()
cursor.execute(" SELECT name "
" from tbl_spaces "
" WHERE id = %s ", (id_,))
if cursor.fetchone() is None:
cursor.close()
cnx.close()
raise falcon.HTTPError(status=falcon.HTTP_404, title='API.NOT_FOUND',
description='API.SPACE_NOT_FOUND')
cursor.execute(" SELECT name "
" FROM tbl_energy_storage_power_stations "
" WHERE id = %s ", (energy_storage_power_station_id,))
if cursor.fetchone() is None:
cursor.close()
cnx.close()
raise falcon.HTTPError(status=falcon.HTTP_404, title='API.NOT_FOUND',
description='API.ENERGY_STORAGE_POWER_STATION_NOT_FOUND')
query = (" SELECT id "
" FROM tbl_spaces_energy_storage_power_stations "
" WHERE space_id = %s AND energy_storage_power_station_id = %s")
cursor.execute(query, (id_, energy_storage_power_station_id,))
if cursor.fetchone() is not None:
cursor.close()
cnx.close()
raise falcon.HTTPError(status=falcon.HTTP_400, title='API.ERROR',
description='API.SPACE_ENERGY_STORAGE_POWER_STATION_RELATION_EXISTS')
add_row = (" INSERT INTO tbl_spaces_equipments (space_id, energy_storage_power_station_id) "
" VALUES (%s, %s) ")
cursor.execute(add_row, (id_, energy_storage_power_station_id,))
cnx.commit()
cursor.close()
cnx.close()
resp.status = falcon.HTTP_201
resp.location = '/spaces/' + str(id_) + '/energystoragepowerstations/' + str(energy_storage_power_station_id)
class SpaceEnergyStoragePowerStationItem:
@staticmethod
def __init__():
"""Initializes Class"""
pass
@staticmethod
def on_options(req, resp, id_, eid):
resp.status = falcon.HTTP_200
@staticmethod
@user_logger
def on_delete(req, resp, id_, eid):
admin_control(req)
if not id_.isdigit() or int(id_) <= 0:
raise falcon.HTTPError(status=falcon.HTTP_400, title='API.BAD_REQUEST',
description='API.INVALID_SPACE_ID')
if not eid.isdigit() or int(eid) <= 0:
raise falcon.HTTPError(status=falcon.HTTP_400, title='API.BAD_REQUEST',
description='API.INVALID_ENERGY_STORAGE_POWER_STATION_ID')
cnx = mysql.connector.connect(**config.myems_system_db)
cursor = cnx.cursor()
cursor.execute(" SELECT name "
" FROM tbl_spaces "
" WHERE id = %s ", (id_,))
if cursor.fetchone() is None:
cursor.close()
cnx.close()
raise falcon.HTTPError(status=falcon.HTTP_404, title='API.NOT_FOUND',
description='API.SPACE_NOT_FOUND')
cursor.execute(" SELECT name "
" FROM tbl_energy_storage_power_stations "
" WHERE id = %s ", (eid,))
if cursor.fetchone() is None:
cursor.close()
cnx.close()
raise falcon.HTTPError(status=falcon.HTTP_404, title='API.NOT_FOUND',
description='API.ENERGY_STORAGE_POWER_STATION_NOT_FOUND')
cursor.execute(" SELECT id "
" FROM tbl_spaces_energy_storage_power_stations "
" WHERE space_id = %s AND energy_storage_power_station_id = %s ", (id_, eid))
if cursor.fetchone() is None:
cursor.close()
cnx.close()
raise falcon.HTTPError(status=falcon.HTTP_404, title='API.NOT_FOUND',
description='API.SPACE_ENERGY_STORAGE_POWER_STATION_RELATION_NOT_FOUND')
cursor.execute(" DELETE FROM tbl_spaces_energy_storage_power_stations "
" WHERE space_id = %s AND energy_storage_power_station_id = %s ", (id_, eid))
cnx.commit()
cursor.close()
cnx.close()
resp.status = falcon.HTTP_204
class SpaceEquipmentCollection:
@staticmethod
def __init__():
......
......@@ -52,8 +52,11 @@ const badgeFormatter = status => {
);
};
const energyFormatter = amount => <Fragment>{amount} kWh</Fragment>;
const capacityFormatter = amount => <Fragment>{amount} kWh</Fragment>;
const powerFormatter = amount => <Fragment>{amount} kW</Fragment>;
const currencyFormatter = amount => <Fragment>{amount} </Fragment>;
const columns = [
{
......@@ -72,25 +75,25 @@ const columns = [
sort: true
},
{
dataField: 'rated_capacity',
text: '充电量',
formatter: capacityFormatter,
dataField: 'total_charge',
text: '充电量',
formatter: energyFormatter,
classes: 'border-0 align-middle',
headerClasses: 'border-0',
sort: true,
},
{
dataField: 'rated_capacity',
text: '放电量',
formatter: capacityFormatter,
dataField: 'total_discharge',
text: '放电量',
formatter: energyFormatter,
classes: 'border-0 align-middle',
headerClasses: 'border-0',
sort: true,
},
{
dataField: 'rated_capacity',
text: '收益',
formatter: capacityFormatter,
dataField: 'total_revenue',
text: '收益',
formatter: currencyFormatter,
classes: 'border-0 align-middle',
headerClasses: 'border-0',
sort: true,
......@@ -156,6 +159,7 @@ const selectRow = onSelect => ({
const EnergyStoragePowerStationTable = ({ setIsSelected, energyStoragePowerStationList }) => {
let table = createRef();
const handleNextPage = ({ page, onPageChange }) => () => {
onPageChange(page + 1);
......
......@@ -973,6 +973,8 @@ const resources = {
'API.SPACE_COMBINED_EQUIPMENT_RELATION_NOT_FOUND': 'Space combined equipment relation not found',
'API.SPACE_COMMAND_RELATION_EXISTS': 'Space command relation exists',
'API.SPACE_COMMAND_RELATION_NOT_FOUND': 'Space command relation not found',
'API.SPACE_ENERGY_STORAGE_POWER_STATION_RELATION_EXISTS': 'Space Energy Storage Power Station Relation Exists',
'API.SPACE_ENERGY_STORAGE_POWER_STATION_RELATION_NOT_FOUND': 'Space Energy Storage Power Station Relation Not Found',
'API.SPACE_EQUIPMENT_RELATION_EXISTS': 'Space equipment relation exists',
'API.SPACE_EQUIPMENT_RELATION_NOT_FOUND': 'Space equipment relation not found',
'API.SPACE_METER_RELATION_EXISTS': 'Space meter relation exists',
......@@ -2039,6 +2041,8 @@ const resources = {
'API.SPACE_COMBINED_EQUIPMENT_RELATION_NOT_FOUND': '空间与组合设备关系不存在',
'API.SPACE_COMMAND_RELATION_EXISTS': 'Space command relation exists',
'API.SPACE_COMMAND_RELATION_NOT_FOUND': 'Space command relation not found',
'API.SPACE_ENERGY_STORAGE_POWER_STATION_RELATION_EXISTS': 'Space Energy Storage Power Station Relation Exists',
'API.SPACE_ENERGY_STORAGE_POWER_STATION_RELATION_NOT_FOUND': 'Space Energy Storage Power Station Relation Not Found',
'API.SPACE_EQUIPMENT_RELATION_EXISTS': '空间与设备关系已存在',
'API.SPACE_EQUIPMENT_RELATION_NOT_FOUND': '空间与设备关系不存在',
'API.SPACE_METER_RELATION_EXISTS': '空间与计量表关系已存在',
......@@ -3151,6 +3155,8 @@ const resources = {
'API.SPACE_COMBINED_EQUIPMENT_RELATION_NOT_FOUND': 'Raumkombinierte Ausrüstungsbeziehung nicht gefunden',
'API.SPACE_COMMAND_RELATION_EXISTS': 'Space command relation exists',
'API.SPACE_COMMAND_RELATION_NOT_FOUND': 'Space command relation not found',
'API.SPACE_ENERGY_STORAGE_POWER_STATION_RELATION_EXISTS': 'Space Energy Storage Power Station Relation Exists',
'API.SPACE_ENERGY_STORAGE_POWER_STATION_RELATION_NOT_FOUND': 'Space Energy Storage Power Station Relation Not Found',
'API.SPACE_EQUIPMENT_RELATION_EXISTS': 'Raumausrüstungsbeziehung besteht',
'API.SPACE_EQUIPMENT_RELATION_NOT_FOUND': 'Beziehung zwischen Weltraumausrüstung nicht gefunden',
'API.SPACE_METER_RELATION_EXISTS': 'Raummeterbeziehung existiert',
......@@ -4252,6 +4258,8 @@ const resources = {
'API.SPACE_COMBINED_EQUIPMENT_RELATION_NOT_FOUND': 'Space combined equipment relation not found',
'API.SPACE_COMMAND_RELATION_EXISTS': 'Space command relation exists',
'API.SPACE_COMMAND_RELATION_NOT_FOUND': 'Space command relation not found',
'API.SPACE_ENERGY_STORAGE_POWER_STATION_RELATION_EXISTS': 'Space Energy Storage Power Station Relation Exists',
'API.SPACE_ENERGY_STORAGE_POWER_STATION_RELATION_NOT_FOUND': 'Space Energy Storage Power Station Relation Not Found',
'API.SPACE_EQUIPMENT_RELATION_EXISTS': 'Space equipment relation exists',
'API.SPACE_EQUIPMENT_RELATION_NOT_FOUND': 'Space equipment relation not found',
'API.SPACE_METER_RELATION_EXISTS': 'Space meter relation exists',
......@@ -5355,6 +5363,8 @@ const resources = {
'API.SPACE_COMBINED_EQUIPMENT_RELATION_NOT_FOUND': 'Space combined equipment relation not found',
'API.SPACE_COMMAND_RELATION_EXISTS': 'Space command relation exists',
'API.SPACE_COMMAND_RELATION_NOT_FOUND': 'Space command relation not found',
'API.SPACE_ENERGY_STORAGE_POWER_STATION_RELATION_EXISTS': 'Space Energy Storage Power Station Relation Exists',
'API.SPACE_ENERGY_STORAGE_POWER_STATION_RELATION_NOT_FOUND': 'Space Energy Storage Power Station Relation Not Found',
'API.SPACE_EQUIPMENT_RELATION_EXISTS': 'Space equipment relation exists',
'API.SPACE_EQUIPMENT_RELATION_NOT_FOUND': 'Space equipment relation not found',
'API.SPACE_METER_RELATION_EXISTS': 'Space meter relation exists',
......@@ -6457,6 +6467,8 @@ const resources = {
'API.SPACE_COMBINED_EQUIPMENT_RELATION_NOT_FOUND': 'Space combined equipment relation not found',
'API.SPACE_COMMAND_RELATION_EXISTS': 'Space command relation exists',
'API.SPACE_COMMAND_RELATION_NOT_FOUND': 'Space command relation not found',
'API.SPACE_ENERGY_STORAGE_POWER_STATION_RELATION_EXISTS': 'Space Energy Storage Power Station Relation Exists',
'API.SPACE_ENERGY_STORAGE_POWER_STATION_RELATION_NOT_FOUND': 'Space Energy Storage Power Station Relation Not Found',
'API.SPACE_EQUIPMENT_RELATION_EXISTS': 'Space equipment relation exists',
'API.SPACE_EQUIPMENT_RELATION_NOT_FOUND': 'Space equipment relation not found',
'API.SPACE_METER_RELATION_EXISTS': 'Space meter relation exists',
......@@ -7548,6 +7560,8 @@ const resources = {
'API.SPACE_COMBINED_EQUIPMENT_RELATION_NOT_FOUND': 'Space combined equipment relation not found',
'API.SPACE_COMMAND_RELATION_EXISTS': 'Space command relation exists',
'API.SPACE_COMMAND_RELATION_NOT_FOUND': 'Space command relation not found',
'API.SPACE_ENERGY_STORAGE_POWER_STATION_RELATION_EXISTS': 'Space Energy Storage Power Station Relation Exists',
'API.SPACE_ENERGY_STORAGE_POWER_STATION_RELATION_NOT_FOUND': 'Space Energy Storage Power Station Relation Not Found',
'API.SPACE_EQUIPMENT_RELATION_EXISTS': 'Space equipment relation exists',
'API.SPACE_EQUIPMENT_RELATION_NOT_FOUND': 'Space equipment relation not found',
'API.SPACE_METER_RELATION_EXISTS': 'Space meter relation exists',
......@@ -8637,6 +8651,8 @@ const resources = {
'API.SPACE_COMBINED_EQUIPMENT_RELATION_NOT_FOUND': 'Space combined equipment relation not found',
'API.SPACE_COMMAND_RELATION_EXISTS': 'Space command relation exists',
'API.SPACE_COMMAND_RELATION_NOT_FOUND': 'Space command relation not found',
'API.SPACE_ENERGY_STORAGE_POWER_STATION_RELATION_EXISTS': 'Space Energy Storage Power Station Relation Exists',
'API.SPACE_ENERGY_STORAGE_POWER_STATION_RELATION_NOT_FOUND': 'Space Energy Storage Power Station Relation Not Found',
'API.SPACE_EQUIPMENT_RELATION_EXISTS': 'Space equipment relation exists',
'API.SPACE_EQUIPMENT_RELATION_NOT_FOUND': 'Space equipment relation not found',
'API.SPACE_METER_RELATION_EXISTS': 'Space meter relation exists',
......@@ -9725,6 +9741,8 @@ const resources = {
'API.SPACE_COMBINED_EQUIPMENT_RELATION_NOT_FOUND': 'Space combined equipment relation not found',
'API.SPACE_COMMAND_RELATION_EXISTS': 'Space command relation exists',
'API.SPACE_COMMAND_RELATION_NOT_FOUND': 'Space command relation not found',
'API.SPACE_ENERGY_STORAGE_POWER_STATION_RELATION_EXISTS': 'Space Energy Storage Power Station Relation Exists',
'API.SPACE_ENERGY_STORAGE_POWER_STATION_RELATION_NOT_FOUND': 'Space Energy Storage Power Station Relation Not Found',
'API.SPACE_EQUIPMENT_RELATION_EXISTS': 'Space equipment relation exists',
'API.SPACE_EQUIPMENT_RELATION_NOT_FOUND': 'Space equipment relation not found',
'API.SPACE_METER_RELATION_EXISTS': 'Space meter relation exists',
......@@ -10816,6 +10834,8 @@ const resources = {
'API.SPACE_COMBINED_EQUIPMENT_RELATION_NOT_FOUND': 'Space combined equipment relation not found',
'API.SPACE_COMMAND_RELATION_EXISTS': 'Space command relation exists',
'API.SPACE_COMMAND_RELATION_NOT_FOUND': 'Space command relation not found',
'API.SPACE_ENERGY_STORAGE_POWER_STATION_RELATION_EXISTS': 'Space Energy Storage Power Station Relation Exists',
'API.SPACE_ENERGY_STORAGE_POWER_STATION_RELATION_NOT_FOUND': 'Space Energy Storage Power Station Relation Not Found',
'API.SPACE_EQUIPMENT_RELATION_EXISTS': 'Space equipment relation exists',
'API.SPACE_EQUIPMENT_RELATION_NOT_FOUND': 'Space equipment relation not found',
'API.SPACE_METER_RELATION_EXISTS': 'Space meter relation exists',
......@@ -11911,6 +11931,8 @@ const resources = {
'API.SPACE_COMBINED_EQUIPMENT_RELATION_NOT_FOUND': 'Space combined equipment relation not found',
'API.SPACE_COMMAND_RELATION_EXISTS': 'Space command relation exists',
'API.SPACE_COMMAND_RELATION_NOT_FOUND': 'Space command relation not found',
'API.SPACE_ENERGY_STORAGE_POWER_STATION_RELATION_EXISTS': 'Space Energy Storage Power Station Relation Exists',
'API.SPACE_ENERGY_STORAGE_POWER_STATION_RELATION_NOT_FOUND': 'Space Energy Storage Power Station Relation Not Found',
'API.SPACE_EQUIPMENT_RELATION_EXISTS': 'Space equipment relation exists',
'API.SPACE_EQUIPMENT_RELATION_NOT_FOUND': 'Space equipment relation not found',
'API.SPACE_METER_RELATION_EXISTS': 'Space meter relation exists',
......@@ -13019,6 +13041,8 @@ const resources = {
'Hubungan antara ruang angkasa dan perangkat kombinasi tidak ada',
'API.SPACE_COMMAND_RELATION_EXISTS': 'Space command relation exists',
'API.SPACE_COMMAND_RELATION_NOT_FOUND': 'Space command relation not found',
'API.SPACE_ENERGY_STORAGE_POWER_STATION_RELATION_EXISTS': 'Space Energy Storage Power Station Relation Exists',
'API.SPACE_ENERGY_STORAGE_POWER_STATION_RELATION_NOT_FOUND': 'Space Energy Storage Power Station Relation Not Found',
'API.SPACE_EQUIPMENT_RELATION_EXISTS': 'Hubungan antara ruang dan perangkat sudah ada',
'API.SPACE_EQUIPMENT_RELATION_NOT_FOUND': 'Hubungan antara ruang dan peralatan tidak ada',
'API.SPACE_METER_RELATION_EXISTS': 'Hubungan antara ruang dan meter sudah ada',
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册