FormTxDufaultProfile.cpp 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385
  1. #include "FormTxDufaultProfile.h"
  2. #include "ui_FormTxDufaultProfile.h"
  3. #include <QScroller>
  4. #include "Globals.h"
  5. #include "ConfigManager.h"
  6. #include "LanguageManager.h"
  7. #include "GeneralInterface.h"
  8. FormTxDufaultProfile::FormTxDufaultProfile(const int &userType, BaseWidget *parent)
  9. : BaseWidget(parent)
  10. , ui(new Ui::FormTxDufaultProfile)
  11. {
  12. ui->setupUi(this);
  13. setUserType(userType);
  14. initWidget();
  15. initConnect();
  16. }
  17. FormTxDufaultProfile::~FormTxDufaultProfile()
  18. {
  19. delete ui;
  20. }
  21. bool FormTxDufaultProfile::returnParent()
  22. {
  23. return updateData();
  24. }
  25. void FormTxDufaultProfile::initWidget()
  26. {
  27. initComboBox();
  28. initTableWidget();
  29. initListWidget();
  30. m_limit_dialog.reset(new DialogLimitEdit());
  31. m_limit_dialog->setParent(this);
  32. m_limit_dialog->setWindowFlags(Qt::Window | Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint);
  33. m_limit_dialog->setWindowModality(Qt::WindowModal);
  34. m_weekday_dialog.reset(new DialogWeekDayDetail());
  35. m_weekday_dialog->setParent(this);
  36. m_weekday_dialog->setWindowFlags(Qt::Window | Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint);
  37. m_weekday_dialog->setWindowModality(Qt::WindowModal);
  38. }
  39. void FormTxDufaultProfile::initConnect()
  40. {
  41. connect(LanguageManager::instance(), &LanguageManager::languageChanged, this, [this]() {
  42. ui->retranslateUi(this);
  43. });
  44. connect(GLOBALS, &Globals::ocppConfigKeyValueChanged, this, [this](const CONFIG_KEY_INFO& info) {
  45. if (info.SmartChargingProfile.ChargeProfileMaxStackLevel != ui->stackLevel->count()) {
  46. initStackLevelComboBox();
  47. ui->stackLevel->setCurrentText(QString::number(m_profile_info.stackLevel));
  48. }
  49. });
  50. connect(ui->chargingProfileKind, &CustomComboBox::currentIndexChanged, this, [this](const int& index) {
  51. switch (index) {
  52. case ChargingProfiles::Kind::ABSOLUTE_ID:
  53. case ChargingProfiles::Kind::RELATIVE_ID:
  54. ui->recurrencyKind->setCurrentIndex(ChargingProfiles::RecurrencyKind::NO_RECURRING_ID);
  55. ui->recurrencyKind->setEnabled(false);
  56. break;
  57. case ChargingProfiles::Kind::RECURRING_ID:
  58. ui->recurrencyKind->setEnabled(true);
  59. break;
  60. default:
  61. break;
  62. }
  63. });
  64. connect(ui->recurrencyKind, &CustomComboBox::currentIndexChanged, this, [this](const int& index) {
  65. switch (index) {
  66. case ChargingProfiles::RecurrencyKind::NO_RECURRING_ID:
  67. ui->stackedWidget->setCurrentWidget(ui->no_recyrrency);
  68. break;
  69. case ChargingProfiles::RecurrencyKind::DAILY_ID:
  70. ui->stackedWidget->setCurrentWidget(ui->daily);
  71. refreshDailyData();
  72. break;
  73. case ChargingProfiles::RecurrencyKind::WEEKLY_ID:
  74. ui->stackedWidget->setCurrentWidget(ui->weekly);
  75. refreshWeeklyData();
  76. break;
  77. default:
  78. break;
  79. }
  80. });
  81. connect(ui->chargingRateUnit, &CustomComboBox::currentIndexChanged, this, [this](const int& index) {
  82. switch (index) {
  83. case ChargingProfiles::UnitType::AMPERE_ID:
  84. ui->unit->setText(tr("A"));
  85. break;
  86. case ChargingProfiles::UnitType::WATT_ID:
  87. ui->unit->setText(tr("KW"));
  88. break;
  89. default:
  90. break;
  91. }
  92. });
  93. connect(ui->add_limit, &QPushButton::clicked, this, &FormTxDufaultProfile::addBtnClicked);
  94. connect(ui->delete_limit, &QPushButton::clicked, this, &FormTxDufaultProfile::deleteBtnClicked);
  95. connect(ui->dailyTablewidget, &QTableWidget::itemDoubleClicked, this, &FormTxDufaultProfile::dialyTableWidgetClicked);
  96. connect(ui->weeklyListwidget, &QListWidget::itemDoubleClicked, this, &FormTxDufaultProfile::weekdayTableWidgetDoubleClicked);
  97. connect(m_weekday_dialog.data(), &DialogWeekDayDetail::valueChanged, this, [this]() {
  98. setIsModify(true);
  99. });
  100. }
  101. void FormTxDufaultProfile::initComboBox()
  102. {
  103. QStringList kind_list;
  104. kind_list << ChargingProfiles::Kind::ABSOLUTE
  105. << ChargingProfiles::Kind::RELATIVE
  106. << ChargingProfiles::Kind::RECURRING;
  107. ui->chargingProfileKind->addItems(kind_list);
  108. QStringList recurrencyKindList;
  109. recurrencyKindList << ChargingProfiles::RecurrencyKind::NO_RECURRING
  110. << ChargingProfiles::RecurrencyKind::DAILY
  111. << ChargingProfiles::RecurrencyKind::WEEKLY;
  112. ui->recurrencyKind->addItems(recurrencyKindList);
  113. QStringList rateUnit;
  114. rateUnit << ChargingProfiles::UnitType::WATT
  115. << ChargingProfiles::UnitType::AMPERE;
  116. ui->chargingRateUnit->addItems(rateUnit);
  117. initStackLevelComboBox();
  118. }
  119. void FormTxDufaultProfile::initStackLevelComboBox()
  120. {
  121. ui->stackLevel->clear();
  122. auto maxStackLevel = ConfigManager::instance()->cfg_key().SmartChargingProfile.ChargeProfileMaxStackLevel;
  123. QStringList stackLevelList;
  124. for (int index = 0; index <= maxStackLevel; index ++) {
  125. stackLevelList.append(QString::number(index));
  126. }
  127. ui->stackLevel->addItems(stackLevelList);
  128. }
  129. void FormTxDufaultProfile::initTableWidget()
  130. {
  131. // ui->dailyTablewidget->horizontalHeader()->hide();
  132. ui->dailyTablewidget->verticalHeader()->hide();
  133. ui->dailyTablewidget->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
  134. ui->dailyTablewidget->setEditTriggers(QAbstractItemView::NoEditTriggers);
  135. ui->dailyTablewidget->setSelectionBehavior(QAbstractItemView::SelectRows);
  136. ui->dailyTablewidget->setSelectionMode(QAbstractItemView::SingleSelection);
  137. GeneralInterface::setTouchScroller(ui->dailyTablewidget);
  138. }
  139. void FormTxDufaultProfile::initListWidget()
  140. {
  141. }
  142. void FormTxDufaultProfile::refreshData()
  143. {
  144. refreshGeneralData();
  145. }
  146. void FormTxDufaultProfile::refreshGeneralData()
  147. {
  148. if (m_profile_info.chargingProfilePurpose != ui->chargingProfilePurpose->text()) return;
  149. ui->connectorID->setText(QString::number(m_profile_info.connectorId));
  150. ui->chargingProfileKind->setCurrentText(m_profile_info.chargingProfileKind);
  151. ui->recurrencyKind->setCurrentText(m_profile_info.recurrencyKind);
  152. ui->startTime->setDateTime(QDateTime::fromString(m_profile_info.chargingSchedule.startTime, Qt::ISODate));
  153. ui->stackLevel->setCurrentText(QString::number(m_profile_info.stackLevel));
  154. }
  155. void FormTxDufaultProfile::refreshDailyData()
  156. {
  157. ui->dailyTablewidget->clearContents();
  158. ui->dailyTablewidget->setRowCount(0);
  159. foreach (const auto& duration_info, m_profile_info.chargingSchedule.chargingSchedulePeriod) {
  160. QString limitStr = "";
  161. if (m_profile_info.chargingSchedule.chargingRateUnit == ChargingProfiles::UnitType::AMPERE) {
  162. limitStr = QString("%1 A").arg(QString::number(duration_info.limit / 1000.0, 'f', 2));
  163. } else if (m_profile_info.chargingSchedule.chargingRateUnit == ChargingProfiles::UnitType::WATT) {
  164. limitStr = QString("%1 KW").arg(QString::number(duration_info.limit / 1000.0, 'f', 2));
  165. }
  166. QString startPeriod = GeneralInterface::getCurrentDate(duration_info.startPeriod);
  167. appendRowTableWidget(startPeriod,
  168. m_profile_info.chargingSchedule.chargingRateUnit,
  169. limitStr);
  170. }
  171. }
  172. void FormTxDufaultProfile::refreshWeeklyData()
  173. {
  174. }
  175. void FormTxDufaultProfile::refreshDefaultData()
  176. {
  177. }
  178. void FormTxDufaultProfile::appendRowTableWidget(const QString &startTime, const QString &limitType, const QString &limit)
  179. {
  180. auto row = ui->dailyTablewidget->rowCount();
  181. ui->dailyTablewidget->insertRow(row);
  182. auto startTimeItem = new QTableWidgetItem(startTime);
  183. startTimeItem->setTextAlignment(Qt::AlignCenter);
  184. ui->dailyTablewidget->setItem(row, 0, startTimeItem);
  185. auto limitTypeItem = new QTableWidgetItem(limitType);
  186. limitTypeItem->setTextAlignment(Qt::AlignCenter);
  187. ui->dailyTablewidget->setItem(row, 1, limitTypeItem);
  188. auto limitItem = new QTableWidgetItem(limit);
  189. limitItem->setTextAlignment(Qt::AlignCenter);
  190. ui->dailyTablewidget->setItem(row, 2, limitItem);
  191. ui->dailyTablewidget->setRowHeight(row, 60);
  192. }
  193. bool FormTxDufaultProfile::updateData()
  194. {
  195. CHARGING_PROFILES profile_infos = ConfigManager::instance()->charging_profiles();
  196. for(int index = 0; index < profile_infos.chargingProfiles.size(); index ++) {
  197. if (profile_infos.chargingProfiles[index].chargingProfilePurpose == m_profile_info.chargingProfilePurpose &&
  198. profile_infos.chargingProfiles[index].chargingProfileId == m_profile_info.chargingProfileId) {
  199. profile_infos.chargingProfiles[index] = m_profile_info;
  200. }
  201. }
  202. return ConfigManager::instance()->saveConfig(CHARGING_PROFILE, QVariant::fromValue(profile_infos));
  203. }
  204. QList<charging_schedule_period_info_t> FormTxDufaultProfile::getDayOfWeekLimitList(const QList<charging_schedule_period_info_t> &dataList, const QString &startTime, const int &curDay)
  205. {
  206. QList<charging_schedule_period_info_t> result;
  207. foreach (const auto& data, std::as_const(dataList)) {
  208. if (isDayOfWeek(startTime, curDay, data.startPeriod)) {
  209. result.append(data);
  210. }
  211. }
  212. return result;
  213. }
  214. bool FormTxDufaultProfile::isDayOfWeek(const QString &startTime, const int &curDay, const int &seconds)
  215. {
  216. // 1. 解析开始时间
  217. QDateTime startDt = QDateTime::fromString(startTime, Qt::ISODate);
  218. startDt.setTimeSpec(Qt::UTC); // 若有Z,确保为UTC
  219. // 2. 计算目标时间
  220. QDateTime targetDt = startDt.addSecs(seconds);
  221. // 3. 判断目标时间是否为指定周几
  222. return targetDt.date().dayOfWeek() == curDay;
  223. }
  224. void FormTxDufaultProfile::updateWeekPeriodList(QList<charging_schedule_period_info_t> &dataList, const QList<charging_schedule_period_info_t> &newDataList, const QString &startTime, const int &curDay)
  225. {
  226. for(int row = dataList.size() - 1; row >= 0; --row) {
  227. if (isDayOfWeek(startTime, curDay, dataList[row].startPeriod)) {
  228. dataList.removeAt(row);
  229. }
  230. }
  231. dataList.append(newDataList);
  232. GeneralInterface::sortByStartPeriod(dataList);
  233. }
  234. int FormTxDufaultProfile::indexOfWeekPeriodList(const QList<charging_schedule_period_info_t> &dataList, const charging_schedule_period_info_t &data)
  235. {
  236. for (int index = 0; index < dataList.size(); index ++) {
  237. if (dataList[index].startPeriod == data.startPeriod) {
  238. return index;
  239. }
  240. }
  241. return -1;
  242. }
  243. void FormTxDufaultProfile::dialyTableWidgetClicked(QTableWidgetItem *item)
  244. {
  245. Limit limit_info;
  246. limit_info.startPeriod = m_profile_info.chargingSchedule.chargingSchedulePeriod[item->row()].startPeriod;
  247. limit_info.unit = m_profile_info.chargingSchedule.chargingRateUnit;
  248. limit_info.limit = m_profile_info.chargingSchedule.chargingSchedulePeriod[item->row()].limit;
  249. m_limit_dialog->setLimit_info(limit_info);
  250. auto ret = m_limit_dialog->exec();
  251. if (ret == QDialog::Accepted) {
  252. auto result = m_limit_dialog->limit_info();
  253. m_profile_info.chargingSchedule.chargingSchedulePeriod[item->row()].startPeriod = result.startPeriod;
  254. m_profile_info.chargingSchedule.chargingRateUnit = result.unit;
  255. m_profile_info.chargingSchedule.chargingSchedulePeriod[item->row()].limit = result.limit;
  256. m_profile_info.chargingSchedule.startTime = ui->startTime->dateTime().toString(Qt::ISODate);
  257. refreshDailyData();
  258. setIsModify(true);
  259. }
  260. }
  261. void FormTxDufaultProfile::weekdayTableWidgetDoubleClicked(QListWidgetItem *item)
  262. {
  263. GeneralInfo generalInfo;
  264. generalInfo.startTime = m_profile_info.chargingSchedule.startTime;
  265. generalInfo.curDay = ui->weeklyListwidget->row(item) + 1;
  266. generalInfo.chargingRateUnit = m_profile_info.chargingSchedule.chargingRateUnit;
  267. m_weekday_dialog->setGeneralInfo(generalInfo);
  268. auto dayOfWeekList = getDayOfWeekLimitList(m_profile_info.chargingSchedule.chargingSchedulePeriod, generalInfo.startTime, generalInfo.curDay);
  269. m_weekday_dialog->setInfo_list(dayOfWeekList);
  270. auto ret = m_weekday_dialog->exec();
  271. if (ret == QDialog::Accepted) {
  272. auto limitList = m_weekday_dialog->info_list();
  273. updateWeekPeriodList(m_profile_info.chargingSchedule.chargingSchedulePeriod, limitList, generalInfo.startTime, generalInfo.curDay);
  274. setIsModify(true);
  275. }
  276. }
  277. void FormTxDufaultProfile::addBtnClicked()
  278. {
  279. m_limit_dialog->clear();
  280. auto ret = m_limit_dialog->exec();
  281. if (ret == QDialog::Accepted) {
  282. auto result = m_limit_dialog->limit_info();
  283. charging_schedule_period_info_t info;
  284. info.startPeriod = result.startPeriod;
  285. info.limit = result.limit;
  286. m_profile_info.chargingSchedule.chargingSchedulePeriod.append(info);
  287. GeneralInterface::sortByStartPeriod(m_profile_info.chargingSchedule.chargingSchedulePeriod);
  288. refreshDailyData();
  289. setIsModify(true);
  290. }
  291. }
  292. void FormTxDufaultProfile::deleteBtnClicked()
  293. {
  294. auto row = ui->dailyTablewidget->currentRow();
  295. if (row < 0) return;
  296. if (row > m_profile_info.chargingSchedule.chargingSchedulePeriod.size()) return;
  297. m_profile_info.chargingSchedule.chargingSchedulePeriod.removeAt(row);
  298. refreshDailyData();
  299. setIsModify(true);
  300. }
  301. void FormTxDufaultProfile::showEvent(QShowEvent *event)
  302. {
  303. BaseWidget::showEvent(event);
  304. setIsModify(false);
  305. refreshData();
  306. }
  307. void FormTxDufaultProfile::hideEvent(QHideEvent *event)
  308. {
  309. BaseWidget::hideEvent(event);
  310. updateData();
  311. }
  312. charging_profiles_detail_info_t FormTxDufaultProfile::profile_info() const
  313. {
  314. return m_profile_info;
  315. }
  316. void FormTxDufaultProfile::setProfile_info(charging_profiles_detail_info_t newProfile_info)
  317. {
  318. m_profile_info = newProfile_info;
  319. }