From 03d1eef7c070f0bfcd1e1cb30fcd36696043f37f Mon Sep 17 00:00:00 2001 From: kambizzandi Date: Sat, 19 Nov 2022 15:11:52 +0330 Subject: [PATCH] line chart of mt completed --- Interfaces/AAA/Accounting_Defs.hpp | 6 +- ModuleHelpers/MT/Interfaces/intfMTCharts.cpp | 311 ++++++++++++++----- ModuleHelpers/MT/Interfaces/intfMTCharts.h | 14 +- Modules/MT/functionalTest/testMT.hpp | 35 ++- 4 files changed, 276 insertions(+), 90 deletions(-) diff --git a/Interfaces/AAA/Accounting_Defs.hpp b/Interfaces/AAA/Accounting_Defs.hpp index acb247a5..ff98cffa 100644 --- a/Interfaces/AAA/Accounting_Defs.hpp +++ b/Interfaces/AAA/Accounting_Defs.hpp @@ -825,7 +825,7 @@ namespace tblAccountUserAssetsFilesBase { namespace tblAccountAssetUsageBase { namespace Relation { -// constexpr char AAA[] = "aaa"; + constexpr char UserAsset[] = "userAsset"; } namespace Private { @@ -840,7 +840,9 @@ namespace tblAccountAssetUsageBase { inline const QList Relations(Q_DECL_UNUSED const QString& _schema) { return { //Col Reference Table ForeignCol Rename LeftJoin - { Fields::usg_uasID, R(_schema, tblAccountUserAssetsBase::Name), tblAccountUserAssetsBase::Fields::uasID}, + { Relation::UserAsset, + { Fields::usg_uasID, R(_schema, tblAccountUserAssetsBase::Name), tblAccountUserAssetsBase::Fields::uasID}, + }, }; }; diff --git a/ModuleHelpers/MT/Interfaces/intfMTCharts.cpp b/ModuleHelpers/MT/Interfaces/intfMTCharts.cpp index 8affe865..efe3b1f0 100644 --- a/ModuleHelpers/MT/Interfaces/intfMTCharts.cpp +++ b/ModuleHelpers/MT/Interfaces/intfMTCharts.cpp @@ -347,7 +347,7 @@ QVariant baseintfMTCharts::getSchema( }) }, }) }, { "endpoint", QVariantMap({ - { "url", "{{API_URL}}/MT/Charts/usageDataForProgressBar" }, + { "url", "{{API_URL}}/MT/Charts/remainedDataForProgressBar" }, { "params", QVariantMap({ { "apiToken", "{{API_TOKEN}}" }, { "key", _key }, @@ -366,7 +366,37 @@ QVariant baseintfMTCharts::getSchema( }) }, }) }, { "endpoint", QVariantMap({ - { "url", "{{API_URL}}/MT/Charts/usageDataForPieChart" }, + { "url", "{{API_URL}}/MT/Charts/remainedDataForPieChart" }, + { "params", QVariantMap({ + { "apiToken", "{{API_TOKEN}}" }, + { "key", _key }, + }) }, + }) }, + }; + + QVariantMap CreditUsageLineCharts = { + { "title", I18N->translated(APICALLBOOM_PARAM, "Credits usages") }, + { "type", "2d" }, + { "axis", QVariantMap({ + { "x", QVariantMap({ + { "label", I18N->translated(APICALLBOOM_PARAM, "Date/Time") }, + { "type", "date" }, + }) }, + { "y", QVariantMap({ + { "label", I18N->translated(APICALLBOOM_PARAM, "Words") }, + { "type", "int" }, + }) }, + }) }, + { "charts", QVariantMap({ + { "%%ITERATION%%", QVariantMap({ + { "type", "{{TYPE}}" }, + { "name", "{{NAME}}" }, + { "title", "{{TITLE}}" }, + { "points", "{{POINTS}}" }, + }) }, + }) }, + { "endpoint", QVariantMap({ + { "url", "{{API_URL}}/MT/Charts/usageDataForLineChart" }, { "params", QVariantMap({ { "apiToken", "{{API_TOKEN}}" }, { "key", _key }, @@ -379,6 +409,7 @@ QVariant baseintfMTCharts::getSchema( { "charts", QVariantList({ RemainingCreditPercentageMultiProgress, RemainingCreditPercentagePieChart, + CreditUsageLineCharts, }) } }; @@ -401,7 +432,7 @@ QVariant baseintfMTCharts::getSchema( "max": "{{MAX}}", "value": "{{VALUE}}", "endpoint": { - "url" : "{{API_URL}}/MT/Charts/usageDataForProgressBar", + "url" : "{{API_URL}}/MT/Charts/remainedDataForProgressBar", "params" : [ "apiToken" : "{{API_TOKEN}}", "key" : "{{KEY}}", @@ -639,7 +670,7 @@ const sampleMultipProgressBar = [ */ //CreditUsageRemained_t, I18NMap -std::tuple> baseintfMTCharts::getUsageData( +std::tuple> baseintfMTCharts::getCreditData( INTFAPICALLBOOM_IMPL &APICALLBOOM_PARAM, quint64 _actorID, QString _key @@ -813,12 +844,12 @@ std::tuple> baseintfMTCharts::getU return { CreditUsageRemained, I18NMap }; } -QVariant baseintfMTCharts::usageDataForProgressBar( +QVariant baseintfMTCharts::remainedDataForProgressBar( INTFAPICALLBOOM_IMPL &APICALLBOOM_PARAM, quint64 _actorID, QString _key ) { - auto [CreditUsageRemained, I18NMap] = getUsageData( + auto [CreditUsageRemained, I18NMap] = getCreditData( APICALLBOOM_PARAM, _actorID, _key @@ -826,11 +857,11 @@ QVariant baseintfMTCharts::usageDataForProgressBar( QVariantList Result; - Targoman::API::ORM::intfI18N* I18N; - if (dynamic_cast*>(this->parentModule())) - I18N = dynamic_cast*>(this->parentModule())->i18n(); - else - I18N = dynamic_cast*>(this->parentModule())->i18n(); +// Targoman::API::ORM::intfI18N* I18N; +// if (dynamic_cast*>(this->parentModule())) +// I18N = dynamic_cast*>(this->parentModule())->i18n(); +// else +// I18N = dynamic_cast*>(this->parentModule())->i18n(); for (auto it = CreditUsageRemained.constBegin(); it != CreditUsageRemained.constEnd(); @@ -891,12 +922,12 @@ QVariant baseintfMTCharts::usageDataForProgressBar( return Result; } -QVariant baseintfMTCharts::usageDataForPieChart( +QVariant baseintfMTCharts::remainedDataForPieChart( INTFAPICALLBOOM_IMPL &APICALLBOOM_PARAM, quint64 _actorID, QString _key ) { - auto [CreditUsageRemained, I18NMap] = getUsageData( + auto [CreditUsageRemained, I18NMap] = getCreditData( APICALLBOOM_PARAM, _actorID, _key @@ -908,37 +939,6 @@ QVariant baseintfMTCharts::usageDataForPieChart( it != CreditUsageRemained.constEnd(); ++it ) { -// QString Title = it.key().split("::").join(" - "); -// if (I18NMap.contains(it.key())) -// Title = I18NMap[it.key()]; -// else { -// auto KeyParts = it.key().split("::"); -// QStringList TitleParts; - -// if (KeyParts.length() >= 1) { -// if (I18NMap.contains(KeyParts[0])) -// TitleParts.append(I18NMap[KeyParts[0]]); -// else -// TitleParts.append(KeyParts[0]); -// } - -// if (KeyParts.length() >= 2) { -// if (I18NMap.contains(KeyParts[1])) -// TitleParts.append(I18NMap[KeyParts[1]]); -// else -// TitleParts.append(KeyParts[1]); -// } - -// if (KeyParts.length() >= 3) { -// if (I18NMap.contains(KeyParts[2])) -// TitleParts.append(I18NMap[KeyParts[2]]); -// else -// TitleParts.append(KeyParts[2]); -// } - -// Title = TitleParts.join(" - "); -// } - quint32 Value; // if (it->Remained == -1) @@ -962,31 +962,188 @@ QVariant baseintfMTCharts::usageDataForLineChart( quint64 _actorID, QString _key ) { - return QVariantMap({ - { "type", "line" }, - { "series", QVariantMap({ - { "MT_FORMAL", QVariantMap({ - { "label", "رسمی" }, - { "props", {} }, - }) }, - { "MT_INFORMAL", QVariantMap({ - { "label", "محاوره" }, - { "props", {} }, - }) }, - }) }, - { "data", QVariantMap({ - { "MT_FORMAL", QVariantMap({ - { "2020-12-01", 12 }, - { "2020-12-02", 14 }, - { "2020-12-03", 15 }, - }) }, - { "MT_INFORMAL", QVariantMap({ - { "2020-12-01", 17 }, - { "2020-12-02", 47 }, - { "2020-12-04", 77 }, - }) }, - }) }, - }); + + baseintfAccountingBasedModule* ParentModule = dynamic_cast(this->parentModule()); + + //usages + //------------------------------------------------ + ORMSelectQuery SelectQuery = ParentModule->accountAssetUsage()->makeSelectQuery(APICALLBOOM_PARAM) + .addCols(ParentModule->accountAssetUsage()->selectableColumnNames()) + .innerJoinWith(tblAccountAssetUsageBase::Relation::UserAsset) + .where({ tblAccountUserAssetsBase::Fields::uas_actorID, + enuConditionOperator::Equal, + _actorID + }) + .andWhere(clsCondition({ tblAccountUserAssetsBase::Fields::uasValidFromDate, enuConditionOperator::Null }) + .orCond({ tblAccountUserAssetsBase::Fields::uasValidFromDate, enuConditionOperator::LessEqual, + DBExpression::NOW() }) + ) + .andWhere(clsCondition({ tblAccountUserAssetsBase::Fields::uasValidToDate, enuConditionOperator::Null }) + .orCond({ tblAccountUserAssetsBase::Fields::uasValidToDate, enuConditionOperator::GreaterEqual, + DBExpression::NOW() }) + ) + .andWhere({ tblAccountAssetUsageBase::Fields::usgResolution, + enuConditionOperator::Equal, + Targoman::API::AAA::enuAssetUsageResolution::Total + }) + ; + + TAPI::stuTable UsageTable = SelectQuery.pageSize(0).all(); + + //key: nmt::formal::en2fa + //value: date:value + QMap InnerResult; +// QMap> InnerResult; + + QStringList FullKeys; + QStringList Engines; + QStringList Classes; + QStringList Directions; + + foreach (QVariant Row, UsageTable.Rows) { + QVariantMap AssetUsageInfo = Row.toMap(); + + tblAccountAssetUsageMTBase::DTO AccountAssetUsageMTBaseDTO; + AccountAssetUsageMTBaseDTO.fromJson(QJsonObject::fromVariantMap(AssetUsageInfo)); + + QString UsageKey = AccountAssetUsageMTBaseDTO.usgKey.toLower(); + + //---------- + FullKeys.append(UsageKey); + auto Parts = UsageKey.split("::"); + if (Parts.length() >= 3) Directions.append(Parts[2]); + if (Parts.length() >= 2) Classes.append(Parts[1]); + if (Parts.length() >= 1) Engines.append(Parts[0]); + + //---------- + + if (InnerResult.contains(UsageKey)) { + InnerResult[UsageKey][AccountAssetUsageMTBaseDTO.usgLastDateTime.toString("yyyy-MM-dd hh:mm:ss")] + = AccountAssetUsageMTBaseDTO.usgUsedTotalWords; + } else { + InnerResult.insert(UsageKey, { { AccountAssetUsageMTBaseDTO.usgLastDateTime.toString("yyyy-MM-dd hh:mm:ss"), + AccountAssetUsageMTBaseDTO.usgUsedTotalWords + } }); + } + } + + // i18n + //-------------------------------- + Targoman::API::ORM::intfI18N* I18N; + if (dynamic_cast*>(this->parentModule())) + I18N = dynamic_cast*>(this->parentModule())->i18n(); + else + I18N = dynamic_cast*>(this->parentModule())->i18n(); + + auto I18NSelectQuery = I18N->makeSelectQuery(APICALLBOOM_PARAM) + .addCol(tblI18N::Fields::i18nKey) + .addCol(DBExpression::VALUE(QString("COALESCE(" + + LanguageHelper::getI18NClauseForCoalesce(APICALLBOOM_PARAM, tblI18N::Name, "", tblI18N::Fields::i18nValue) + "," + "JSON_UNQUOTE(JSON_EXTRACT(%1.%2, '$.default'))" + ")") + .arg(tblI18N::Name) + .arg(tblI18N::Fields::i18nValue) + ), + "Translated") + + .where({ tblI18N::Fields::i18nKey, + enuConditionOperator::In, + "'" + FullKeys.join("','") + "'" + }); + if (Engines.length()) + I18NSelectQuery.orWhere({ tblI18N::Fields::i18nKey, + enuConditionOperator::In, + "'" + Engines.join("','") + "'" + }); + if (Classes.length()) + I18NSelectQuery.orWhere({ tblI18N::Fields::i18nKey, + enuConditionOperator::In, + "'" + Classes.join("','") + "'" + }); + if (Directions.length()) + I18NSelectQuery.orWhere({ tblI18N::Fields::i18nKey, + enuConditionOperator::In, + "'" + Directions.join("','") + "'" + }); + + auto I18NRows = I18NSelectQuery + .pageSize(0) + .all(); + + QMap I18NMap; + + foreach (QVariant Row, I18NRows.Rows) { + QVariantMap Info = Row.toMap(); + + if (Info["Translated"].toString().isEmpty()) + continue; + + I18NMap.insert(Info[tblI18N::Fields::i18nKey].toString(), Info["Translated"].toString()); + } + + // output + //-------------------------------- + QVariantMap Result; + + for (auto it = InnerResult.constBegin(); + it != InnerResult.constEnd(); + it++ + ) { + //title + //-------------------------------- + QString Title = it.key().split("::").join(" - "); + if (I18NMap.contains(it.key())) + Title = I18NMap[it.key()]; + else { + auto KeyParts = it.key().split("::"); + QStringList TitleParts; + + if (KeyParts.length() >= 1) { + if (I18NMap.contains(KeyParts[0])) + TitleParts.append(I18NMap[KeyParts[0]]); + else + TitleParts.append(KeyParts[0]); + } + + if (KeyParts.length() >= 2) { + if (I18NMap.contains(KeyParts[1])) + TitleParts.append(I18NMap[KeyParts[1]]); + else + TitleParts.append(KeyParts[1]); + } + + if (KeyParts.length() >= 3) { + if (I18NMap.contains(KeyParts[2])) + TitleParts.append(I18NMap[KeyParts[2]]); + else + TitleParts.append(KeyParts[2]); + } + + Title = TitleParts.join(" - "); + } + + //-------------------------------- + QVariantList Points; + + for (auto vit = it.value().constBegin(); + vit != it.value().constEnd(); + vit++ + ) { + Points.append(QVariantMap({ + { "x", vit.key() }, + { "y", vit.value() }, + })); + } + + Result.insert(it.key(), QVariantMap({ + { "NAME", it.key() }, + { "TITLE", Title }, + { "TYPE", "line" }, + { "POINTS", Points }, + })); + } + + return Result; } //TAPI::stuTable baseintfMTCharts::charts( @@ -1140,7 +1297,7 @@ QVariant IMPL_REST_GET(baseintfMTCharts_USER, schema, ( return getSchema(APICALLBOOM_PARAM, _key); } -QVariant IMPL_REST_GET(baseintfMTCharts_USER, usageDataForProgressBar, ( +QVariant IMPL_REST_GET(baseintfMTCharts_USER, remainedDataForProgressBar, ( APICALLBOOM_TYPE_JWT_USER_IMPL &APICALLBOOM_PARAM, QString _key )) { @@ -1148,14 +1305,14 @@ QVariant IMPL_REST_GET(baseintfMTCharts_USER, usageDataForProgressBar, ( // bool CompactList = APICALLBOOM_PARAM.requestHeader("compact-list", false).toBool(); - return this->usageDataForProgressBar( + return this->remainedDataForProgressBar( APICALLBOOM_PARAM, CurrentActorID, _key ); } -QVariant IMPL_REST_GET(baseintfMTCharts_USER, usageDataForPieChart, ( +QVariant IMPL_REST_GET(baseintfMTCharts_USER, remainedDataForPieChart, ( APICALLBOOM_TYPE_JWT_USER_IMPL &APICALLBOOM_PARAM, QString _key )) { @@ -1163,7 +1320,7 @@ QVariant IMPL_REST_GET(baseintfMTCharts_USER, usageDataForPieChart, ( // bool CompactList = APICALLBOOM_PARAM.requestHeader("compact-list", false).toBool(); - return this->usageDataForPieChart( + return this->remainedDataForPieChart( APICALLBOOM_PARAM, CurrentActorID, _key @@ -1203,7 +1360,7 @@ QVariant IMPL_REST_GET(baseintfMTCharts_API, schema, ( return getSchema(APICALLBOOM_PARAM, _key); } -QVariant IMPL_REST_GET(baseintfMTCharts_API, usageDataForProgressBar, ( +QVariant IMPL_REST_GET(baseintfMTCharts_API, remainedDataForProgressBar, ( APICALLBOOM_TYPE_JWT_USER_IMPL &APICALLBOOM_PARAM, QString _apiToken, QString _key @@ -1212,14 +1369,14 @@ QVariant IMPL_REST_GET(baseintfMTCharts_API, usageDataForProgressBar, ( // bool CompactList = APICALLBOOM_PARAM.requestHeader("compact-list", false).toBool(); - return this->usageDataForProgressBar( + return this->remainedDataForProgressBar( APICALLBOOM_PARAM, CurrentActorID, _key ); } -QVariant IMPL_REST_GET(baseintfMTCharts_API, usageDataForPieChart, ( +QVariant IMPL_REST_GET(baseintfMTCharts_API, remainedDataForPieChart, ( APICALLBOOM_TYPE_JWT_USER_IMPL &APICALLBOOM_PARAM, QString _apiToken, QString _key @@ -1228,7 +1385,7 @@ QVariant IMPL_REST_GET(baseintfMTCharts_API, usageDataForPieChart, ( // bool CompactList = APICALLBOOM_PARAM.requestHeader("compact-list", false).toBool(); - return this->usageDataForPieChart( + return this->remainedDataForPieChart( APICALLBOOM_PARAM, CurrentActorID, _key diff --git a/ModuleHelpers/MT/Interfaces/intfMTCharts.h b/ModuleHelpers/MT/Interfaces/intfMTCharts.h index aa4443a7..7ac2fc8a 100644 --- a/ModuleHelpers/MT/Interfaces/intfMTCharts.h +++ b/ModuleHelpers/MT/Interfaces/intfMTCharts.h @@ -92,19 +92,19 @@ class baseintfMTCharts : public intfPureModule // virtual QStringList creditFieldNames() = 0; //CreditUsageRemained_t, I18NMap - std::tuple> getUsageData( + std::tuple> getCreditData( INTFAPICALLBOOM_DECL &APICALLBOOM_PARAM, quint64 _actorID, QString _key = {} ); - QVariant usageDataForProgressBar( + QVariant remainedDataForProgressBar( INTFAPICALLBOOM_DECL &APICALLBOOM_PARAM, quint64 _actorID, QString _key = {} ); - QVariant usageDataForPieChart( + QVariant remainedDataForPieChart( INTFAPICALLBOOM_DECL &APICALLBOOM_PARAM, quint64 _actorID, QString _key = {} @@ -144,7 +144,7 @@ protected slots: ); QVariant REST_GET( - usageDataForProgressBar, + remainedDataForProgressBar, ( APICALLBOOM_TYPE_JWT_USER_DECL &APICALLBOOM_PARAM, QString _key = {} @@ -153,7 +153,7 @@ protected slots: ); QVariant REST_GET( - usageDataForPieChart, + remainedDataForPieChart, ( APICALLBOOM_TYPE_JWT_USER_DECL &APICALLBOOM_PARAM, QString _key = {} @@ -198,7 +198,7 @@ protected slots: ); QVariant REST_GET( - usageDataForProgressBar, + remainedDataForProgressBar, ( APICALLBOOM_TYPE_JWT_USER_DECL &APICALLBOOM_PARAM, QString _apiToken, @@ -208,7 +208,7 @@ protected slots: ); QVariant REST_GET( - usageDataForPieChart, + remainedDataForPieChart, ( APICALLBOOM_TYPE_JWT_USER_DECL &APICALLBOOM_PARAM, QString _apiToken, diff --git a/Modules/MT/functionalTest/testMT.hpp b/Modules/MT/functionalTest/testMT.hpp index 187b0685..eb9ba1de 100644 --- a/Modules/MT/functionalTest/testMT.hpp +++ b/Modules/MT/functionalTest/testMT.hpp @@ -673,11 +673,11 @@ private slots: } } - void assetUsage_chart_usageDataForProgressBar() { + void assetUsage_chart_remainedDataForProgressBar() { QT_TRY { QVariant Result = callUserAPI( RESTClientHelper::GET, - "MT/Charts/usageDataForProgressBar", + "MT/Charts/remainedDataForProgressBar", { { "apiToken", this->TokenJWT }, // { "assetID", }, @@ -700,11 +700,38 @@ private slots: } } - void assetUsage_chart_usageDataForPieChart() { + void assetUsage_chart_remainedDataForPieChart() { QT_TRY { QVariant Result = callUserAPI( RESTClientHelper::GET, - "MT/Charts/usageDataForPieChart", + "MT/Charts/remainedDataForPieChart", + { + { "apiToken", this->TokenJWT }, +// { "assetID", }, +// { "step", 15 }, +// { "stepUnit", "Minute" }, + }, + {}, + {}, + { + "accept-language: fa-IR", + } + ); + + QJsonDocument Doc = QJsonDocument::fromVariant(QVariantMap({{ "result", Result }})); + qDebug().noquote() << endl + << " Result:" << Doc.toJson(); + + } QT_CATCH (const std::exception &exp) { + QTest::qFail(exp.what(), __FILE__, __LINE__); + } + } + + void assetUsage_chart_usageDataForLineChart() { + QT_TRY { + QVariant Result = callUserAPI( + RESTClientHelper::GET, + "MT/Charts/usageDataForLineChart", { { "apiToken", this->TokenJWT }, // { "assetID", },