|
|
@@ -2,6 +2,14 @@
|
|
|
#include <QDebug>
|
|
|
#include <QDateTime>
|
|
|
#include <QRandomGenerator>
|
|
|
+#include <QJsonArray>
|
|
|
+#include <QJsonObject>
|
|
|
+#include <QJsonDocument>
|
|
|
+
|
|
|
+#include "../usr/config.h"
|
|
|
+#include "../usr/BluetoothClient.h"
|
|
|
+#include "InteractiveCAN.h"
|
|
|
+#include "../httpclient/WorkNodeFormModel.h"
|
|
|
|
|
|
ReturnKeyLockManager* ReturnKeyLockManager::m_instance = nullptr;
|
|
|
|
|
|
@@ -18,6 +26,11 @@ ReturnKeyLockManager::ReturnKeyLockManager(QObject* parent)
|
|
|
, m_confirmCountdown(20)
|
|
|
{
|
|
|
m_currentReadingStatus = "正在读取锁/钥匙状态......";
|
|
|
+
|
|
|
+ m_workDetail = new HttpGetWorkNodeDetail(this);
|
|
|
+ m_httpClient = new HttpClient(this);
|
|
|
+ connect(m_workDetail, &HttpGetWorkNodeDetail::signalGetRequestData, m_httpClient, &HttpClient::slotGetRequestData);
|
|
|
+ connect(m_httpClient, &HttpClient::signalResponseGetWorkNodeDetail, m_workDetail, &HttpGetWorkNodeDetail::slotHttpResponseGetWorkNodeDetail);
|
|
|
|
|
|
// 处理队列定时器
|
|
|
m_processTimer = new QTimer(this);
|
|
|
@@ -102,6 +115,8 @@ void ReturnKeyLockManager::onNfcDetected(const QString& nfcId, const QString& de
|
|
|
m_totalLocks++;
|
|
|
}
|
|
|
emit statisticsChanged();
|
|
|
+
|
|
|
+ setIsVisible(true);
|
|
|
|
|
|
// 显示页面(如果还没显示)
|
|
|
if (!m_isVisible) {
|
|
|
@@ -141,9 +156,12 @@ void ReturnKeyLockManager::onDeviceError(const QString& deviceType, int slotInde
|
|
|
}
|
|
|
m_nfcIdSet.insert(info.nfcId);
|
|
|
|
|
|
+ m_testDevices.append(info);
|
|
|
// 添加到异常列表
|
|
|
m_errorDevices.append(info);
|
|
|
m_deviceMap[info.nfcId] = info;
|
|
|
+
|
|
|
+ setIsVisible(true);
|
|
|
|
|
|
// 显示页面
|
|
|
if (!m_isVisible) {
|
|
|
@@ -170,7 +188,6 @@ void ReturnKeyLockManager::onApiResponse(const QString& nfcId, bool success, con
|
|
|
info.taskId = data.value("taskId", "").toString();
|
|
|
info.taskName = data.value("taskName", "").toString();
|
|
|
info.taskOrderNo = data.value("orderNo", "").toString();
|
|
|
- info.taskWorkshop = data.value("workshop", "").toString();
|
|
|
info.taskWorker = data.value("worker", "").toString();
|
|
|
info.hasTask = !info.taskId.isEmpty();
|
|
|
|
|
|
@@ -216,6 +233,39 @@ void ReturnKeyLockManager::onApiResponse(const QString& nfcId, bool success, con
|
|
|
emit dataUpdated();
|
|
|
}
|
|
|
|
|
|
+void ReturnKeyLockManager::slotReceivedJobTicket(const BLERWorkTicketResult &result)
|
|
|
+{
|
|
|
+ if (result.resultDoc.isNull() || result.resultDoc.isEmpty()) return;
|
|
|
+ QJsonObject root = result.resultDoc.object();
|
|
|
+
|
|
|
+ if (!root.contains("data")) return;
|
|
|
+ QJsonArray dataList = root.value("data").toArray();
|
|
|
+ if (dataList.isEmpty()) return;
|
|
|
+
|
|
|
+ // 目前只考虑一把钥匙的情况
|
|
|
+ QJsonObject firstObj = dataList[0].toObject();
|
|
|
+ if (!firstObj.contains("taskCode")) return;
|
|
|
+
|
|
|
+ m_currTask.taskCode = firstObj.value("taskCode").toString();
|
|
|
+ if (!root.contains("lockList")) return;
|
|
|
+ QJsonArray lockList = root.value("lockList").toArray();
|
|
|
+ if (lockList.isEmpty()) return;
|
|
|
+
|
|
|
+ for (int i = 0; i < lockList.count(); i++) {
|
|
|
+ QJsonObject itemObj = lockList[i].toObject();
|
|
|
+ if (itemObj.contains("rfid")) {
|
|
|
+ m_currTask.lockNfcs.append(itemObj.value("rfid").toString());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 根据nodeId获取任务详情
|
|
|
+ m_workDetail->setNodeId(m_currTask.taskCode);
|
|
|
+ m_workDetail->start();
|
|
|
+
|
|
|
+ InteractiveCAN::instance()->setTaskCode(m_currTask.taskCode.toInt());
|
|
|
+ InteractiveCAN::instance()->httpRequestGetWorkTicketByNodeId();
|
|
|
+}
|
|
|
+
|
|
|
void ReturnKeyLockManager::processNextInQueue()
|
|
|
{
|
|
|
QMutexLocker locker(&m_mutex);
|
|
|
@@ -233,22 +283,32 @@ void ReturnKeyLockManager::processNextInQueue()
|
|
|
m_currentReadingStatus = QString("正在读取%1状态...").arg(info.deviceType == "key" ? "钥匙" : "锁仓");
|
|
|
emit currentReadingStatusChanged();
|
|
|
|
|
|
- // TODO: 调用API查询设备状态
|
|
|
- // 这里需要发出信号,由HttpClient处理
|
|
|
- // emit signalQueryDeviceStatus(timestamp, url, jsonData, token);
|
|
|
+// // TODO: 调用API查询设备状态
|
|
|
+// // 这里需要发出信号,由HttpClient处理
|
|
|
+// // emit signalQueryDeviceStatus(timestamp, url, jsonData, token);
|
|
|
|
|
|
- // 临时:模拟API响应(实际使用时删除这段,改为真实API调用)
|
|
|
+// // 临时:模拟API响应(实际使用时删除这段,改为真实API调用)
|
|
|
QVariantMap mockData;
|
|
|
mockData["returnStatus"] = "success";
|
|
|
- mockData["statusMessage"] = "归还成功";
|
|
|
- mockData["taskId"] = QString("task_%1").arg(QRandomGenerator::global()->bounded(3));
|
|
|
- mockData["taskName"] = QString("作业任务%1").arg(QRandomGenerator::global()->bounded(3) + 1);
|
|
|
- mockData["orderNo"] = QString("WO-2024-%1").arg(QRandomGenerator::global()->bounded(100), 3, 10, QChar('0'));
|
|
|
- mockData["workshop"] = "车间A区";
|
|
|
- mockData["worker"] = "张工";
|
|
|
+ mockData["statusMessage"] = "";
|
|
|
+// mockData["taskId"] = QString("task_%1").arg(QRandomGenerator::global()->bounded(3));
|
|
|
+// mockData["taskName"] = QString("作业任务%1").arg(QRandomGenerator::global()->bounded(3) + 1);
|
|
|
+// mockData["orderNo"] = QString("WO-2024-%1").arg(QRandomGenerator::global()->bounded(100), 3, 10, QChar('0'));
|
|
|
+ mockData["taskId"] = "";
|
|
|
+ mockData["taskName"] = "";
|
|
|
+ mockData["orderNo"] = "";
|
|
|
+ mockData["worker"] = "";
|
|
|
+
|
|
|
+ m_testDevices.append(info);
|
|
|
|
|
|
locker.unlock();
|
|
|
- onApiResponse(info.nfcId, true, mockData);
|
|
|
+ if (info.deviceType == "key") {
|
|
|
+ m_currTask.keyNfc = info.nfcId;
|
|
|
+ InteractiveCAN::instance()->connectBLEDevice(info.nfcId);
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ onApiResponse(info.nfcId, true, mockData);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
void ReturnKeyLockManager::confirmReturn()
|
|
|
@@ -261,9 +321,13 @@ void ReturnKeyLockManager::confirmReturn()
|
|
|
void ReturnKeyLockManager::retrieveFailedDevices()
|
|
|
{
|
|
|
qDebug() << "[ReturnKeyLockManager] 取出归还失败的设备";
|
|
|
+ InteractiveCAN::instance()->updateKeyAndLockStatus(true);
|
|
|
|
|
|
- // TODO: 发出信号通知CAN解锁失败的设备
|
|
|
- // 这里需要遍历失败的设备,调用CAN解锁
|
|
|
+// for (auto iter = m_errorDevices.begin(); iter != m_errorDevices.end(); ++iter) {
|
|
|
+ for (auto iter = m_testDevices.begin(); iter != m_testDevices.end(); ++iter) {
|
|
|
+ qDebug() << iter->nfcId;
|
|
|
+ InteractiveCAN::instance()->unlockDevices(iter->nfcId, iter->deviceType);
|
|
|
+ }
|
|
|
|
|
|
// 重置倒计时
|
|
|
m_confirmCountdown = 20;
|
|
|
@@ -291,6 +355,7 @@ void ReturnKeyLockManager::closePage()
|
|
|
|
|
|
m_isProcessing = false;
|
|
|
m_currentReadingStatus = "正在读取锁/钥匙状态......";
|
|
|
+ InteractiveCAN::instance()->updateKeyAndLockStatus(false);
|
|
|
|
|
|
emit statisticsChanged();
|
|
|
emit isProcessingChanged();
|
|
|
@@ -301,7 +366,7 @@ void ReturnKeyLockManager::closePage()
|
|
|
|
|
|
QVariantList ReturnKeyLockManager::getTaskGroups()
|
|
|
{
|
|
|
- QMutexLocker locker(&m_mutex);
|
|
|
+// QMutexLocker locker(&m_mutex);
|
|
|
QVariantList result;
|
|
|
|
|
|
for (auto it = m_taskGroups.begin(); it != m_taskGroups.end(); ++it) {
|
|
|
@@ -312,7 +377,6 @@ QVariantList ReturnKeyLockManager::getTaskGroups()
|
|
|
const ReturnDeviceInfo& first = it.value().first();
|
|
|
group["taskName"] = first.taskName;
|
|
|
group["orderNo"] = first.taskOrderNo;
|
|
|
- group["workshop"] = first.taskWorkshop;
|
|
|
group["worker"] = first.taskWorker;
|
|
|
}
|
|
|
|
|
|
@@ -344,7 +408,7 @@ QVariantList ReturnKeyLockManager::getTaskGroups()
|
|
|
|
|
|
QVariantList ReturnKeyLockManager::getErrorDevices()
|
|
|
{
|
|
|
- QMutexLocker locker(&m_mutex);
|
|
|
+// QMutexLocker locker(&m_mutex);
|
|
|
QVariantList result;
|
|
|
|
|
|
for (const ReturnDeviceInfo& info : m_errorDevices) {
|
|
|
@@ -363,7 +427,7 @@ QVariantList ReturnKeyLockManager::getErrorDevices()
|
|
|
|
|
|
QVariantList ReturnKeyLockManager::getNoTaskDevices()
|
|
|
{
|
|
|
- QMutexLocker locker(&m_mutex);
|
|
|
+// QMutexLocker locker(&m_mutex);
|
|
|
QVariantList result;
|
|
|
|
|
|
for (const ReturnDeviceInfo& info : m_noTaskDevices) {
|
|
|
@@ -394,6 +458,93 @@ void ReturnKeyLockManager::testTrigger(const QString& deviceType, int slotIndex)
|
|
|
onNfcDetected(testNfcId, deviceType, slotIndex);
|
|
|
}
|
|
|
|
|
|
+void ReturnKeyLockManager::slotGetJobTicketResult(int stat, const QJsonObject& dataObj)
|
|
|
+{
|
|
|
+ qDebug() << "[slotGetJobTicketResult] " << stat << dataObj;
|
|
|
+ if (!dataObj.contains("ticketStatus")) return;
|
|
|
+
|
|
|
+ int ticketStatus = dataObj.value("ticketStatus").toInt();
|
|
|
+
|
|
|
+ QMutexLocker locker(&m_mutex);
|
|
|
+
|
|
|
+ QString nfcId = m_currTask.keyNfc;
|
|
|
+
|
|
|
+ ReturnDeviceInfo& info = m_deviceMap[nfcId];
|
|
|
+
|
|
|
+ if (stat != 0){
|
|
|
+ info.status = "failed";
|
|
|
+ info.statusMessage = "获取信息失败";
|
|
|
+ info.hasTask = false;
|
|
|
+
|
|
|
+ if (info.deviceType == "key") {
|
|
|
+ m_failedKeys++;
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ m_failedLocks++;
|
|
|
+ }
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ // 0未开始 1待上锁 2进行中 3待解锁 4已解锁 5已结束 6已取消)
|
|
|
+ if (ticketStatus == 0 || ticketStatus == 5 || ticketStatus == 6) {
|
|
|
+ info.status = "success";
|
|
|
+ info.statusMessage = "归还成功";
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ info.status = "failed";
|
|
|
+ info.statusMessage = "作业任务未完成";
|
|
|
+ }
|
|
|
+
|
|
|
+ info.taskId = m_currTask.taskCode;
|
|
|
+ info.taskName = WorkNodeFormModel::instance()->formName();
|
|
|
+ info.taskOrderNo = WorkNodeFormModel::instance()->orderNo();
|
|
|
+ info.taskWorker = WorkNodeFormModel::instance()->workerName();
|
|
|
+ info.hasTask = !info.taskId.isEmpty();
|
|
|
+
|
|
|
+ // 更新统计
|
|
|
+ if (info.status == "success") {
|
|
|
+ if (info.deviceType == "key") {
|
|
|
+ m_successKeys++;
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ m_successLocks++;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ if (info.deviceType == "key") {
|
|
|
+ m_failedKeys++;
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ m_failedLocks++;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 分类到对应组
|
|
|
+ if (!info.hasTask) {
|
|
|
+ m_noTaskDevices.append(info);
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ if (!m_taskGroups.contains(info.taskId)) {
|
|
|
+ m_taskGroups[info.taskId] = QList<ReturnDeviceInfo>();
|
|
|
+ }
|
|
|
+ m_taskGroups[info.taskId].append(info);
|
|
|
+ for (int i = 0; i < m_currTask.lockNfcs.count(); i++) {
|
|
|
+ QString lockNfc = m_currTask.lockNfcs[i];
|
|
|
+ if (!m_deviceMap.contains(nfcId)) continue;
|
|
|
+ for (auto iter = m_noTaskDevices.begin(); iter != m_noTaskDevices.end(); ++iter) {
|
|
|
+ if ((*iter).nfcId == lockNfc) {
|
|
|
+ iter = m_noTaskDevices.erase(iter);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ emit statisticsChanged();
|
|
|
+ emit dataUpdated();
|
|
|
+}
|
|
|
+
|
|
|
void ReturnKeyLockManager::startConfirmCountdown()
|
|
|
{
|
|
|
m_confirmCountdown = 20;
|
|
|
@@ -425,3 +576,4 @@ QString ReturnKeyLockManager::getCurrentTimeString()
|
|
|
{
|
|
|
return QDateTime::currentDateTime().toString("hh:mm:ss");
|
|
|
}
|
|
|
+
|