#include "AppData.h" #include "common/Utils.h" #include "app/Station.h" #include "app/Device.h" #include "app/Policy.h" #include "database/Dao.h" #include "common/JsonN.h" #include "common/Utils.h" void ElectPeriod::parse(std::string jsonstr) { NJsonNode jsonroot; NJson::parse(jsonstr, jsonroot); NJson::read(jsonroot, "price_super_peak", this->priceSuperPeak); NJson::read(jsonroot, "price_peak", this->pricePeak); NJson::read(jsonroot, "price_shoulder", this->priceShoulder); NJson::read(jsonroot, "price_off_peak", this->priceOffPeak); NJson::read>>(jsonroot, "periods", this->vecPeriods); } std::string ElectPeriod::dump() { NJsonNode jsonroot; jsonroot["price_super_peak"] = this->priceSuperPeak; jsonroot["price_peak"] = this->pricePeak; jsonroot["price_shoulder"] = this->priceShoulder; jsonroot["price_off_peak"] = this->priceOffPeak; jsonroot["periods"] = this->vecPeriods; return jsonroot.dump(); } void AppData::initFromDB() { auto dao = DaoEntity::create(""); if (!dao->isConnected()) { XLOGE() << "Database connected error."; return; } std::string str; std::vector result; { // 数据库读取工作模式定义 str = "", result.clear(); DAO::queryWorkModeDef(dao, result); for (auto& fields: result) { int workModeId = fields.get(DMDefWorkMode::WORK_MODE_ID); std::string name = fields.value(DMDefWorkMode::NAME); this->mapping.workMode.push_back({std::to_string(workModeId), name}); this->mapWorkMode[workModeId] = name; str += ("工作模式: {" + std::to_string(workModeId)+":" + name + "},"); } XLOGD() << str; } { // 数据库读取策略类型定义 str = "", result.clear(); DAO::queryPolicyTypeDef(dao, result); for (auto& fields: result) { int policyTypeId = fields.get(DMDefPolicyType::POLICY_TYPE_ID); std::string name = fields.value(DMDefWorkMode::NAME); this->mapping.policyType.push_back({std::to_string(policyTypeId), name}); this->mapPolicyType[policyTypeId] = name; str += ("策略类型: {" + std::to_string(policyTypeId) + ":" + name + "},"); } XLOGD() << str; } { // 数据库读取设备类型定义 str = "", result.clear(); DAO::queryDeviceTypeDef(dao, result); for (auto& fields: result) { auto item = std::make_shared(); item->typeId = fields.get(DMDefDeviceType::DEVICE_TYPE_ID); item->name = fields.value(DMDefDeviceType::NAME); item->group = fields.value(DMDefDeviceType::GROUP); item->attr = fields.value(DMDefDeviceType::ATTRS); item->fieldsAttr.parseJson(item->attr); mapDeviceType[item->typeId] = item; mapping.deviceType.push_back({std::to_string(item->typeId), item->name}); str += ("设备类型: {" + std::to_string(item->typeId) + ":" + item->name + "},"); } XLOGD() << str; } { // 数据库读取角色定义 str = "", result.clear(); this->mapping.role.clear(); DAO::queryRoleList(dao, result); for (auto& fields : result) { auto item = std::make_shared(); item->roleId = fields.get(DMRole::ROLE_ID); item->name = fields.value(DMRole::NAME); item->isOpen = fields.get(DMRole::IS_OPEN); mapRole[item->roleId] = item; mapping.role.push_back({std::to_string(item->roleId), item->name}); str += ("角色: {" + std::to_string(item->roleId) + ":" + item->name + "},"); } XLOGD() << str; } { // 数据库读取场站信息 str = "", result.clear(); DAO::queryStationList(dao, result); for (auto& fields: result) { auto station = std::make_shared(); station->setFields(fields); this->mapStation[station->id] = station; mapping.stationName.push_back({std::to_string(station->id), station->name}); str += ("场站: {" + std::to_string(station->id) + ":" + station->name + "},"); } XLOGD() << str; } { // 数据库读取设备信息 str = "", result.clear(); DAO::queryDeviceList(dao, result); for (auto& fields: result) { int deviceId = fields.get(DMDevice::DEVICE_ID); int stationId = fields.get(DMDevice::STATION_ID); auto station = this->getStation(stationId); if (station) { auto device = Device::create(fields); auto deviceTypeDef = this->getDeviceTypeDef(device->type); device->group = deviceTypeDef->group; station->addDevice(deviceId, device); } else { XLOGE() << "init device error: unknown station_id:[" << stationId << "] device_id=" << deviceId; } } } { // 数据库读取策略信息 str = "", result.clear(); DAO::queryPolicyList(dao, result); for (auto& fields: result) { auto policy = std::make_shared(); policy->policyId = fields.get(DMPolicy::POLICY_ID); policy->type = fields.get(DMPolicy::TYPE); policy->name = fields.value(DMPolicy::NAME); policy->value = fields.value(DMPolicy::VALUE); this->mapPolicy[policy->policyId] = policy; } } { // 数据库读取电价分段信息 result.clear(); vecElectPeriods.resize(12); DAO::exec(dao, "SELECT * FROM configure;", result); Fields info; for (auto& fields: result) { auto k = fields.value("key"); auto v = fields.value("val"); info.set(k, v); } for (int month = 1; month<=12; month++) { if (month-1 < vecElectPeriods.size()) { auto& vecItems = vecElectPeriods[month-1]; std::string str = info.value("period_" + std::to_string(month)); std::vector vec; Utils::split(str, ",", vecItems); } } electPriceSuperPeak = info.get("price_super_peak"); electPricePeak = info.get("price_peak"); electPriceShoulder = info.get("price_shoulder"); electPriceOffPeak = info.get("price_off_peak"); } { // 数据库读取统计数据 vector result; std::string curDate = Utils::dateStr(); DAO::queryStatDataList(dao, curDate, curDate, result); for (auto& fields: result) { std::string dt = fields.value(DMStatStation::DT); int stationId = fields.get(DMStatStation::STATION_ID); auto station = this->getStation(stationId); if (station) { station->storageIn = fields.get(DMStatStation::STORAGE_ELECT_IN); station->storageOut = fields.get(DMStatStation::STORAGE_ELECT_OUT); //station->storageNumIn = fields.getFloat(DMStatStation::STORAGE_NUM); //station->storageNumOut = fields.getFloat(DMStatStation::STORAGE_NUM); station->storageNumErr = fields.get(DMStatStation::STORAGE_NUM_ERR); station->solarGen = fields.get(DMStatStation::SOLAR_ELECT_GEN); station->solarGrid = fields.get(DMStatStation::SOLAR_ELECT_GRID); station->solarNumErr = fields.get(DMStatStation::SOLAR_NUM_ERR); station->chargeElect = fields.get(DMStatStation::CHARGE_ELECT); station->chargeNum = fields.get(DMStatStation::CHARGE_NUM); station->chargeNumErr = fields.get(DMStatStation::CHARGE_NUM_ERR); } else { XLOGE() << "init staticis data error: unknown station_id:[" << stationId << "] dt=" << dt; } } } } void AppData::init() { this->initFromDB(); this->initUser(); } std::shared_ptr AppData::getStation(int stationId) { auto iter = mapStation.find(stationId); if (iter!=mapStation.end()) { return iter->second; } return nullptr; } std::shared_ptr AppData::getStationByName(std::string name) { for (auto iter = mapStation.begin(); iter!=mapStation.end(); ++iter) { if (iter->second->name == name) { return iter->second; } } return nullptr; } std::shared_ptr AppData::getDevice(int stationId, int deviceId) { auto station = getStation(stationId); if (station) { return station->getDevice(deviceId); } return nullptr; } std::string AppData::getDeviceNameById(int typeId) { auto iter = mapDeviceType.find(typeId); if (iter != mapDeviceType.end()) { return iter->second->name; } return ""; } std::shared_ptr AppData::getDeviceTypeDef(int typeId) { auto iter = mapDeviceType.find(typeId); if (iter != mapDeviceType.end()) { return iter->second; } return nullptr; } void AppData::loadStatData() { } void AppData::initUser() { auto dao = DaoEntity::create(""); std::vector result; } int AppData::getWorkModeIdByName(std::string name) { for (auto iter = mapWorkMode.begin(); iter!=mapWorkMode.end(); ++iter) { if (iter->second == name) { return iter->first; } } return 0; } std::vector AppData::getRoleNames() { std::vector vec(mapRole.size()); int i = 0; for (auto iter = mapRole.begin(); iter!=mapRole.end(); ++iter) { vec[i] = iter->second->name; ++i; } return vec; } std::vector AppData::getStationNames() { std::vector vec(mapStation.size()); int i = 0; for (auto iter = mapStation.begin(); iter!=mapStation.end(); ++iter) { vec[i] = iter->second->name; ++i; } return vec; } std::vector AppData::getDeviceTypeNames() { std::vector vec(mapping.deviceType.size()); int i = 0; for (auto iter = mapping.deviceType.begin(); iter!=mapping.deviceType.end(); ++iter) { vec[i] = iter->second; ++i; } return vec; } std::vector AppData::getWorkModes() { std::vector vec(mapWorkMode.size()); int i = 0; for (auto iter = mapWorkMode.begin(); iter!=mapWorkMode.end(); ++iter) { vec[i] = iter->second; ++i; } return vec; } std::vector AppData::getPolicyTypeNames() { std::vector vec(mapPolicyType.size()); int i = 0; for (auto iter = mapPolicyType.begin(); iter!=mapPolicyType.end(); ++iter) { vec[i] = iter->second; ++i; } return vec; } std::vector AppData::getPolicyNames() { std::vector vec; return vec; } int AppData::getPolicyTypeId(std::string name) { for (auto iter = mapPolicyType.begin(); iter != mapPolicyType.end(); ++iter) { if (iter->second == name) { return iter->first; } } return 0; } std::vector AppData::getElectPreiodVals(int month) { if (month > 0 && month-1 < vecElectPeriods.size()) { return vecElectPeriods[month-1]; } return {}; } std::string AppData::getElectPreiodVal(int month, int hour) { if (month > 0 && month-1 < vecElectPeriods.size()) { auto& vec = vecElectPeriods[month-1]; if (hour > 0 && hour-1 < vec.size()) { auto& val = vec[hour-1]; if (val == "尖") return "尖峰"; if (val == "峰") return "高峰"; if (val == "平") return "平段"; if (val == "谷") return "低谷"; return val; } } return ""; }