Browse Source

1. 修复解除隔离功能中部分Bug 2. 还锁功能

xj 3 tháng trước cách đây
mục cha
commit
7b7e29d9e7

+ 1 - 1
Loto.pro.user

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE QtCreatorProject>
-<!-- Written by QtCreator 4.14.2, 2026-01-22T09:05:32. -->
+<!-- Written by QtCreator 4.14.2, 2026-01-23T09:05:23. -->
 <qtcreator>
  <data>
   <variable>EnvironmentId</variable>

+ 9 - 0
src/httpclient/HttpClient.cpp

@@ -563,8 +563,17 @@ void HttpClient::slotPostRequestData(quint64 id, QString postUrl, QByteArray dat
             emit signalResponseUploadPositionInfo(bb);
         }
         else if (m_postUrl == Config()->updateUncolockUrl) {
+            emit signalResponseUpdateUncolock(bb);
+        }
+        else if (m_postUrl == Config()->updateColockUrl) {
+            emit signalResponseUpdateColock(bb);
+        }
+        else if (m_postUrl == Config()->updatePointUnlock) {
             emit signalResponseUpdatePointUnlock(bb);
         }
+        else if (m_postUrl == Config()->updateBackLock) {
+            emit signalResponseUpdateBackLock(bb);
+        }
     }
     else if(!this->m_httpFile.isNull())
     {

+ 3 - 0
src/httpclient/HttpClient.h

@@ -63,6 +63,9 @@ signals:
     void signalResponseUploadJobTicket(QByteArray res);
     void signalResponseUploadPositionInfo(QByteArray res);
     void signalResponseUpdatePointUnlock(QByteArray res);
+    void signalResponseUpdateColock(QByteArray res);
+    void signalResponseUpdateUncolock(QByteArray res);
+    void signalResponseUpdateBackLock(QByteArray res);
 public:
     static QString sToken;
 private:

+ 1 - 1
src/httpclient/HttpGetWorkNodeDetail.cpp

@@ -168,12 +168,12 @@ void HttpGetWorkNodeDetail::slotHttpResponseGetWorkNodeDetail(QByteArray data)
                     QString isolationPoints = vDataObj.value("isolationPoints").toString();
                     WorkNodeFormModel::instance()->setIsolationPoints(isolationPoints);
                 }
-
                 if (vDataObj.contains("nodeUserList") && vDataObj.value("nodeUserList").isArray()) {
                     WorkNodeFormModel::instance()->setNodeUserList(vDataObj.value("nodeUserList").toArray());
                 }
                 if (vDataObj.contains("points") && vDataObj.value("points").isArray()) {
                     WorkNodeFormModel::instance()->setPointsList(vDataObj.value("points").toArray());
+                    qDebug() << WorkNodeFormModel::instance()->pointsList();
                 }
 
                 // 页面分类:审核、录入信息

+ 125 - 16
src/interactive/InteractiveCAN.cpp

@@ -58,6 +58,7 @@ InteractiveCAN::InteractiveCAN()
     connect(this, &InteractiveCAN::signalPostRequestData, m_httpClient, &HttpClient::slotPostRequestData);
     connect(m_httpClient, &HttpClient::signalResponseUploadJobTicket, this, &InteractiveCAN::slotHttpResponseUploadJobTicket);
     connect(m_httpClient, &HttpClient::signalResponseUploadPositionInfo, this, &InteractiveCAN::slotHttpResponseUploadPositionInfo);
+    connect(m_httpClient, &HttpClient::signalResponseUpdateBackLock, this, &InteractiveCAN::slotHttpResponseUpdateBackLock);
 
     m_bleConnectTimer = new QTimer(this);
     connect(m_bleConnectTimer, &QTimer::timeout, this, &InteractiveCAN::slotSearchBLE);
@@ -65,9 +66,15 @@ InteractiveCAN::InteractiveCAN()
 
     connect(m_bleClient, &BLEClient::tokenReceived, this, [this](const BLEToken& token) {
         if (token.success && m_bleConnectTimer) {
+            if (m_startGetWorkTicketResultFlag) {
+                m_bleClient->startGetWorkTicketResult();
+            }
             m_okOpenKey = true;
             m_finishedFlags = false;    // 表示新的一轮开始了
+            m_startGetWorkTicketResultFlag = false;
+            m_okSendJobTicket = false;
             m_checkedFlags = true;
+            m_searchedBLE = false;
             m_bleConnectTimer->stop();
             if (WorkNodeFormModel::instance()->modelType() == QString("isolation")) {
                 createJobTicket();
@@ -115,17 +122,21 @@ void InteractiveCAN::createJobTicket()
 void InteractiveCAN::createColockJobTicket()
 {
     QJsonArray pointsList = WorkNodeFormModel::instance()->pointsList();
+    qDebug() << "[createColockJobTicket]: " << pointsList;
     if (pointsList.isEmpty()) return;
 
+    m_pointAndLockRfids.clear();
     m_lockRFIDs.clear();
 
     for (int i = 0; i < pointsList.count(); i++) {
         QJsonObject pointItem = pointsList[i].toObject();
 
-        if (pointItem.contains("lockNfc")) {
+        if (pointItem.contains("lockNfc") && pointItem.contains("pointNfc")) {
+            m_pointAndLockRfids.insert(pointItem.value("pointNfc").toString(), pointItem.value("lockNfc").toString());
             m_lockRFIDs.insert(i, pointItem.value("lockNfc").toString());
         }
     }
+    qDebug() << "[createColockJobTicket]: " << m_pointAndLockRfids;
     createJobTicket();
 }
 
@@ -158,6 +169,8 @@ void InteractiveCAN::httpRequestPostUploadJobTicket()
     jsonRoot.insert("keyNfcList", keyNfcListArray);
     jsonRoot.insert("lockNfcList", lockNfcListArray);
 
+    qDebug() << "[httpRequestPostUploadJobTicket]: " << url;
+
     QJsonDocument jsonDoc(jsonRoot);
     QByteArray jsonData = jsonDoc.toJson(QJsonDocument::Compact);
 
@@ -202,14 +215,18 @@ void InteractiveCAN::httpRequestPostUploadPositionInfo(const QJsonDocument &doc)
         }
     }
 
-//    QJsonObject jsonRoot;
+    QJsonObject jsonRoot;
     QDateTime currentDateTime = QDateTime::currentDateTime();
     qint64 timestampSeconds = currentDateTime.toMSecsSinceEpoch();
 
     QString url = Config()->uploadPositionInfoUrl;
-    qDebug() << "[httpRequestPostUploadPositionInfo]" << pointsInfo;
+    qDebug() << "[httpRequestPostUploadPositionInfo]" << pointsInfo << url;
+
+    jsonRoot.insert("keyNfc", m_keyNFC);
+    jsonRoot.insert("hardwareCode", Config()->m_systemMACAddr);
+    jsonRoot.insert("list", pointsInfo);
 
-    QJsonDocument jsonDoc(pointsInfo);
+    QJsonDocument jsonDoc(jsonRoot);
     QByteArray jsonData = jsonDoc.toJson(QJsonDocument::Compact);
 
     emit signalPostRequestData(timestampSeconds, url, jsonData, NULL, GetInteractiveData()->m_token);
@@ -221,6 +238,7 @@ void InteractiveCAN::httpRequestPostUpdatePointUnlock(const QJsonDocument &doc)
     QJsonObject rootObj = doc.object();
     if (!rootObj.contains("data"))  return;
 
+    QJsonObject jsonRoot;
     QJsonArray pointsInfo;
 
     int nodeId = WorkNodeFormModel::instance()->workId();
@@ -257,13 +275,42 @@ void InteractiveCAN::httpRequestPostUpdatePointUnlock(const QJsonDocument &doc)
     QDateTime currentDateTime = QDateTime::currentDateTime();
     qint64 timestampSeconds = currentDateTime.toMSecsSinceEpoch();
 
-    QString url = Config()->updateUncolockUrl;
+    QString url = Config()->updatePointUnlock;
 
+    jsonRoot.insert("keyNfc", m_keyNFC);
+    jsonRoot.insert("hardwareCode", Config()->m_systemMACAddr);
+    jsonRoot.insert("list", pointsInfo);
 
-    QJsonDocument jsonDoc(pointsInfo);
+    QJsonDocument jsonDoc(jsonRoot);
+    QByteArray jsonData = jsonDoc.toJson(QJsonDocument::Compact);
+    qDebug() << jsonDoc;
+
+    emit signalPostRequestData(timestampSeconds, url, jsonData, NULL, GetInteractiveData()->m_token);
+}
+
+void InteractiveCAN::httpRequestPostUpdateBackLock(const QList<QString> &lockNfcs)
+{
+    QJsonArray locksInfo;
+
+    int nodeId = WorkNodeFormModel::instance()->workId();
+
+    for (int i = 0; i < lockNfcs.count(); i++) {
+        QJsonObject infoItem;
+        infoItem.insert("nodeId", nodeId);
+        infoItem.insert("lockNfc", lockNfcs[i]);
+        infoItem.insert("hardwareCode", Config()->m_systemMACAddr);
+
+        locksInfo.append(infoItem);
+    }
+
+    QDateTime currentDateTime = QDateTime::currentDateTime();
+    qint64 timestampSeconds = currentDateTime.toMSecsSinceEpoch();
+
+    QString url = Config()->updateBackLock;
+
+    QJsonDocument jsonDoc(locksInfo);
     QByteArray jsonData = jsonDoc.toJson(QJsonDocument::Compact);
     qDebug() << jsonDoc;
-    qDebug() << pointsInfo;
 
     emit signalPostRequestData(timestampSeconds, url, jsonData, NULL, GetInteractiveData()->m_token);
 }
@@ -304,11 +351,22 @@ void InteractiveCAN::checkEKeyStatus()
 
 void InteractiveCAN::getJobTicketInfo(quint8 nodeId, bool isLeftKey)
 {
+    qDebug() << "[getJobTicketInfo]: " << m_checkedFlags;
     if (m_checkedFlags) {
         m_checkedFlags = false;
         m_canClient->lockingEKey(nodeId, isLeftKey, !isLeftKey);
 
-        m_bleClient->startGetWorkTicketResult();
+//        m_bleClient->startGetWorkTicketResult();
+        if (m_bleClient) {
+            qDebug() << "[getJobTicketInfo]: ss" << m_bleClient->isConnected();
+            if (m_bleClient->isConnected()) {
+                m_bleClient->startGetWorkTicketResult();
+            }
+            else {
+                m_startGetWorkTicketResultFlag = true;
+                m_bleClient->connectDevice(m_currentKeyMAC, "keyLock");
+            }
+        }
     }
 }
 
@@ -366,6 +424,7 @@ void InteractiveCAN::slotHttpResponseGetIsolationPointInfo(QByteArray data)
                 if (vDataObj.contains("pointNfc")) {
                     info.equipRfidNo = vDataObj.value("pointNfc").toString();
                 }
+
                 if (WorkNodeFormModel::instance()->modelType() == QString("isolation")) {
                     m_pointInfo.append(info);
                     if (m_pointInfo.length() == m_isolationPoints.length()) {
@@ -373,9 +432,11 @@ void InteractiveCAN::slotHttpResponseGetIsolationPointInfo(QByteArray data)
                     }
                 }
                 else {
-//                    info.target = 1;
+                    info.target = 1;
+                    if (m_pointAndLockRfids.find(info.equipRfidNo) != m_pointAndLockRfids.end()) {
+                        info.infoRfidNo = m_pointAndLockRfids[info.equipRfidNo];
+                    }
                      m_pointInfo.append(info);
-                     qDebug() << "[slotHttpResponseGetIsolationPointInfo]" << m_isolationPoints;
                      if (m_pointInfo.length() == m_isolationPoints.length()) {
                          if (m_okOpenKey) {
                              sendJobTicket();
@@ -404,6 +465,9 @@ void InteractiveCAN::slotHttpResponseUploadJobTicket(QByteArray data)
         int codeValue = rootObj.value("code").toInt();
         if(codeValue == 200 || codeValue == 0) {
 //            qDebug() << "[slotHttpResponseUploadJobTicket]" << jsonDoc;
+            if (m_bleClient) {
+//                m_bleClient->disconnectDevice();
+            }
         }
     }
 }
@@ -450,6 +514,27 @@ void InteractiveCAN::slotHttpResponseUpdatePointUnlock(QByteArray data)
     }
 }
 
+void InteractiveCAN::slotHttpResponseUpdateBackLock(QByteArray data)
+{
+    QJsonParseError error;
+    QJsonDocument jsonDoc = QJsonDocument::fromJson(data, &error);
+    if (error.error != QJsonParseError::NoError) {
+        return;
+    }
+    qDebug() << "[slotHttpResponseUpdateBackLock]" << jsonDoc;
+    if (jsonDoc.isNull() || jsonDoc.isEmpty()) {
+        return;
+    }
+    ;
+    QJsonObject rootObj = jsonDoc.object();
+    if(rootObj.contains("code")) {
+        int codeValue = rootObj.value("code").toInt();
+        if(codeValue == 200 || codeValue == 0) {
+            m_getLockedRfidFlag = false;
+        }
+    }
+}
+
 void InteractiveCAN::slotUpdateColockStatus(const QString& cardNfc)
 {
     // TODO: 更新共锁人状态
@@ -463,9 +548,11 @@ void InteractiveCAN::slotUpdateColockStatus(const QString& cardNfc)
     QString modelType = WorkNodeFormModel::instance()->modelType();
     if (modelType == QString("isolation")) {
         url = Config()->updateColockUrl;
-    } else if (modelType == QString("releaseIsolation")) {
+    }
+    else if (modelType == QString("releaseIsolation")) {
         url = Config()->updateUncolockUrl;
     }
+    qDebug() << "[slotUpdateColockStatus]: " << url << modelType;
 
     jsonRoot.insert("nodeId", m_taskCode);
     jsonRoot.insert("cardNfc", cardNfc);
@@ -569,7 +656,7 @@ void InteractiveCAN::getLockRFIDs(QMap<int, QString> &rfids)
             break;
         }
     }
-
+    qDebug() << m_lockRFIDs;
     if (m_okOpenKey) {
         sendJobTicket();
     }
@@ -577,6 +664,7 @@ void InteractiveCAN::getLockRFIDs(QMap<int, QString> &rfids)
 
 void InteractiveCAN::sendJobTicket()
 {
+    qDebug() << m_pointInfo.count() << m_lockRFIDs.count() << m_isolationPoints.count();
     if (m_pointInfo.count() != m_lockRFIDs.count() || m_lockRFIDs.count() != m_isolationPoints.count()) {
         return;
     }
@@ -589,6 +677,9 @@ void InteractiveCAN::sendJobTicket()
         pointItem.insert("equipName", iter->equipName);
         pointItem.insert("equipRfidNo", iter->equipRfidNo);
         pointItem.insert("target", iter->target);
+        if (iter->target > 0) {
+            pointItem.insert("infoRfidNo", iter->infoRfidNo);
+        }
         pointListArray.append(pointItem);
     }
 
@@ -654,18 +745,22 @@ void InteractiveCAN::slotUnlockEKey(const CANKeyBaseChargeStatus& status)
 {
     if (status.success) {
         if (m_okOpenKey) {
-            m_okUnlockKey = true;
-            if (!m_okSendJobTicket) {
+            QMutexLocker locker(&m_mutex);
+            if (!m_okUnlockKey) {
                 // 上传作业票信息
                 httpRequestPostUploadJobTicket();
+
+//                httpRequestPostInsertUnlockKey();
             }
+            m_okUnlockKey = true;
         }
     }
 }
 
-void InteractiveCAN::slotUnlockLocks(bool success)
+void InteractiveCAN::slotUnlockLocks(bool success, const QList<QString>& lockRfids)
 {
     if (success) {
+//        QMutexLocker locker(&m_mutex);
         if (m_okOpenKey) {
             m_okUnlockLocks = true;
             if (WorkNodeFormModel::instance()->modelType() == QString("isolation")) {
@@ -677,6 +772,15 @@ void InteractiveCAN::slotUnlockLocks(bool success)
                 });
             }
         }
+        if (WorkNodeFormModel::instance()->modelType() == QString("releaseIsolation")) {
+            if (!m_getLockedRfidFlag) {
+                m_getLockedRfidFlag = true;
+                qDebug() << "[slotUnlockLocks]: " << lockRfids;
+                httpRequestPostUpdateBackLock(lockRfids);
+
+                emit signalUpdateBackLockStatus(lockRfids);
+            }
+        }
     }
 }
 
@@ -693,7 +797,12 @@ void InteractiveCAN::slotSearchBLE()
 void InteractiveCAN::slotOkSearchedBLE(bool success)
 {
     if (success) {
-        m_bleClient->connectDevice(m_currentKeyMAC, "keyLock");
+        if (m_bleClient->isConnected()) {
+            createColockJobTicket();
+        }
+        else {
+            m_bleClient->connectDevice(m_currentKeyMAC, "keyLock");
+        }
     }
 }
 

+ 8 - 1
src/interactive/InteractiveCAN.h

@@ -11,6 +11,7 @@ typedef struct {
     int dataId;
     QString equipName;
     QString equipRfidNo;
+    QString infoRfidNo;
     int target = 0;
 } IsolationPointInfo;
 
@@ -79,7 +80,7 @@ public:
     Q_INVOKABLE void uploadColockInfo();
 public slots:
     void slotUnlockEKey(const CANKeyBaseChargeStatus& status);
-    void slotUnlockLocks(bool success);
+    void slotUnlockLocks(bool success, const QList<QString>& lockRfids);
     void slotSearchBLE();
     void slotOkSearchedBLE(bool success);
 
@@ -97,6 +98,7 @@ private:
     void httpRequestPostUploadJobTicket();
     void httpRequestPostUploadPositionInfo(const QJsonDocument& doc);
     void httpRequestPostUpdatePointUnlock(const QJsonDocument& doc);
+    void httpRequestPostUpdateBackLock(const QList<QString>& lockNfcs);
 public slots:
     void getJobTicketInfo(quint8 nodeId, bool isLeftKey);
 
@@ -108,6 +110,7 @@ public slots:
 
     void slotHttpResponseUploadPositionInfo(QByteArray data);
     void slotHttpResponseUpdatePointUnlock(QByteArray data);
+    void slotHttpResponseUpdateBackLock(QByteArray data);
 
     void slotUpdateColockStatus(const QString& cardNfc);
 signals:
@@ -134,6 +137,7 @@ signals:
     void signalUploadPositionInfoReturnStat(int stat, QString str);
 
     void signalUpdateColockStatus(const QString& cardNfc);
+    void signalUpdateBackLockStatus(const QList<QString>& lockNfc);
 private:
     QMutex m_mutex;
 
@@ -152,12 +156,15 @@ private:
     QList<int> m_isolationPoints;
     QList<IsolationPointInfo> m_pointInfo;
     QMap<int, QString> m_lockRFIDs;
+    QMap<QString, QString> m_pointAndLockRfids;
     QString m_cardNo;
     int m_taskCode;
 
     bool m_searchedBLE = false;
     bool m_checkedFlags = true;    // 标记是否检测到钥匙放回, 防止重复
     bool m_finishedFlags = false;   // 标记一轮取锁、取钥匙完成
+    bool m_startGetWorkTicketResultFlag = false;
+    bool m_getLockedRfidFlag = false;
 
     bool m_okOpenKey = false;
     bool m_okSendJobTicket = false;

+ 45 - 1
src/qml/components/JobTicketColockProcess.qml

@@ -21,6 +21,7 @@ Rectangle {
     property int lockStatusCardHeight: 226
 
     property string currentCardNfc: ""
+    property bool isReturnLock: false
 
     // 上锁
     property var lockModel: ListModel {
@@ -69,6 +70,10 @@ Rectangle {
                 lockStatus: "已共锁"
             });
         }
+        if (WorkNodeFormModel.modelType === "returnLock") {
+            control.isReturnLock = true;
+            tabBar.currentIndex = 2;
+        }
     }
 
     TabBar {
@@ -76,6 +81,8 @@ Rectangle {
         currentIndex: stackLayout.currentIndex
         width: parent.width
 
+        enabled: !control.isReturnLock
+
         background: Rectangle {
             anchors.fill: parent
             color: "transparent"
@@ -136,9 +143,27 @@ Rectangle {
         currentIndex: tabBar.currentIndex
 
         Rectangle {
+            id: __firstPage
             width: stackLayout.width
             height: stackLayout.height
             color: "transparent"
+            focus: true
+
+            Timer {
+                id: __firstPageTimer
+                interval: 50
+                running: true
+                repeat: false
+                onTriggered: {
+                    // 调整焦点设置的时序
+                    __firstPage.forceActiveFocus()
+//                    console.log("初始化焦点:", __firstPage.activeFocus)
+                }
+            }
+
+            Component.onCompleted: {
+                __firstPageTimer.start();
+            }
 
             MButton {
                 id: __colockTips
@@ -316,6 +341,7 @@ Rectangle {
 
                     onClicked: {
 //                        appShowHome = true;
+                        stackLayout.currentIndex = 1;
                     }
                 }
             }
@@ -324,6 +350,7 @@ Rectangle {
             width: stackLayout.width
             height: stackLayout.height
             color: "transparent"
+
             MButton {
                 id: __startJobProcessBtn
                 x: 422
@@ -644,6 +671,8 @@ Rectangle {
                             let locked = false;
                             let status = dataList[j].status;
                             let lockStatusIcon = "\uf058";
+                            let lockNfcinfo = dataList[j].infoRfidNo;
+
                             if (status === 0) {
                                 lockStatus = "挂锁";
                                 locked = true;
@@ -662,13 +691,26 @@ Rectangle {
                                 lockStatus: lockStatus,
                                 lockStatusIcon: lockStatusIcon,
                                 name: name,
-                                locked: locked
+                                locked: locked,
+                                lockNfc: lockNfcinfo,
                             });
                         }
                     }
                 }
             }
         }
+        
+        function onSignalUpdateBackLockStatus(lockRfidList) {
+            for (var i = 0; i < control.lockModel.count; i++) {
+
+                for (var j = 0; j < lockRfidList.length; j++) {
+                    if (control.lockModel.get(i).lockNfc === lockRfidList[j]) {
+                        control.lockModel.get(i).lockStatus = "已还锁";
+                        break;
+                    }
+                }
+            }
+        }
     }
 
     function convertCardNfc(cardNfc) {
@@ -717,6 +759,8 @@ Rectangle {
                     console.log(hexCardNfc, control.colockModel.get(i).cardNfc.toUpperCase());
                     if (control.colockModel.get(i).cardNfc.toUpperCase() === hexCardNfc) {
                         control.colockModel.get(i).colocked   = false;
+                        control.colockModel.get(i).lockStatus = "解锁";
+                        control.colockModel.get(i).lockStatusIcon = "\uf09c";
                         InteractiveCAN.cardNo = control.jobTicketNo;
                         InteractiveCAN.taskCode = WorkNodeFormModel.workId;
                         InteractiveCAN.signalUpdateColockStatus(hexCardNfc);

+ 13 - 0
src/usr/BluetoothClient.cpp

@@ -362,10 +362,22 @@ void BLEClient::sendJobTicket(const QJsonDocument &doc)
 
 void BLEClient::startGetWorkTicketResult()
 {
+    msleep(50);
+    qDebug() << "[startGetWorkTicketResult]";
     getWorkTicketResult();
     msleep(50);
 }
 
+bool BLEClient::isConnected()
+{
+    if (m_leController) {
+        return m_leController->state() == QLowEnergyController::DiscoveredState;
+    }
+    else {
+        return false;
+    }
+}
+
 void BLEClient::run()
 {
     while (m_threadstatus) {
@@ -594,6 +606,7 @@ quint16 BLEClient::calculateCRC16(const QByteArray& data)
 void BLEClient::sendCmdWithRetry(const QByteArray& frame, const QString& cmdName, int retryCount)
 {
 //    QMutexLocker locker(&m_mutex);
+    qDebug() << "[sendCmdWithRetry]: " << !m_writeChar.isValid() << m_leController->state() << !m_targetService;
     if (!m_writeChar.isValid() || (m_leController && m_leController->state() != QLowEnergyController::DiscoveredState) || !m_targetService) {
         emit cmdSendResult(false, cmdName, "蓝牙未连接或写特征值/服务无效");
         return;

+ 2 - 0
src/usr/BluetoothClient.h

@@ -148,6 +148,8 @@ public:
 
     void sendJobTicket(const QJsonDocument& doc);
     void startGetWorkTicketResult();
+
+    bool isConnected();
 protected:
     void run() override;
 signals:

+ 13 - 2
src/usr/CANClient.cpp

@@ -798,7 +798,6 @@ void CANClient::readLockControlStatusAsync()
         else {
             qWarning() << "[Lock] 读取失败:无有效响应";
         }
-
         emit lockControlStatusRead(nodeId, status);
     });
 }
@@ -884,7 +883,19 @@ void CANClient::writeLockBuckleAsync(const CANLocksControl &status)
             return;
         }
         bool success = respFrame.isValid() && static_cast<uint8_t>(respFrame.payload()[0]) != CAN_SDO_READ_RECEIVE_BYTE_ERROR;
+        QList<QString> lockRfids;
         if (success) {
+            if (m_locksRFIDStatus.find(nodeId) != m_locksRFIDStatus.end()) {
+                msleep(500);
+                QMap<int, QString> lockRfidMap = m_locksRFIDStatus[nodeId].lockRFIDMap;
+                for (int i = 0 ; i < status.lockNums.length(); i++) {
+                    int lockNum = status.lockNums[i];
+                    if (lockRfidMap.find(lockNum) == lockRfidMap.end()) {
+                        continue;
+                    }
+                    lockRfids.append(lockRfidMap[lockNum]);
+                }
+            }
 //            for (int i = 0 ; i < status.lockNums.length(); i++) {
 //                qInfo() << "[Lock] " << status.lockNums[i] << "号锁扣:" << (status.lockLockedMap[status.lockNums[i]] ? "锁住" : "解锁");
 //            }
@@ -894,7 +905,7 @@ void CANClient::writeLockBuckleAsync(const CANLocksControl &status)
                 qWarning() << "[Lock] " << status.lockNums[i] << "号锁扣写入失败";
             }
         }
-        emit lockBuckleWritten(success);
+        emit lockBuckleWritten(success, lockRfids);
     });
 }
 

+ 1 - 1
src/usr/CANClient.h

@@ -179,7 +179,7 @@ signals:
     // 5路锁状态读取完成
     void lockStatusRead(quint8 nodeId, const CANLockControlStatus& lockHasKeyList);
     void lockControlStatusRead(quint8 nodeId, const CANLocksControl& status);
-    void lockBuckleWritten(bool success);
+    void lockBuckleWritten(bool success, const QList<QString>& lockNfc);
     // 锁扣控制完成
     void lockBuckleWrite(bool success, int lockNum, bool isLock);
     // 温湿度读取完成

+ 3 - 1
src/usr/config.h

@@ -105,7 +105,9 @@ public:
     QString uploadPositionInfoUrl = "/admin-api/isc/work-handle/updatePointLock";
 
     QString updateColockUrl = "/admin-api/isc/work-handle/updateUserLock";
-    QString updateUncolockUrl = "/admin-api/isc/work-handle/updatePointUnlock";
+    QString updateUncolockUrl = "/admin-api/isc/work-handle/updateUserUnlock";
+    QString updatePointUnlock = "/admin-api/isc/work-handle/updatePointUnlock";
+    QString updateBackLock = "/admin-api/isc/work-handle/updateBackLock";
 
     QString ip = "0.0.0.0";
     QString mask = "255.255.255.0";