Files
2023-05-30 16:31:33 +02:00

266 lines
8.4 KiB
C++

#include "csearchdialog.h"
#include "ui_csearchdialog.h"
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
#include <QByteArray>
#include <QNetworkAccessManager>
#include <QUrl>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QEventLoop>
#include <QSettings>
cSearchDialog::cSearchDialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::cSearchDialog),
m_resultListItemModel(nullptr)
{
ui->setupUi(this);
m_resultListItemModel = new QStandardItemModel(ui->m_resultList);
ui->m_resultList->setModel(m_resultListItemModel);
connect(ui->m_search, &QPushButton::clicked, this, &cSearchDialog::searchClicked);
}
cSearchDialog::~cSearchDialog()
{
delete ui;
}
void cSearchDialog::searchClicked()
{
QString searchText = ui->m_searchText->text();
bool keywordSearch = ui->m_searchByKeyword->isChecked();
if(searchText.isEmpty())
return;
m_resultListItemModel->clear();
QStringList header;
header << "MouserPartNumber" << "Manufacturer" << "ManufacturerPartNumber" << "description" << "Category";
m_resultListItemModel->setHorizontalHeaderLabels(header);
if(keywordSearch)
doSearchByKeyword(searchText);
else
doSearchByPartNumber(searchText);
}
bool cSearchDialog::doSearchByKeyword(const QString& keyword)
{
QSettings settings;
QJsonObject keywordRequest;
keywordRequest["keyword"] = keyword;
keywordRequest["records"] = 0;
keywordRequest["startingRecord"] = 0;
keywordRequest["searchOptions"] = "string";
keywordRequest["searchWithYourSignUpLanguage"] = "string";
QJsonObject obj;
obj["SearchByKeywordRequest"] = keywordRequest;
QJsonDocument doc(obj);
QByteArray data = doc.toJson(QJsonDocument::Compact);
if(!doSearch("/search/keyword", data))
return(false);
return(true);
}
bool cSearchDialog::doSearchByPartNumber(const QString& partNumber)
{
QSettings settings;
QJsonObject keywordRequest;
keywordRequest["mouserPartNumber"] = partNumber;
keywordRequest["searchOptions"] = "string";
QJsonObject obj;
obj["SearchByPartRequest"] = keywordRequest;
QJsonDocument doc(obj);
QByteArray data = doc.toJson(QJsonDocument::Compact);
if(!doSearch("/search/partnumber", data))
return(false);
return(true);
}
bool cSearchDialog::doSearch(const QString& function, const QByteArray& data)
{
QSettings settings;
QString requestUrl = QString(settings.value("plugins/importMouser/url", "").toString()) + "/v" + settings.value("plugins/importMouser/api_version", "").toString() + function + "?apiKey=" + settings.value("plugins/importMouser/api_key", "").toString();
QNetworkAccessManager* networkAccessManager = new QNetworkAccessManager(this);
const QUrl url(requestUrl);
QNetworkRequest request(url);
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
QNetworkReply* reply = networkAccessManager->post(request, data);
QEventLoop loop;
QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
loop.exec();
if(reply->error() == QNetworkReply::NoError)
{
QString strReply = (QString)reply->readAll();
QJsonDocument jsonResponse = QJsonDocument::fromJson(strReply.toUtf8());
QJsonObject jsonObj = jsonResponse.object();
QJsonObject searchResults = jsonObj["SearchResults"].toObject();
qint32 numberOfResults = searchResults["NumberOfResult"].toInt();
if(numberOfResults)
{
QJsonArray parts = searchResults["Parts"].toArray();
for(int z = 0;z < parts.count();z++)
{
QJsonObject part = parts[z].toObject();
QString availability = part["availability"].toString();
QString dataSheetUrl = part["DataSheetUrl"].toString();
QString description = part["Description"].toString();
QString factoryStock = part["FactoryStock"].toString();
QString imagePath = part["ImagePath"].toString();
QString category = part["Category"].toString();
QString leadTime = part["LeadTime"].toString();
QString lifecycleStatus = part["LifecycleStatus"].toString();
QString manufacturer = part["Manufacturer"].toString();
QString manufacturerPartNumber = part["ManufacturerPartNumber"].toString();
QString min = part["Min"].toString();
QString mult = part["Mult"].toString();
QString mouserPartNumber = part["MouserPartNumber"].toString();
QString productDetailUrl = part["ProductDetailUrl"].toString();
QString reeling = part["Reeling"].toString();
QString rohsStatus = part["ROHSStatus"].toString();
QString suggestedReplacement = part["SuggestedReplacement"].toString();
qint32 multiSimBlue = part["MultiSimBlue"].toInt();
QString isDiscontinued = part["IsDiscontinued"].toString();
QString rtm = part["RTM"].toString();
QString mouserProductCategory = part["MouserProductCategory"].toString();
QString ipcCode = part["IPCCode"].toString();
QString sField = part["SField"].toString();
QString vNum = part["VNum"].toString();
QString actualMfrName = part["ActualMfrName"].toString();
QString availableOnOrder = part["AvailableOnOrder"].toString();
QString availabilityInStock = part["AvailabilityInStock"].toString();
QString salesMaximumOrderQty = part["SalesMaximumOrderQty"].toString();
QString restrictionMessage = part["RestrictionMessage"].toString();
QString pid = part["PID"].toString();
QJsonArray ProductAttributes = part["ProductAttributes"].toArray();
QHash<QString, QString> productAttributes;
for(int x = 0;x < ProductAttributes.count();x++)
{
QJsonObject attribute = ProductAttributes[x].toObject();
productAttributes.insert(attribute["AttributeName"].toString(), attribute["AttributeValue"].toString());
}
QJsonArray AvailabilityOnOrder = part["AvailabilityOnOrder"].toArray();
QHash<QString, qint32> availabilityOnOrder;
for(int x = 0;x < AvailabilityOnOrder.count();x++)
{
QJsonObject availability = AvailabilityOnOrder[x].toObject();
availabilityOnOrder.insert(availability["Date"].toString(), availability["Quantity"].toInt());
}
QJsonArray ProductCompliance = part["ProductCompliance"].toArray();
QHash<QString, QString> productCompliance;
for(int x = 0;x < ProductCompliance.count();x++)
{
QJsonObject compliance = ProductCompliance[x].toObject();
productCompliance.insert(compliance["ComplianceName"].toString(), compliance["ComplianceValue"].toString());
}
/*
"PriceBreaks": [
{
"Quantity": 0,
"Price": "string",
"Currency": "string"
}
],
"AlternatePackagings": [
{
"APMfrPN": "string"
}
],
"UnitWeightKg": {
"UnitWeight": 0
},
"StandardCost": {
"Standardcost": 0
},
"InfoMessages": [
"string"
],
*/
QStandardItem* mouserPartNumberItem = new QStandardItem(mouserPartNumber);
QStandardItem* manufacturerItem = new QStandardItem(manufacturer);
QStandardItem* manufacturerPartNumberItem = new QStandardItem(manufacturerPartNumber);
QStandardItem* descriptionItem = new QStandardItem(description);
QStandardItem* categoryItem = new QStandardItem(category);
QIcon icon = iconFromUrl(imagePath);
if(!icon.isNull())
mouserPartNumberItem->setIcon(icon);
m_resultListItemModel->appendRow(QList<QStandardItem*>() << mouserPartNumberItem << manufacturerItem << manufacturerPartNumberItem << descriptionItem << categoryItem);
}
for(int i = 0;i < m_resultListItemModel->columnCount();i++)
ui->m_resultList->resizeColumnToContents(i);
}
delete reply;
}
else
{
qDebug() << reply->errorString();
delete reply;
}
delete networkAccessManager;
return(true);
}
QIcon cSearchDialog::iconFromUrl(const QString& iconURL)
{
QNetworkAccessManager* networkAccessManager = new QNetworkAccessManager(this);
const QUrl url(iconURL);
QNetworkRequest request(url);
QNetworkReply* reply = networkAccessManager->get(request);
QEventLoop loop;
QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
loop.exec();
if(reply->error() == QNetworkReply::NoError)
{
QByteArray data = reply->readAll();
QPixmap pixmap;
pixmap.loadFromData(data);
QIcon icon(pixmap);
return(icon);
}
return(QIcon());
}