diff --git a/car.cpp b/car.cpp index 4a33d00..9ddd668 100644 --- a/car.cpp +++ b/car.cpp @@ -221,6 +221,19 @@ QString Car::getFee() const if (m_status == waiting) return "0"; int elapsed = startTime.msecsTo(QTime::currentTime()); + switch (m_color) { + case Color::Pink: + elapsed *= 1; + break; + case Color::Red: + elapsed *= 2; + break; + case Color::Yellow: + elapsed *= 3; + break; + default: + break; + } return QString::number(elapsed / 1000); } @@ -308,7 +321,9 @@ void Car::setPlateNumber(const QString &number) { void Car::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event) { if(m_status==parking&&event->button()==Qt::LeftButton) - emit out(this,-1); + emit out(this, -1); + else if (m_status == waiting && event->button() == Qt::LeftButton) + emit back(this); event->accept(); } diff --git a/carlist.cpp b/carlist.cpp index 8fd74a3..45d7a8b 100644 --- a/carlist.cpp +++ b/carlist.cpp @@ -110,3 +110,12 @@ void Adapter::update() beginResetModel(); endResetModel(); } + +void sort(QList::iterator s, QList::iterator e, + std::function comp) +{ + Q_UNUSED(s); + Q_UNUSED(e); + Q_UNUSED(comp); + return ; +} diff --git a/carlist.h b/carlist.h index dedd445..8684264 100644 --- a/carlist.h +++ b/carlist.h @@ -8,6 +8,7 @@ #include #include #include "car.h" +#include namespace Ui { class CarList; @@ -49,4 +50,7 @@ private: Ui::CarList *ui; }; +void sort(QList::iterator s, QList::iterator e, + std::function comp); + #endif // CARLIST_H diff --git a/parkingLotManager.cpp b/parkingLotManager.cpp index ed45dd2..f197be8 100644 --- a/parkingLotManager.cpp +++ b/parkingLotManager.cpp @@ -188,6 +188,38 @@ QPair ParkingLotManager::search(const QString& plate) return qMakePair(QString("-1"), -1); } +bool comp2(const Car* c1, const Car* c2) { + return c1->getPlateNumber() < c2->getPlateNumber(); +} + +int comp(const QString& p1, const Car* c2) { + return strcmp(p1.toStdString().c_str(), c2->getPlateNumber().toStdString().c_str()); +} + +QPair ParkingLotManager::biSearch(const QString &plate) +{ + sort(m_all_cars.begin(), m_all_cars.end(), &comp2); + int left = 0, right = m_all_cars.size(), mid = m_all_cars.size() / 2; + while (left != right) { + int flag = comp(plate, m_all_cars.at(mid)); + if (flag == -1) { + right = mid; + } else if (flag == 1) { + left = mid; + } else if (flag == 0) { + Car* c = m_all_cars.at(mid); + if (c->getStatus() == Car::Status::parking || + c->getStatus() == Car::Status::moving) + return qMakePair(m_widgets.at(c->getTargetFloor())->getName(), + c->getNum()); + else if (c->getStatus() == Car::Status::waiting) + return qMakePair(QString("0"), 0); + } + mid = (right + left) / 2; + } + return qMakePair(QString("-1"), -1); +} + void ParkingLotManager::showMode(bool enable) { if (enable) @@ -284,7 +316,7 @@ void ParkingLotManager::requestIn(Car* car) void ParkingLotManager::leave(Car* car) { int l = car->getCurrentFloor(); - Log::i(QString("有车离开,当前共有%1个空车位").arg(m_pool.size())); + Log::i(QString("有车离开,已产生费用%1元,当前共有%2个空车位").arg(car->getFee()).arg(m_pool.size())); callIn(); car->hide(); m_all_cars.removeOne(car); diff --git a/parkingLotManager.h b/parkingLotManager.h index d1dfc8d..cbd09bb 100644 --- a/parkingLotManager.h +++ b/parkingLotManager.h @@ -36,6 +36,7 @@ public: bool checkSame(const QString& plate); QString getParkingLotName(int pos); QPair search(const QString& plate); + QPair biSearch(const QString& plate); void showMode(bool enable); public slots: