3 Commits 57c229ea85 ... d7716ee046

Autor SHA1 Mensaje Fecha
  xj d7716ee046 解决合并冲突 hace 3 meses
  xj b49ede82a5 Merge branch 'dev_qt5' of http://192.168.0.253:3000/xj/ISCS_LOTO_Linux into dev_qt5 hace 3 meses
  xj 92045edf53 修复Bug: 隔离上锁时没有向后台下发/更新作业票的问题; hace 3 meses

+ 2 - 0
.gitignore

@@ -32,3 +32,5 @@ build/
 bin/
 .qtcreator/
 
+Makefile
+

+ 155 - 339
Loto.pro.user

@@ -1,20 +1,20 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE QtCreatorProject>
-<!-- Written by QtCreator 18.0.2, 2026-02-02T14:48:48. -->
+<!-- Written by QtCreator 4.14.2, 2026-02-04T14:40:22. -->
 <qtcreator>
  <data>
   <variable>EnvironmentId</variable>
-  <value type="QByteArray">{a5587603-485e-486a-a1a9-dc3454e0b3d3}</value>
+  <value type="QByteArray">{a22e3eca-8c48-4235-becd-e90a9241f53a}</value>
  </data>
  <data>
   <variable>ProjectExplorer.Project.ActiveTarget</variable>
-  <value type="qlonglong">0</value>
+  <value type="int">0</value>
  </data>
  <data>
   <variable>ProjectExplorer.Project.EditorSettings</variable>
   <valuemap type="QVariantMap">
-   <value type="bool" key="EditorConfiguration.AutoDetect">true</value>
    <value type="bool" key="EditorConfiguration.AutoIndent">true</value>
+   <value type="bool" key="EditorConfiguration.AutoSpacesForTabs">false</value>
    <value type="bool" key="EditorConfiguration.CamelCaseNavigation">true</value>
    <valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.0">
     <value type="QString" key="language">Cpp</value>
@@ -28,27 +28,23 @@
      <value type="QByteArray" key="CurrentPreferences">QmlJSGlobal</value>
     </valuemap>
    </valuemap>
-   <value type="qlonglong" key="EditorConfiguration.CodeStyle.Count">2</value>
+   <value type="int" key="EditorConfiguration.CodeStyle.Count">2</value>
    <value type="QByteArray" key="EditorConfiguration.Codec">UTF-8</value>
    <value type="bool" key="EditorConfiguration.ConstrainTooltips">false</value>
    <value type="int" key="EditorConfiguration.IndentSize">4</value>
    <value type="bool" key="EditorConfiguration.KeyboardTooltips">false</value>
-   <value type="int" key="EditorConfiguration.LineEndingBehavior">0</value>
    <value type="int" key="EditorConfiguration.MarginColumn">80</value>
    <value type="bool" key="EditorConfiguration.MouseHiding">true</value>
    <value type="bool" key="EditorConfiguration.MouseNavigation">true</value>
    <value type="int" key="EditorConfiguration.PaddingMode">1</value>
-   <value type="int" key="EditorConfiguration.PreferAfterWhitespaceComments">0</value>
-   <value type="bool" key="EditorConfiguration.PreferSingleLineComments">false</value>
    <value type="bool" key="EditorConfiguration.ScrollWheelZooming">true</value>
    <value type="bool" key="EditorConfiguration.ShowMargin">false</value>
-   <value type="int" key="EditorConfiguration.SmartBackspaceBehavior">2</value>
+   <value type="int" key="EditorConfiguration.SmartBackspaceBehavior">0</value>
    <value type="bool" key="EditorConfiguration.SmartSelectionChanging">true</value>
    <value type="bool" key="EditorConfiguration.SpacesForTabs">true</value>
    <value type="int" key="EditorConfiguration.TabKeyBehavior">0</value>
    <value type="int" key="EditorConfiguration.TabSize">8</value>
    <value type="bool" key="EditorConfiguration.UseGlobal">true</value>
-   <value type="bool" key="EditorConfiguration.UseIndenter">false</value>
    <value type="int" key="EditorConfiguration.Utf8BomBehavior">1</value>
    <value type="bool" key="EditorConfiguration.addFinalNewLine">true</value>
    <value type="bool" key="EditorConfiguration.cleanIndentation">true</value>
@@ -56,7 +52,6 @@
    <value type="QString" key="EditorConfiguration.ignoreFileTypes">*.md, *.MD, Makefile</value>
    <value type="bool" key="EditorConfiguration.inEntireDocument">false</value>
    <value type="bool" key="EditorConfiguration.skipTrailingWhitespace">true</value>
-   <value type="bool" key="EditorConfiguration.tintMarginArea">true</value>
   </valuemap>
  </data>
  <data>
@@ -64,50 +59,48 @@
   <valuemap type="QVariantMap">
    <valuemap type="QVariantMap" key="AutoTest.ActiveFrameworks">
     <value type="bool" key="AutoTest.Framework.Boost">true</value>
-    <value type="bool" key="AutoTest.Framework.CTest">false</value>
     <value type="bool" key="AutoTest.Framework.Catch">true</value>
     <value type="bool" key="AutoTest.Framework.GTest">true</value>
     <value type="bool" key="AutoTest.Framework.QtQuickTest">true</value>
     <value type="bool" key="AutoTest.Framework.QtTest">true</value>
    </valuemap>
-   <value type="bool" key="AutoTest.ApplyFilter">false</value>
    <valuemap type="QVariantMap" key="AutoTest.CheckStates"/>
-   <valuelist type="QVariantList" key="AutoTest.PathFilters"/>
    <value type="int" key="AutoTest.RunAfterBuild">0</value>
    <value type="bool" key="AutoTest.UseGlobal">true</value>
+   <valuelist type="QVariantList" key="ClangCodeModel.CustomCommandLineKey"/>
+   <value type="bool" key="ClangCodeModel.UseGlobalConfig">true</value>
+   <value type="QString" key="ClangCodeModel.WarningConfigId">Builtin.Questionable</value>
    <valuemap type="QVariantMap" key="ClangTools">
     <value type="bool" key="ClangTools.AnalyzeOpenFiles">true</value>
     <value type="bool" key="ClangTools.BuildBeforeAnalysis">true</value>
     <value type="QString" key="ClangTools.DiagnosticConfig">Builtin.DefaultTidyAndClazy</value>
-    <value type="int" key="ClangTools.ParallelJobs">8</value>
-    <value type="bool" key="ClangTools.PreferConfigFile">true</value>
+    <value type="int" key="ClangTools.ParallelJobs">4</value>
     <valuelist type="QVariantList" key="ClangTools.SelectedDirs"/>
     <valuelist type="QVariantList" key="ClangTools.SelectedFiles"/>
     <valuelist type="QVariantList" key="ClangTools.SuppressedDiagnostics"/>
     <value type="bool" key="ClangTools.UseGlobalSettings">true</value>
    </valuemap>
-   <value type="int" key="RcSync">0</value>
   </valuemap>
  </data>
  <data>
   <variable>ProjectExplorer.Project.Target.0</variable>
   <valuemap type="QVariantMap">
-   <value type="QString" key="DeviceType">Desktop</value>
-   <value type="bool" key="HasPerBcDcs">true</value>
-   <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Desktop Qt 5.15.2 GCC 64bit</value>
-   <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Desktop Qt 5.15.2 GCC 64bit</value>
-   <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">qt.qt5.5152.gcc_64_kit</value>
-   <value type="qlonglong" key="ProjectExplorer.Target.ActiveBuildConfiguration">0</value>
-   <value type="qlonglong" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
-   <value type="qlonglong" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value>
+   <value type="QString" key="DeviceType">GenericLinuxOsType</value>
+   <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">rk3568</value>
+   <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">rk3568</value>
+   <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">{4b7c7020-747d-4c4a-8e7b-c68e8d5127ef}</value>
+   <value type="int" key="ProjectExplorer.Target.ActiveBuildConfiguration">0</value>
+   <value type="int" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
+   <value type="int" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value>
    <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0">
     <value type="int" key="EnableQmlDebugging">0</value>
-    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/fffe/ISCS_LOTO_Linuxqt5/build/Desktop_Qt_5_15_2_GCC_64bit-Debug</value>
-    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir">/home/fffe/ISCS_LOTO_Linuxqt5/build/Desktop_Qt_5_15_2_GCC_64bit-Debug</value>
+    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/kim/Desktop/ISCS_LOTO_Linux/build-Loto-rk3568-Debug</value>
+    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir">/home/kim/Desktop/ISCS_LOTO_Linux/build-Loto-rk3568-Debug</value>
     <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
      <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
       <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
       <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
+      <value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value>
       <value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
       <valuelist type="QVariantList" key="QtProjectManager.QMakeBuildStep.SelectedAbis"/>
      </valuemap>
@@ -115,7 +108,7 @@
       <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
       <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
      </valuemap>
-     <value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
+     <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
@@ -126,7 +119,7 @@
       <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
       <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
      </valuemap>
-     <value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
+     <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Clean</value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
@@ -134,104 +127,20 @@
     <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
     <value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
     <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.CustomParsers"/>
-    <value type="bool" key="ProjectExplorer.BuildConfiguration.ParseStandardOutput">false</value>
     <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Debug</value>
     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
-    <value type="qlonglong" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
-    <value type="qlonglong" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value>
-    <valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0">
-     <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
-      <value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">0</value>
-      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deploy</value>
-      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Deploy</value>
-      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value>
-     </valuemap>
-     <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">1</value>
-     <valuemap type="QVariantMap" key="ProjectExplorer.DeployConfiguration.CustomData"/>
-     <value type="bool" key="ProjectExplorer.DeployConfiguration.CustomDataEnabled">false</value>
-     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.DefaultDeployConfiguration</value>
-    </valuemap>
-    <value type="qlonglong" key="ProjectExplorer.Target.DeployConfigurationCount">1</value>
-    <valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.0">
-     <value type="bool" key="Analyzer.Perf.Settings.UseGlobalSettings">true</value>
-     <value type="bool" key="Analyzer.QmlProfiler.Settings.UseGlobalSettings">true</value>
-     <value type="int" key="Analyzer.Valgrind.Callgrind.CostFormat">0</value>
-     <value type="bool" key="Analyzer.Valgrind.Settings.UseGlobalSettings">true</value>
-     <valuelist type="QVariantList" key="CustomOutputParsers"/>
-     <value type="int" key="PE.EnvironmentAspect.Base">2</value>
-     <valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
-     <value type="bool" key="PE.EnvironmentAspect.PrintOnRun">false</value>
-     <value type="QString" key="PerfRecordArgsId">-e cpu-cycles --call-graph dwarf,4096 -F 250</value>
-     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
-     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4RunConfiguration:</value>
-     <value type="QString" key="ProjectExplorer.RunConfiguration.BuildKey">/home/fffe/ISCS_LOTO_Linuxqt5/src/src.pro</value>
-     <value type="bool" key="ProjectExplorer.RunConfiguration.Customized">false</value>
-     <value type="QString" key="ProjectExplorer.RunConfiguration.UniqueId"></value>
-     <value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value>
-     <value type="bool" key="RunConfiguration.UseLibrarySearchPath">true</value>
-     <value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value>
-     <value type="QString" key="RunConfiguration.WorkingDirectory.default">%{RunConfig:Executable:Path}</value>
-    </valuemap>
-    <value type="qlonglong" key="ProjectExplorer.Target.RunConfigurationCount">1</value>
     <value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">2</value>
+    <value type="int" key="RunSystemFunction">0</value>
    </valuemap>
-   <value type="qlonglong" key="ProjectExplorer.Target.BuildConfigurationCount">1</value>
-   <valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0">
-    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
-     <value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">0</value>
-     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deploy</value>
-     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Deploy</value>
-     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value>
-    </valuemap>
-    <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">1</value>
-    <valuemap type="QVariantMap" key="ProjectExplorer.DeployConfiguration.CustomData"/>
-    <value type="bool" key="ProjectExplorer.DeployConfiguration.CustomDataEnabled">false</value>
-    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.DefaultDeployConfiguration</value>
-   </valuemap>
-   <value type="qlonglong" key="ProjectExplorer.Target.DeployConfigurationCount">1</value>
-   <valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.0">
-    <value type="bool" key="Analyzer.Perf.Settings.UseGlobalSettings">true</value>
-    <value type="bool" key="Analyzer.QmlProfiler.Settings.UseGlobalSettings">true</value>
-    <value type="int" key="Analyzer.Valgrind.Callgrind.CostFormat">0</value>
-    <value type="bool" key="Analyzer.Valgrind.Settings.UseGlobalSettings">true</value>
-    <valuelist type="QVariantList" key="CustomOutputParsers"/>
-    <value type="int" key="PE.EnvironmentAspect.Base">2</value>
-    <valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
-    <value type="bool" key="PE.EnvironmentAspect.PrintOnRun">false</value>
-    <value type="QString" key="PerfRecordArgsId">-e cpu-cycles --call-graph dwarf,4096 -F 250</value>
-    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
-    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4RunConfiguration:</value>
-    <value type="QString" key="ProjectExplorer.RunConfiguration.BuildKey">/home/fffe/ISCS_LOTO_Linuxqt5/src/src.pro</value>
-    <value type="bool" key="ProjectExplorer.RunConfiguration.Customized">false</value>
-    <value type="QString" key="ProjectExplorer.RunConfiguration.UniqueId"></value>
-    <value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value>
-    <value type="bool" key="RunConfiguration.UseLibrarySearchPath">true</value>
-    <value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value>
-    <value type="QString" key="RunConfiguration.WorkingDirectory.default">%{RunConfig:Executable:Path}</value>
-   </valuemap>
-   <value type="qlonglong" key="ProjectExplorer.Target.RunConfigurationCount">1</value>
-  </valuemap>
- </data>
- <data>
-  <variable>ProjectExplorer.Project.Target.1</variable>
-  <valuemap type="QVariantMap">
-   <value type="QString" key="DeviceType">GenericLinuxOsType</value>
-   <value type="bool" key="HasPerBcDcs">true</value>
-   <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">RK3568-Ubuntu20 (ARM64) </value>
-   <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">RK3568-Ubuntu20 (ARM64) </value>
-   <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">{81bcd52a-e6e1-4c24-bb5f-45ae50d5a4b9}</value>
-   <value type="qlonglong" key="ProjectExplorer.Target.ActiveBuildConfiguration">0</value>
-   <value type="qlonglong" key="ProjectExplorer.Target.ActiveDeployConfiguration">1</value>
-   <value type="qlonglong" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value>
-   <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0">
-    <value type="int" key="EnableQmlDebugging">0</value>
-    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/fffe/ISCS_LOTO_Linuxqt5/build/RK3568_Ubuntu20_ARM64-Debug</value>
-    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir">/home/fffe/ISCS_LOTO_Linuxqt5/build/RK3568_Ubuntu20_ARM64-Debug</value>
+   <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.1">
+    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/kim/Desktop/ISCS_LOTO_Linux/build-Loto-rk3568-Release</value>
+    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir">/home/kim/Desktop/ISCS_LOTO_Linux/build-Loto-rk3568-Release</value>
     <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
      <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
       <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
       <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
+      <value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value>
       <value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
       <valuelist type="QVariantList" key="QtProjectManager.QMakeBuildStep.SelectedAbis"/>
      </valuemap>
@@ -239,7 +148,7 @@
       <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
       <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
      </valuemap>
-     <value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
+     <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
@@ -250,7 +159,7 @@
       <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
       <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
      </valuemap>
-     <value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
+     <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Clean</value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
@@ -258,174 +167,22 @@
     <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
     <value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
     <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.CustomParsers"/>
-    <value type="bool" key="ProjectExplorer.BuildConfiguration.ParseStandardOutput">false</value>
     <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
-    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Debug</value>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Release</value>
     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
-    <value type="qlonglong" key="ProjectExplorer.Target.ActiveDeployConfiguration">1</value>
-    <value type="qlonglong" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value>
-    <valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0">
-     <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
-      <value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">0</value>
-      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deploy</value>
-      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Deploy</value>
-      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value>
-     </valuemap>
-     <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">1</value>
-     <valuemap type="QVariantMap" key="ProjectExplorer.DeployConfiguration.CustomData"/>
-     <value type="bool" key="ProjectExplorer.DeployConfiguration.CustomDataEnabled">false</value>
-     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.DefaultDeployConfiguration</value>
-    </valuemap>
-    <valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.1">
-     <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
-      <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
-       <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
-       <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">RemoteLinux.KillAppStep</value>
-       <valuelist type="QVariantList" key="ProjectExplorer.RunConfiguration.LastDeployedFiles"/>
-       <valuelist type="QVariantList" key="ProjectExplorer.RunConfiguration.LastDeployedHosts"/>
-       <valuelist type="QVariantList" key="ProjectExplorer.RunConfiguration.LastDeployedRemotePaths"/>
-       <valuelist type="QVariantList" key="ProjectExplorer.RunConfiguration.LastDeployedSysroots"/>
-       <valuelist type="QVariantList" key="RemoteLinux.LastDeployedLocalTimes"/>
-       <valuelist type="QVariantList" key="RemoteLinux.LastDeployedRemoteTimes"/>
-      </valuemap>
-      <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
-       <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
-       <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">RemoteLinux.RsyncDeployStep</value>
-       <valuelist type="QVariantList" key="ProjectExplorer.RunConfiguration.LastDeployedFiles"/>
-       <valuelist type="QVariantList" key="ProjectExplorer.RunConfiguration.LastDeployedHosts"/>
-       <valuelist type="QVariantList" key="ProjectExplorer.RunConfiguration.LastDeployedRemotePaths"/>
-       <valuelist type="QVariantList" key="ProjectExplorer.RunConfiguration.LastDeployedSysroots"/>
-       <valuelist type="QVariantList" key="RemoteLinux.LastDeployedLocalTimes"/>
-       <valuelist type="QVariantList" key="RemoteLinux.LastDeployedRemoteTimes"/>
-       <value type="QString" key="RemoteLinux.RsyncDeployStep.Flags">-rltv</value>
-      </valuemap>
-      <value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
-      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deploy</value>
-      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Deploy</value>
-      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value>
-     </valuemap>
-     <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">1</value>
-     <valuemap type="QVariantMap" key="ProjectExplorer.DeployConfiguration.CustomData"/>
-     <value type="bool" key="ProjectExplorer.DeployConfiguration.CustomDataEnabled">false</value>
-     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">DeployToGenericLinux</value>
-    </valuemap>
-    <value type="qlonglong" key="ProjectExplorer.Target.DeployConfigurationCount">2</value>
-    <valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.0">
-     <value type="bool" key="Analyzer.Perf.Settings.UseGlobalSettings">true</value>
-     <value type="bool" key="Analyzer.QmlProfiler.Settings.UseGlobalSettings">true</value>
-     <value type="int" key="Analyzer.Valgrind.Callgrind.CostFormat">0</value>
-     <value type="bool" key="Analyzer.Valgrind.Settings.UseGlobalSettings">true</value>
-     <valuelist type="QVariantList" key="CustomOutputParsers"/>
-     <value type="int" key="PE.EnvironmentAspect.Base">1</value>
-     <valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
-     <value type="bool" key="PE.EnvironmentAspect.PrintOnRun">false</value>
-     <value type="QString" key="PerfRecordArgsId">-e cpu-cycles --call-graph dwarf,4096 -F 250</value>
-     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">src (on %{Device:Name})</value>
-     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">RemoteLinuxRunConfiguration:</value>
-     <value type="QString" key="ProjectExplorer.RunConfiguration.BuildKey">/home/fffe/ISCS_LOTO_Linuxqt5/src/src.pro</value>
-     <value type="bool" key="ProjectExplorer.RunConfiguration.Customized">false</value>
-     <value type="QString" key="ProjectExplorer.RunConfiguration.UniqueId"></value>
-     <value type="int" key="RemoteLinux.EnvironmentAspect.Version">1</value>
-     <value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value>
-     <value type="bool" key="RunConfiguration.UseLibrarySearchPath">true</value>
-     <value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value>
-     <value type="QString" key="RunConfiguration.WorkingDirectory.default">%{RunConfig:Executable:Path}</value>
-     <value type="QString" key="RunConfiguration.X11Forwarding">:0</value>
-    </valuemap>
-    <value type="qlonglong" key="ProjectExplorer.Target.RunConfigurationCount">1</value>
-    <value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">2</value>
-   </valuemap>
-   <value type="qlonglong" key="ProjectExplorer.Target.BuildConfigurationCount">1</value>
-   <valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0">
-    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
-     <value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">0</value>
-     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deploy</value>
-     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Deploy</value>
-     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value>
-    </valuemap>
-    <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">1</value>
-    <valuemap type="QVariantMap" key="ProjectExplorer.DeployConfiguration.CustomData"/>
-    <value type="bool" key="ProjectExplorer.DeployConfiguration.CustomDataEnabled">false</value>
-    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.DefaultDeployConfiguration</value>
-   </valuemap>
-   <valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.1">
-    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
-     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
-      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
-      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">RemoteLinux.KillAppStep</value>
-      <valuelist type="QVariantList" key="ProjectExplorer.RunConfiguration.LastDeployedFiles"/>
-      <valuelist type="QVariantList" key="ProjectExplorer.RunConfiguration.LastDeployedHosts"/>
-      <valuelist type="QVariantList" key="ProjectExplorer.RunConfiguration.LastDeployedRemotePaths"/>
-      <valuelist type="QVariantList" key="ProjectExplorer.RunConfiguration.LastDeployedSysroots"/>
-      <valuelist type="QVariantList" key="RemoteLinux.LastDeployedLocalTimes"/>
-      <valuelist type="QVariantList" key="RemoteLinux.LastDeployedRemoteTimes"/>
-     </valuemap>
-     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
-      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
-      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">RemoteLinux.RsyncDeployStep</value>
-      <valuelist type="QVariantList" key="ProjectExplorer.RunConfiguration.LastDeployedFiles"/>
-      <valuelist type="QVariantList" key="ProjectExplorer.RunConfiguration.LastDeployedHosts"/>
-      <valuelist type="QVariantList" key="ProjectExplorer.RunConfiguration.LastDeployedRemotePaths"/>
-      <valuelist type="QVariantList" key="ProjectExplorer.RunConfiguration.LastDeployedSysroots"/>
-      <valuelist type="QVariantList" key="RemoteLinux.LastDeployedLocalTimes"/>
-      <valuelist type="QVariantList" key="RemoteLinux.LastDeployedRemoteTimes"/>
-      <value type="QString" key="RemoteLinux.RsyncDeployStep.Flags">-rltv</value>
-     </valuemap>
-     <value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
-     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deploy</value>
-     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Deploy</value>
-     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value>
-    </valuemap>
-    <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">1</value>
-    <valuemap type="QVariantMap" key="ProjectExplorer.DeployConfiguration.CustomData"/>
-    <value type="bool" key="ProjectExplorer.DeployConfiguration.CustomDataEnabled">false</value>
-    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">DeployToGenericLinux</value>
+    <value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">0</value>
+    <value type="int" key="QtQuickCompiler">0</value>
+    <value type="int" key="RunSystemFunction">0</value>
    </valuemap>
-   <value type="qlonglong" key="ProjectExplorer.Target.DeployConfigurationCount">2</value>
-   <valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.0">
-    <value type="bool" key="Analyzer.Perf.Settings.UseGlobalSettings">true</value>
-    <value type="bool" key="Analyzer.QmlProfiler.Settings.UseGlobalSettings">true</value>
-    <value type="int" key="Analyzer.Valgrind.Callgrind.CostFormat">0</value>
-    <value type="bool" key="Analyzer.Valgrind.Settings.UseGlobalSettings">true</value>
-    <valuelist type="QVariantList" key="CustomOutputParsers"/>
-    <value type="int" key="PE.EnvironmentAspect.Base">1</value>
-    <valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
-    <value type="bool" key="PE.EnvironmentAspect.PrintOnRun">false</value>
-    <value type="QString" key="PerfRecordArgsId">-e cpu-cycles --call-graph dwarf,4096 -F 250</value>
-    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">src (on %{Device:Name})</value>
-    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">RemoteLinuxRunConfiguration:</value>
-    <value type="QString" key="ProjectExplorer.RunConfiguration.BuildKey">/home/fffe/ISCS_LOTO_Linuxqt5/src/src.pro</value>
-    <value type="bool" key="ProjectExplorer.RunConfiguration.Customized">false</value>
-    <value type="QString" key="ProjectExplorer.RunConfiguration.UniqueId"></value>
-    <value type="int" key="RemoteLinux.EnvironmentAspect.Version">1</value>
-    <value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value>
-    <value type="bool" key="RunConfiguration.UseLibrarySearchPath">true</value>
-    <value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value>
-    <value type="QString" key="RunConfiguration.WorkingDirectory.default">%{RunConfig:Executable:Path}</value>
-    <value type="QString" key="RunConfiguration.X11Forwarding">:0</value>
-   </valuemap>
-   <value type="qlonglong" key="ProjectExplorer.Target.RunConfigurationCount">1</value>
-  </valuemap>
- </data>
- <data>
-  <variable>ProjectExplorer.Project.Target.2</variable>
-  <valuemap type="QVariantMap">
-   <value type="QString" key="DeviceType">Desktop</value>
-   <value type="bool" key="HasPerBcDcs">true</value>
-   <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Desktop Qt 6.10.1</value>
-   <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Desktop Qt 6.10.1</value>
-   <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">qt.qt6.6101.linux_gcc_64_kit</value>
-   <value type="qlonglong" key="ProjectExplorer.Target.ActiveBuildConfiguration">0</value>
-   <value type="qlonglong" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
-   <value type="qlonglong" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value>
-   <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0">
+   <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.2">
     <value type="int" key="EnableQmlDebugging">0</value>
-    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/fffe/ISCS_LOTO_Linuxqt5/build/Desktop_Qt_6_10_1-Debug</value>
-    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir">/home/fffe/ISCS_LOTO_Linuxqt5/build/Desktop_Qt_6_10_1-Debug</value>
+    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/kim/Desktop/ISCS_LOTO_Linux/build-Loto-rk3568-Profile</value>
+    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir">/home/kim/Desktop/ISCS_LOTO_Linux/build-Loto-rk3568-Profile</value>
     <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
      <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
       <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
       <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
+      <value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value>
       <value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
       <valuelist type="QVariantList" key="QtProjectManager.QMakeBuildStep.SelectedAbis"/>
      </valuemap>
@@ -433,7 +190,7 @@
       <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
       <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
      </valuemap>
-     <value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
+     <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
@@ -444,7 +201,7 @@
       <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
       <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
      </valuemap>
-     <value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
+     <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Clean</value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
@@ -452,52 +209,51 @@
     <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
     <value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
     <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.CustomParsers"/>
-    <value type="bool" key="ProjectExplorer.BuildConfiguration.ParseStandardOutput">false</value>
     <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
-    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Debug</value>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Profile</value>
     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
-    <value type="qlonglong" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
-    <value type="qlonglong" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value>
-    <valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0">
-     <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
-      <value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">0</value>
-      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deploy</value>
-      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Deploy</value>
-      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value>
-     </valuemap>
-     <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">1</value>
-     <valuemap type="QVariantMap" key="ProjectExplorer.DeployConfiguration.CustomData"/>
-     <value type="bool" key="ProjectExplorer.DeployConfiguration.CustomDataEnabled">false</value>
-     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.DefaultDeployConfiguration</value>
-    </valuemap>
-    <value type="qlonglong" key="ProjectExplorer.Target.DeployConfigurationCount">1</value>
-    <valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.0">
-     <value type="bool" key="Analyzer.Perf.Settings.UseGlobalSettings">true</value>
-     <value type="bool" key="Analyzer.QmlProfiler.Settings.UseGlobalSettings">true</value>
-     <value type="int" key="Analyzer.Valgrind.Callgrind.CostFormat">0</value>
-     <value type="bool" key="Analyzer.Valgrind.Settings.UseGlobalSettings">true</value>
-     <valuelist type="QVariantList" key="CustomOutputParsers"/>
-     <value type="int" key="PE.EnvironmentAspect.Base">2</value>
-     <valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
-     <value type="bool" key="PE.EnvironmentAspect.PrintOnRun">false</value>
-     <value type="QString" key="PerfRecordArgsId">-e cpu-cycles --call-graph dwarf,4096 -F 250</value>
-     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
-     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4RunConfiguration:</value>
-     <value type="QString" key="ProjectExplorer.RunConfiguration.BuildKey">/home/fffe/ISCS_LOTO_Linuxqt5/src/src.pro</value>
-     <value type="bool" key="ProjectExplorer.RunConfiguration.Customized">false</value>
-     <value type="QString" key="ProjectExplorer.RunConfiguration.UniqueId"></value>
-     <value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value>
-     <value type="bool" key="RunConfiguration.UseLibrarySearchPath">true</value>
-     <value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value>
-     <value type="QString" key="RunConfiguration.WorkingDirectory.default">%{RunConfig:Executable:Path}</value>
-    </valuemap>
-    <value type="qlonglong" key="ProjectExplorer.Target.RunConfigurationCount">1</value>
-    <value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">2</value>
+    <value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">0</value>
+    <value type="int" key="QtQuickCompiler">0</value>
+    <value type="int" key="RunSystemFunction">0</value>
+    <value type="int" key="SeparateDebugInfo">0</value>
    </valuemap>
-   <value type="qlonglong" key="ProjectExplorer.Target.BuildConfigurationCount">1</value>
+   <value type="int" key="ProjectExplorer.Target.BuildConfigurationCount">3</value>
    <valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0">
     <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
-     <value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">0</value>
+     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
+      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">RemoteLinux.CheckForFreeDiskSpaceStep</value>
+      <valuelist type="QVariantList" key="ProjectExplorer.RunConfiguration.LastDeployedFiles"/>
+      <valuelist type="QVariantList" key="ProjectExplorer.RunConfiguration.LastDeployedHosts"/>
+      <valuelist type="QVariantList" key="ProjectExplorer.RunConfiguration.LastDeployedRemotePaths"/>
+      <valuelist type="QVariantList" key="ProjectExplorer.RunConfiguration.LastDeployedSysroots"/>
+      <value type="QString" key="RemoteLinux.CheckForFreeDiskSpaceStep.PathToCheck">/</value>
+      <value type="qlonglong" key="RemoteLinux.CheckForFreeDiskSpaceStep.RequiredSpace">5242880</value>
+      <valuelist type="QVariantList" key="RemoteLinux.LastDeployedLocalTimes"/>
+      <valuelist type="QVariantList" key="RemoteLinux.LastDeployedRemoteTimes"/>
+     </valuemap>
+     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
+      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">RemoteLinux.KillAppStep</value>
+      <valuelist type="QVariantList" key="ProjectExplorer.RunConfiguration.LastDeployedFiles"/>
+      <valuelist type="QVariantList" key="ProjectExplorer.RunConfiguration.LastDeployedHosts"/>
+      <valuelist type="QVariantList" key="ProjectExplorer.RunConfiguration.LastDeployedRemotePaths"/>
+      <valuelist type="QVariantList" key="ProjectExplorer.RunConfiguration.LastDeployedSysroots"/>
+      <valuelist type="QVariantList" key="RemoteLinux.LastDeployedLocalTimes"/>
+      <valuelist type="QVariantList" key="RemoteLinux.LastDeployedRemoteTimes"/>
+     </valuemap>
+     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.2">
+      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">RemoteLinux.RsyncDeployStep</value>
+      <valuelist type="QVariantList" key="ProjectExplorer.RunConfiguration.LastDeployedFiles"/>
+      <valuelist type="QVariantList" key="ProjectExplorer.RunConfiguration.LastDeployedHosts"/>
+      <valuelist type="QVariantList" key="ProjectExplorer.RunConfiguration.LastDeployedRemotePaths"/>
+      <valuelist type="QVariantList" key="ProjectExplorer.RunConfiguration.LastDeployedSysroots"/>
+      <valuelist type="QVariantList" key="RemoteLinux.LastDeployedLocalTimes"/>
+      <valuelist type="QVariantList" key="RemoteLinux.LastDeployedRemoteTimes"/>
+      <value type="QString" key="RemoteLinux.RsyncDeployStep.Flags">-av</value>
+     </valuemap>
+     <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">3</value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deploy</value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Deploy</value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value>
@@ -505,35 +261,95 @@
     <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">1</value>
     <valuemap type="QVariantMap" key="ProjectExplorer.DeployConfiguration.CustomData"/>
     <value type="bool" key="ProjectExplorer.DeployConfiguration.CustomDataEnabled">false</value>
-    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.DefaultDeployConfiguration</value>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">DeployToGenericLinux</value>
    </valuemap>
-   <value type="qlonglong" key="ProjectExplorer.Target.DeployConfigurationCount">1</value>
+   <value type="int" key="ProjectExplorer.Target.DeployConfigurationCount">1</value>
    <valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.0">
+    <value type="QString" key="Analyzer.Perf.CallgraphMode">dwarf</value>
+    <valuelist type="QVariantList" key="Analyzer.Perf.Events">
+     <value type="QString">cpu-cycles</value>
+    </valuelist>
+    <valuelist type="QVariantList" key="Analyzer.Perf.ExtraArguments"/>
+    <value type="int" key="Analyzer.Perf.Frequency">250</value>
+    <valuelist type="QVariantList" key="Analyzer.Perf.RecordArguments">
+     <value type="QString">-e</value>
+     <value type="QString">cpu-cycles</value>
+     <value type="QString">--call-graph</value>
+     <value type="QString">dwarf,4096</value>
+     <value type="QString">-F</value>
+     <value type="QString">250</value>
+    </valuelist>
+    <value type="QString" key="Analyzer.Perf.SampleMode">-F</value>
     <value type="bool" key="Analyzer.Perf.Settings.UseGlobalSettings">true</value>
+    <value type="int" key="Analyzer.Perf.StackSize">4096</value>
+    <value type="bool" key="Analyzer.QmlProfiler.AggregateTraces">false</value>
+    <value type="bool" key="Analyzer.QmlProfiler.FlushEnabled">false</value>
+    <value type="uint" key="Analyzer.QmlProfiler.FlushInterval">1000</value>
+    <value type="QString" key="Analyzer.QmlProfiler.LastTraceFile"></value>
     <value type="bool" key="Analyzer.QmlProfiler.Settings.UseGlobalSettings">true</value>
-    <value type="int" key="Analyzer.Valgrind.Callgrind.CostFormat">0</value>
+    <valuelist type="QVariantList" key="Analyzer.Valgrind.AddedSuppressionFiles"/>
+    <value type="bool" key="Analyzer.Valgrind.Callgrind.CollectBusEvents">false</value>
+    <value type="bool" key="Analyzer.Valgrind.Callgrind.CollectSystime">false</value>
+    <value type="bool" key="Analyzer.Valgrind.Callgrind.EnableBranchSim">false</value>
+    <value type="bool" key="Analyzer.Valgrind.Callgrind.EnableCacheSim">false</value>
+    <value type="bool" key="Analyzer.Valgrind.Callgrind.EnableEventToolTips">true</value>
+    <value type="double" key="Analyzer.Valgrind.Callgrind.MinimumCostRatio">0.01</value>
+    <value type="double" key="Analyzer.Valgrind.Callgrind.VisualisationMinimumCostRatio">10</value>
+    <value type="bool" key="Analyzer.Valgrind.FilterExternalIssues">true</value>
+    <value type="QString" key="Analyzer.Valgrind.KCachegrindExecutable">kcachegrind</value>
+    <value type="int" key="Analyzer.Valgrind.LeakCheckOnFinish">1</value>
+    <value type="int" key="Analyzer.Valgrind.NumCallers">25</value>
+    <valuelist type="QVariantList" key="Analyzer.Valgrind.RemovedSuppressionFiles"/>
+    <value type="int" key="Analyzer.Valgrind.SelfModifyingCodeDetection">1</value>
     <value type="bool" key="Analyzer.Valgrind.Settings.UseGlobalSettings">true</value>
+    <value type="bool" key="Analyzer.Valgrind.ShowReachable">false</value>
+    <value type="bool" key="Analyzer.Valgrind.TrackOrigins">true</value>
+    <value type="QString" key="Analyzer.Valgrind.ValgrindExecutable">valgrind</value>
+    <valuelist type="QVariantList" key="Analyzer.Valgrind.VisibleErrorKinds">
+     <value type="int">0</value>
+     <value type="int">1</value>
+     <value type="int">2</value>
+     <value type="int">3</value>
+     <value type="int">4</value>
+     <value type="int">5</value>
+     <value type="int">6</value>
+     <value type="int">7</value>
+     <value type="int">8</value>
+     <value type="int">9</value>
+     <value type="int">10</value>
+     <value type="int">11</value>
+     <value type="int">12</value>
+     <value type="int">13</value>
+     <value type="int">14</value>
+    </valuelist>
     <valuelist type="QVariantList" key="CustomOutputParsers"/>
-    <value type="int" key="PE.EnvironmentAspect.Base">2</value>
-    <valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
-    <value type="bool" key="PE.EnvironmentAspect.PrintOnRun">false</value>
-    <value type="QString" key="PerfRecordArgsId">-e cpu-cycles --call-graph dwarf,4096 -F 250</value>
-    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
-    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4RunConfiguration:</value>
-    <value type="QString" key="ProjectExplorer.RunConfiguration.BuildKey">/home/fffe/ISCS_LOTO_Linuxqt5/src/src.pro</value>
-    <value type="bool" key="ProjectExplorer.RunConfiguration.Customized">false</value>
-    <value type="QString" key="ProjectExplorer.RunConfiguration.UniqueId"></value>
+    <value type="int" key="PE.EnvironmentAspect.Base">1</value>
+    <valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes">
+     <value type="QString">LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH</value>
+     <value type="QString">QML2_IMPORT_PATH=$QTDIR/qml:$QML2_IMPORT_PATH</value>
+     <value type="QString">QTDIR=/opt/qt5</value>
+     <value type="QString">QT_PLUGIN_PATH=$QTDIR/plugins:$QT_PLUGIN_PATH</value>
+    </valuelist>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">src (on rk3568)</value>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">RemoteLinuxRunConfiguration:/home/kim/Desktop/ISCS_LOTO_Linux/src/src.pro</value>
+    <value type="QString" key="ProjectExplorer.RunConfiguration.BuildKey">/home/kim/Desktop/ISCS_LOTO_Linux/src/src.pro</value>
+    <value type="int" key="RemoteLinux.EnvironmentAspect.Version">1</value>
+    <value type="bool" key="RunConfiguration.UseCppDebugger">false</value>
     <value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value>
-    <value type="bool" key="RunConfiguration.UseLibrarySearchPath">true</value>
+    <value type="bool" key="RunConfiguration.UseQmlDebugger">false</value>
     <value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value>
-    <value type="QString" key="RunConfiguration.WorkingDirectory.default">%{RunConfig:Executable:Path}</value>
+    <value type="QString" key="RunConfiguration.X11Forwarding">:0</value>
    </valuemap>
-   <value type="qlonglong" key="ProjectExplorer.Target.RunConfigurationCount">1</value>
+   <value type="int" key="ProjectExplorer.Target.RunConfigurationCount">1</value>
   </valuemap>
  </data>
  <data>
   <variable>ProjectExplorer.Project.TargetCount</variable>
-  <value type="qlonglong">3</value>
+  <value type="int">1</value>
+ </data>
+ <data>
+  <variable>ProjectExplorer.Project.Updater.FileVersion</variable>
+  <value type="int">22</value>
  </data>
  <data>
   <variable>Version</variable>

+ 25 - 0
build-Loto-rk3568-Debug/.qmake.stash

@@ -0,0 +1,25 @@
+QMAKE_CXX.QT_COMPILER_STDCXX = 201402L
+QMAKE_CXX.QMAKE_GCC_MAJOR_VERSION = 7
+QMAKE_CXX.QMAKE_GCC_MINOR_VERSION = 5
+QMAKE_CXX.QMAKE_GCC_PATCH_VERSION = 0
+QMAKE_CXX.COMPILER_MACROS = \
+    QT_COMPILER_STDCXX \
+    QMAKE_GCC_MAJOR_VERSION \
+    QMAKE_GCC_MINOR_VERSION \
+    QMAKE_GCC_PATCH_VERSION
+QMAKE_CXX.INCDIRS = \
+    /usr/aarch64-linux-gnu/include/c++/7 \
+    /usr/aarch64-linux-gnu/include/c++/7/aarch64-linux-gnu \
+    /usr/aarch64-linux-gnu/include/c++/7/backward \
+    /usr/lib/gcc-cross/aarch64-linux-gnu/7/include \
+    /usr/lib/gcc-cross/aarch64-linux-gnu/7/include-fixed \
+    /usr/aarch64-linux-gnu/include \
+    /opt/rk3568-rootfs/usr/include/aarch64-linux-gnu \
+    /opt/rk3568-rootfs/usr/include
+QMAKE_CXX.LIBDIRS = \
+    /usr/lib/gcc-cross/aarch64-linux-gnu/7 \
+    /usr/aarch64-linux-gnu/lib \
+    /opt/rk3568-rootfs/lib/aarch64-linux-gnu \
+    /opt/rk3568-rootfs/lib \
+    /opt/rk3568-rootfs/usr/lib/aarch64-linux-gnu \
+    /opt/rk3568-rootfs/usr/lib

+ 6 - 0
build-Loto-rk3568-Debug/src/pkg-config_wrapper.sh

@@ -0,0 +1,6 @@
+#!/bin/sh
+PKG_CONFIG_SYSROOT_DIR=/opt/rk3568-rootfs
+export PKG_CONFIG_SYSROOT_DIR
+PKG_CONFIG_LIBDIR=/opt/rk3568-rootfs/usr/lib/pkgconfig:/opt/rk3568-rootfs/usr/share/pkgconfig
+export PKG_CONFIG_LIBDIR
+exec pkg-config "$@"

+ 4 - 0
src/httpclient/HttpClient.cpp

@@ -342,6 +342,10 @@ void HttpClient::slotPostRequestData(quint64 id, QString postUrl, QByteArray dat
             emit signalResponseUpdatePointUnlock(bb);
         } else if (localPostUrl == Config()->updateBackLock) {
             emit signalResponseUpdateBackLock(bb);
+        } else if (localPostUrl == Config()->updateKeyBack) {
+            emit signalResponseUpdateKeyBack(bb);
+        } else if (localPostUrl == Config()->updateWorkTicketUrl) {
+            emit signalResponseUpdateWorkTicket(bb);
         }
     } else {
         m_mutex.unlock();

+ 2 - 0
src/httpclient/HttpClient.h

@@ -42,11 +42,13 @@ signals:
     void signalResponseCardLoginData(QByteArray);
     void signalResponseUpdateNodeApprovalUrl(QByteArray);
     void signalResponseUploadJobTicket(QByteArray);
+    void signalResponseUpdateWorkTicket(QByteArray);
     void signalResponseUploadPositionInfo(QByteArray);
     void signalResponseUpdateUncolock(QByteArray);
     void signalResponseUpdateColock(QByteArray);
     void signalResponseUpdatePointUnlock(QByteArray);
     void signalResponseUpdateBackLock(QByteArray);
+    void signalResponseUpdateKeyBack(QByteArray);
     void signalResponseGetJobTickets(QByteArray);
     void signalResponseGetWorkNodeDetail(QByteArray);
     void signalResponseGetFormById(QByteArray);

+ 123 - 3
src/interactive/InteractiveCAN.cpp

@@ -76,9 +76,11 @@ InteractiveCAN::InteractiveCAN()
 
     connect(this, &InteractiveCAN::signalPostRequestData, m_httpClient, &HttpClient::slotPostRequestData, Qt::QueuedConnection);
     connect(m_httpClient, &HttpClient::signalResponseUploadJobTicket, this, &InteractiveCAN::slotHttpResponseUploadJobTicket);
+    connect(m_httpClient, &HttpClient::signalResponseUpdateWorkTicket, this, &InteractiveCAN::slotHttpResponseUpdateWorkTicket);
     connect(m_httpClient, &HttpClient::signalResponseUploadPositionInfo, this, &InteractiveCAN::slotHttpResponseUploadPositionInfo);
     connect(m_httpClient, &HttpClient::signalResponseUpdateBackLock, this, &InteractiveCAN::slotHttpResponseUpdateBackLock);
     connect(m_httpClient, &HttpClient::signalResponseGetWorkTicketByNodeId, this, &InteractiveCAN::slotHttpResponseGetWorkTicketByNodeId);
+    connect(m_httpClient, &HttpClient::signalResponseUpdateKeyBack, this, &InteractiveCAN::slotHttpResponseUpdateKeyBack);
 
     m_bleConnectTimer = new QTimer(this);
     connect(m_bleConnectTimer, &QTimer::timeout, this, &InteractiveCAN::slotSearchBLE);
@@ -209,7 +211,44 @@ void InteractiveCAN::httpRequestPostUploadJobTicket()
     jsonRoot.insert("keyNfcList", keyNfcListArray);
     jsonRoot.insert("lockNfcList", lockNfcListArray);
 
-    qDebug() << "[httpRequestPostUploadJobTicket]: " << url;
+    qDebug() << "[httpRequestPostUploadJobTicket]: " << url << jsonRoot;
+
+    QJsonDocument jsonDoc(jsonRoot);
+    QByteArray jsonData = jsonDoc.toJson(QJsonDocument::Compact);
+
+    emit signalPostRequestData(timestampSeconds, url, jsonData, NULL, GetInteractiveData()->m_token);
+}
+
+void InteractiveCAN::httpRequestPostUpdateWorkTicket()
+{
+    QJsonObject jsonRoot;
+    QDateTime currentDateTime = QDateTime::currentDateTime();
+    qint64 timestampSeconds = currentDateTime.toMSecsSinceEpoch();
+
+    QString url = Config()->updateWorkTicketUrl;
+
+    QJsonArray keyNfcListArray;
+    QJsonObject keyNfcItem;
+
+    keyNfcItem.insert("keyNfc", m_keyNFC);
+    keyNfcItem.insert("hardwareCode", Config()->m_systemMACAddr);
+
+    keyNfcListArray.append(keyNfcItem);
+
+    QJsonArray lockNfcListArray;
+    for (auto iter = m_lockRFIDs.begin(); iter != m_lockRFIDs.end(); ++iter) {
+        QJsonObject lockNfcItem;
+        lockNfcItem.insert("lockNfc", iter.value());
+        lockNfcItem.insert("hardwareCode", Config()->m_systemMACAddr);
+        lockNfcListArray.append(lockNfcItem);
+    }
+
+    jsonRoot.insert("nodeId", m_taskCode);
+    jsonRoot.insert("ticketContent", QString::fromUtf8(m_ticketDoc.toJson(QJsonDocument::Compact)));
+    jsonRoot.insert("keyNfcList", keyNfcListArray);
+    jsonRoot.insert("lockNfcList", lockNfcListArray);
+
+    qDebug() << "[httpRequestPostUpdateWorkTicket]: " << url << jsonRoot;
 
     QJsonDocument jsonDoc(jsonRoot);
     QByteArray jsonData = jsonDoc.toJson(QJsonDocument::Compact);
@@ -355,6 +394,27 @@ void InteractiveCAN::httpRequestPostUpdateBackLock(const QList<QString> &lockNfc
     emit signalPostRequestData(timestampSeconds, url, jsonData, NULL, GetInteractiveData()->m_token);
 }
 
+void InteractiveCAN::httpRequestPostUpdateKeyBack(const QString &keyNfc, int target, const QJsonArray& lockList)
+{
+    QJsonObject jsonRoot;
+
+    QDateTime currentDateTime = QDateTime::currentDateTime();
+    qint64 timestampSeconds = currentDateTime.toMSecsSinceEpoch();
+
+    QString url = Config()->updateKeyBack;
+
+    jsonRoot.insert("target", target);
+    jsonRoot.insert("keyNfc", keyNfc);
+    jsonRoot.insert("hardwareCode", Config()->m_systemMACAddr);
+    jsonRoot.insert("list", lockList);
+
+    QJsonDocument jsonDoc(jsonRoot);
+    QByteArray jsonData = jsonDoc.toJson(QJsonDocument::Compact);
+    qDebug() << jsonDoc;
+
+    emit signalPostRequestData(timestampSeconds, url, jsonData, NULL, GetInteractiveData()->m_token);
+}
+
 void InteractiveCAN::httpRequestGetWorkTicketByNodeId()
 {
     QJsonObject jsonRoot;
@@ -523,10 +583,11 @@ void InteractiveCAN::slotHttpResponseUploadJobTicket(QByteArray data)
 {
     QJsonParseError error;
     QJsonDocument jsonDoc = QJsonDocument::fromJson(data, &error);
+    qDebug() << "[slotHttpResponseUploadJobTicket]" << jsonDoc;
     if (error.error != QJsonParseError::NoError) {
         return;
     }
-    qDebug() << "[slotHttpResponseUploadJobTicket]" << jsonDoc;
+
     if (jsonDoc.isNull() || jsonDoc.isEmpty()) {
         return;
     }
@@ -547,6 +608,28 @@ void InteractiveCAN::slotHttpResponseUploadJobTicket(QByteArray data)
     }
 }
 
+void InteractiveCAN::slotHttpResponseUpdateWorkTicket(QByteArray data)
+{
+    QJsonParseError error;
+    QJsonDocument jsonDoc = QJsonDocument::fromJson(data, &error);
+    qDebug() << "[slotHttpResponseUpdateWorkTicket]" << jsonDoc;
+    if (error.error != QJsonParseError::NoError) {
+        return;
+    }
+
+    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) {
+
+        }
+    }
+}
+
 void InteractiveCAN::slotHttpResponseUploadPositionInfo(QByteArray data)
 {
     QJsonParseError error;
@@ -626,11 +709,11 @@ void InteractiveCAN::slotHttpResponseGetWorkTicketByNodeId(QByteArray data)
 {
     QJsonParseError error;
     QJsonDocument jsonDoc = QJsonDocument::fromJson(data, &error);
+    qDebug() << "[slotHttpResponseGetWorkTicketByNodeId]" << jsonDoc;
     if (error.error != QJsonParseError::NoError) {
         emit signalJobTicketInfo(-3, QJsonObject());
         return;
     }
-    qDebug() << "[slotHttpResponseGetWorkTicketByNodeId]" << jsonDoc;
     if (jsonDoc.isNull() || jsonDoc.isEmpty()) {
         emit signalJobTicketInfo(-3, QJsonObject());
         return;
@@ -666,6 +749,29 @@ void InteractiveCAN::slotHttpResponseGetWorkTicketByNodeId(QByteArray data)
     emit signalJobTicketInfo(-3, QJsonObject());
 }
 
+void InteractiveCAN::slotHttpResponseUpdateKeyBack(QByteArray data)
+{
+    QJsonParseError error;
+    QJsonDocument jsonDoc = QJsonDocument::fromJson(data, &error);
+    qDebug() << "[slotHttpResponseUpdateKeyBack]" << jsonDoc;
+    if (error.error != QJsonParseError::NoError) {
+        emit signalJobTicketInfo(-3, QJsonObject());
+        return;
+    }
+    if (jsonDoc.isNull() || jsonDoc.isEmpty()) {
+        emit signalJobTicketInfo(-3, QJsonObject());
+        return;
+    }
+
+    QJsonObject rootObj = jsonDoc.object();
+    if(rootObj.contains("code")) {
+        int codeValue = rootObj.value("code").toInt();
+        if(codeValue == 200 || codeValue == 0) {
+            InteractiveCAN::instance()->httpRequestPostUpdateWorkTicket();
+        }
+    }
+}
+
 void InteractiveCAN::slotUpdateColockStatus(const QString& cardNfc)
 {
     // TODO: 更新共锁人状态
@@ -998,9 +1104,23 @@ void InteractiveCAN::resetAll()
     m_pointInfo.clear();
 }
 
+QString InteractiveCAN::retryReadLockRFID(int lockNum)
+{
+    int tryCount = 3;
+    for (int i = 0; i < tryCount; i++) {
+        QString lockNfc = m_canClient->getLockRFID(lockNum);
+        qDebug() << "[retryReadLockRFID] " << lockNfc;
+        if (!lockNfc.isEmpty()) {
+            return lockNfc;
+        }
+    }
+    return QString();
+}
+
 void InteractiveCAN::slotUnlockEKey(const CANKeyBaseChargeStatus& status)
 {
 //    if (ReturnKeyLockManager::instance()->isProcessing()) return;
+
     if (status.success) {
         if (m_okOpenKey) {
             QMutexLocker locker(&m_mutex);

+ 10 - 1
src/interactive/InteractiveCAN.h

@@ -73,6 +73,9 @@ public:
     QString keyNfc() const {
         return m_keyNFC;
     }
+    void setKeyNfc(const QString& nfc) {
+        m_keyNFC = nfc;
+    }
 public:
     Q_INVOKABLE void openEKey();
     // 获取钥匙
@@ -93,6 +96,8 @@ public:
     void unlockDevices(const QString& nfc, const QString& deviceType);
 
     void resetAll();
+
+    QString retryReadLockRFID(int lockNum);
 public slots:
     void slotUnlockEKey(const CANKeyBaseChargeStatus& status);
     void slotUnlockLocks(bool success, const QList<QString>& lockRfids);
@@ -111,11 +116,13 @@ private:
 
     void createColockJobTicket();
 
-    void httpRequestPostUploadJobTicket();
     void httpRequestPostUploadPositionInfo(const QJsonDocument& doc);
     void httpRequestPostUpdatePointUnlock(const QJsonDocument& doc);
 public:
+    void httpRequestPostUploadJobTicket();
+    void httpRequestPostUpdateWorkTicket();
     void httpRequestPostUpdateBackLock(const QList<QString>& lockNfcs);
+    void httpRequestPostUpdateKeyBack(const QString& keyNfc, int target, const QJsonArray& lockList);
     void httpRequestGetWorkTicketByNodeId();
 public slots:
     void getJobTicketInfo(quint8 nodeId, bool isLeftKey);
@@ -125,11 +132,13 @@ public slots:
     void slotHttpResponseGetIsolationPointInfo(QByteArray data);
 
     void slotHttpResponseUploadJobTicket(QByteArray data);
+    void slotHttpResponseUpdateWorkTicket(QByteArray data);
 
     void slotHttpResponseUploadPositionInfo(QByteArray data);
     void slotHttpResponseUpdatePointUnlock(QByteArray data);
     void slotHttpResponseUpdateBackLock(QByteArray data);
     void slotHttpResponseGetWorkTicketByNodeId(QByteArray data);
+    void slotHttpResponseUpdateKeyBack(QByteArray data);
 
     void slotUpdateColockStatus(const QString& cardNfc);
 

+ 73 - 12
src/interactive/ReturnKeyLockManager.cpp

@@ -174,8 +174,7 @@ void ReturnKeyLockManager::onDeviceError(const QString& deviceType, int slotInde
         return;
     }
     m_nfcIdSet.insert(info.nfcId);
-    
-    m_testDevices.append(info);
+
     if (isFilter) {
         // 加入待处理队列
         m_pendingQueue.enqueue(info);
@@ -309,6 +308,10 @@ void ReturnKeyLockManager::slotReceivedJobTicket(const BLERWorkTicketResult &res
         }
     }
 
+    m_currentReadingStatus = QString("正在读取钥匙状态...");
+    m_isProcessing = true;
+    emit currentReadingStatusChanged();
+
     // 根据nodeId获取任务详情
     m_workDetail->setNodeId(m_currTask.taskCode);
     m_workDetail->start();
@@ -334,10 +337,6 @@ void ReturnKeyLockManager::processNextInQueue()
     m_currentReadingStatus = QString("正在读取%1状态...").arg(info.deviceType == "key" ? "钥匙" : "锁仓");
     emit currentReadingStatusChanged();
     
-//    // TODO: 调用API查询设备状态
-//    // 这里需要发出信号,由HttpClient处理
-//    // emit signalQueryDeviceStatus(timestamp, url, jsonData, token);
-    
 //    // 临时:模拟API响应(实际使用时删除这段,改为真实API调用)
     QVariantMap mockData;
     mockData["returnStatus"] = "success";
@@ -349,8 +348,6 @@ void ReturnKeyLockManager::processNextInQueue()
     mockData["taskName"] = "";
     mockData["orderNo"] = "";
     mockData["worker"] = "";
-
-    m_testDevices.append(info);
     
     locker.unlock();
     if (info.deviceType == "key") {
@@ -358,7 +355,11 @@ void ReturnKeyLockManager::processNextInQueue()
         InteractiveCAN::instance()->connectBLEDevice(info.nfcId);
     }
     else {
-        onApiResponse(info.nfcId, true, mockData);
+        QList<QString> lockRfids;
+        lockRfids << info.nfcId;
+
+        InteractiveCAN::instance()->httpRequestPostUpdateBackLock(lockRfids);
+//        onApiResponse(info.nfcId, true, mockData);
     }
 }
 
@@ -374,8 +375,7 @@ void ReturnKeyLockManager::retrieveFailedDevices()
     qDebug() << "[ReturnKeyLockManager] 取出归还失败的设备";
     InteractiveCAN::instance()->updateKeyAndLockStatus(true);
     
-//    for (auto iter = m_errorDevices.begin(); iter != m_errorDevices.end(); ++iter) {
-    for (auto iter = m_testDevices.begin(); iter != m_testDevices.end(); ++iter) {
+    for (auto iter = m_errorDevices.begin(); iter != m_errorDevices.end(); ++iter) {
         qDebug() << iter->nfcId;
         InteractiveCAN::instance()->unlockDevices(iter->nfcId, iter->deviceType);
     }
@@ -547,7 +547,7 @@ void ReturnKeyLockManager::slotGetJobTicketResult(int stat, const QJsonObject& d
             info.statusMessage = "作业任务未完成";
         }
 
-        info.taskId = m_currTask.taskCode;
+        info.taskId = WorkNodeFormModel::instance()->workId();
         info.taskName = WorkNodeFormModel::instance()->nodeName();
         info.taskOrderNo = WorkNodeFormModel::instance()->orderNo();
         info.taskWorker = WorkNodeFormModel::instance()->workerName();
@@ -570,6 +570,67 @@ void ReturnKeyLockManager::slotGetJobTicketResult(int stat, const QJsonObject& d
                 m_failedLocks++;
             }
         }
+
+        InteractiveCAN::instance()->setTaskCode(WorkNodeFormModel::instance()->workId());
+
+        bool hasTicketInfo = true;
+        int target = 0;
+
+        QJsonArray lockInfoList;
+        if (dataObj.contains("ticketContent")) {
+            QJsonDocument ticketDoc = QJsonDocument::fromJson(QByteArray::fromStdString(dataObj.value("ticketContent").toString().toStdString().c_str()));
+            if (ticketDoc.isNull() || ticketDoc.isEmpty()) {
+                hasTicketInfo = false;
+            }
+            else {
+                QJsonObject ticketObj = ticketDoc.object();
+                if (ticketObj.contains("data")) {
+                    QJsonArray dataObj = ticketObj.value("data").toArray();
+                    for (auto iter = dataObj.begin(); iter != dataObj.end(); ++iter) {
+                        QJsonObject itemObj = iter->toObject();
+                        if (!itemObj.contains("taskCode") || !itemObj.contains("dataList")) continue;
+
+                        QString taskCode = itemObj.value("taskCode").toString();
+
+                        QJsonArray dataList = itemObj.value("dataList").toArray();
+                        for (auto pointIter = dataList.begin(); pointIter != dataList.end(); ++pointIter) {
+                            QJsonObject lockItem;
+                            QJsonObject pointItem = pointIter->toObject();
+
+                            lockItem.insert("nodeId", taskCode.toInt());
+                            lockItem.insert("pointNfc", pointItem.value("equipRfidNo").toString());
+                            lockInfoList.append(lockItem);
+
+                            if (WorkNodeFormModel::instance()->modelType() == "releaseIsolation") {
+                                target = 1;
+                            }
+                            else {
+                                target = pointItem.value("target").toInt();
+                            }
+                        }
+                    }
+                    QJsonArray lockList = ticketObj.value("lockList").toArray();
+                    if (lockList.count() == lockInfoList.count()) {
+                         m_currTask.lockNfcs.clear();
+                        for (int i = 0; i < lockList.count(); i++) {
+                            m_currTask.lockNfcs.append(lockList[i].toObject().value("rfid").toString());
+                            QJsonObject lockItem = lockInfoList[i].toObject();
+                            lockItem.insert("lockNfc", lockList[i].toObject().value("rfid").toString());
+                            lockInfoList.replace(i, lockItem);
+                        }
+                    }
+                }
+            }
+        }
+        if (hasTicketInfo) {
+            InteractiveCAN::instance()->httpRequestPostUpdateKeyBack(info.nfcId, target, lockInfoList);
+        }
+
+        if (!m_currTask.keyNfc.isEmpty()) {
+            InteractiveCAN::instance()->setKeyNfc(m_currTask.keyNfc);
+        }
+
+        qDebug() << "[slotGetJobTicketResult] ==============" << m_currTask.keyNfc << info.nfcId << m_currTask.lockNfcs << lockInfoList;
     }
 
     // 分类到对应组

+ 0 - 1
src/interactive/ReturnKeyLockManager.h

@@ -191,7 +191,6 @@ private:
     QMap<QString, QList<ReturnDeviceInfo>> m_taskGroups;
     QList<ReturnDeviceInfo> m_errorDevices;     // 设备异常列表
     QList<ReturnDeviceInfo> m_noTaskDevices;    // 无作业任务列表
-    QList<ReturnDeviceInfo> m_testDevices;
     
     bool m_isProcessing;
     bool m_isVisible;

+ 102 - 13
src/qml/components/JobTicketColockProcess.qml

@@ -504,29 +504,118 @@ Rectangle {
             height: stackLayout.height
             color: "transparent"
 
-            MButton {
-                id: __lockTips
+//            MButton {
+//                id: __lockTips
+//                anchors.horizontalCenter: parent.horizontalCenter
+//                y: 30
+//                height: 48
+//                width: 800
+
+//                btnRadius: 8
+//                buttonColor: "#1A40A9FF"
+//                pressedScale: 1.0
+//                cancelMouseArea: true
+
+//                text: qsTr("请将钥匙插入锁柜,插入后,系统会自动检查上锁状态")
+//                textColor: "white"
+//            }
+
+            Rectangle {
+                id: __lockTipsContainer
                 anchors.horizontalCenter: parent.horizontalCenter
-                y: 30
-                height: 48
-                width: 800
+                anchors.top: parent.top
+                anchors.topMargin: 120  // 向下调整,从40改为120
+                width: 1200
+                height: 280
+                color: "#1A1A2E"
+                radius: 16
+                border.color: "#40C7FF"
+                border.width: 2
 
-                btnRadius: 8
-                buttonColor: "#1A40A9FF"
-                pressedScale: 1.0
-                cancelMouseArea: true
+                Column {
+                    anchors.centerIn: parent
+                    spacing: 24
+                    width: parent.width - 80
 
-                text: qsTr("请将钥匙插入锁柜,插入后,系统会自动检查上锁状态")
-                textColor: "white"
+                    // 标题行
+                    Row {
+                        anchors.horizontalCenter: parent.horizontalCenter
+                        spacing: 12
+
+                        Text {
+                            text: "\uf05a"
+                            color: "#40C7FF"
+                            font.pixelSize: 28
+                            font.family: iconFont.name
+                            anchors.verticalCenter: parent.verticalCenter
+                        }
+
+                        Text {
+                            text: "您的作业任务相关钥匙和锁已经取出"
+                            color: "#40C7FF"
+                            font.pixelSize: 24
+                            font.bold: true
+                            anchors.verticalCenter: parent.verticalCenter
+                        }
+                    }
+
+                    // 主要内容
+                    Text {
+                        width: parent.width
+                        anchors.horizontalCenter: parent.horizontalCenter
+                        text: "请在作业任务对应的点位进行解锁作业,作业完成后,请将钥匙归还到锁柜。"
+                        color: "#FFFFFF"
+                        font.pixelSize: 20
+                        horizontalAlignment: Text.AlignHCenter
+                        wrapMode: Text.WordWrap
+                        lineHeight: 1.6
+                    }
+
+                    // 注意事项
+                    Rectangle {
+                        anchors.horizontalCenter: parent.horizontalCenter
+                        width: parent.width
+                        height: noticeText.height + 20
+                        color: "#2A1A0A"
+                        radius: 8
+                        border.color: "#FFA500"
+                        border.width: 1
+
+                        Row {
+                            anchors.left: parent.left
+                            anchors.leftMargin: 16
+                            anchors.verticalCenter: parent.verticalCenter
+                            spacing: 10
+
+                            Text {
+                                text: "\uf071"
+                                color: "#FFA500"
+                                font.pixelSize: 20
+                                font.family: iconFont.name
+                                anchors.verticalCenter: parent.verticalCenter
+                            }
+
+                            Text {
+                                id: noticeText
+                                width: parent.parent.width - 50
+                                text: "注意,您可以随时,在任何锁柜插入钥匙即可,系统会自动检测和识别作业状态。"
+                                color: "#FFA500"
+                                font.pixelSize: 18
+                                wrapMode: Text.WordWrap
+                                lineHeight: 1.5
+                            }
+                        }
+                    }
+                }
             }
 
             Flickable {
                 id: __lockView
                 anchors.horizontalCenter: parent.horizontalCenter
-                anchors.top: __lockTips.bottom
+                anchors.top: __lockTipsContainer.bottom
                 anchors.topMargin: 135
                 width: Math.min(__lockRow.width, control.lockStatusCardWidth*4+45)
-                height: parent.height - __lockTips.height - 75
+                height: parent.height - __lockTipsContainer.height - 75
                 clip: true
                 flickableDirection: Flickable.HorizontalFlick
 

+ 3 - 0
src/qml/components/JobTicketProcess.qml

@@ -73,6 +73,9 @@ Rectangle {
             if (tabBar.currentIndex == 2) {
                 __thirdPage.focus = true;
                 __thirdPage.forceActiveFocus();
+            } else if (tabBar.currentIndex == 1) {
+                InteractiveCAN.taskCode = WorkNodeFormModel.workId;
+                InteractiveCAN.getWorkTicketByNodeId();
             }
         }
     }

+ 1 - 3
src/qml/main.qml

@@ -13,9 +13,7 @@ ApplicationWindow {
     width: 1920
     height: 1080
 
-    //888888888888888888 默认全屏设置(已注释,如需还原请取消注释)
-    //visibility: Window.FullScreen       // 设置窗口为全屏
-    visibility: Window.Windowed          // 窗口模式,非全屏
+    visibility: Window.FullScreen       // 设置窗口为全屏
     //visibility: Window.Windowed          // 窗口模式,非全屏
     flags: Qt.FramelessWindowHint       // 设置窗口无边框
 

+ 158 - 75
src/usr/CANClient.cpp

@@ -430,6 +430,13 @@ void CANClient::slotUpdateKeyBaseControl(quint8 nodeId, const CANKeyBaseControlS
             emit signalReturnKey();
         }
     }
+//    else if (!m_keyBaseStatus[nodeId].leftHasKey && status.leftLocked) {
+//        writeStatus.leftLocked = false;
+//        writeStatus.leftWorking = true;
+//        writeStatus.leftChargeEnable = false;
+//        writeStatus.leftChargeState = ChargeState::Charging;
+//        isWrite = true;
+//    }
     if (m_keyBaseStatus[nodeId].rightHasKey && !status.rightLocked) {
         writeStatus.rightLocked = true;
         writeStatus.rightWorking = true;
@@ -443,6 +450,13 @@ void CANClient::slotUpdateKeyBaseControl(quint8 nodeId, const CANKeyBaseControlS
             emit signalReturnKey();
         }
     }
+//    else if (!m_keyBaseStatus[nodeId].rightHasKey && status.rightLocked) {
+//        writeStatus.rightLocked = false;
+//        writeStatus.rightWorking = true;
+//        writeStatus.rightChargeEnable = false;
+//        writeStatus.rightChargeState = ChargeState::Charging;
+//        isWrite = true;
+//    }
 
     if (isWrite) {
         writeKeyBaseChargeControlAsync(writeStatus);
@@ -479,13 +493,13 @@ void CANClient::slotUpdateLockedStatus(quint8 nodeId, const CANLocksControl &sta
                 }
             }
         }
-        else if ((lockHasKeyMap.find(lockNum) != lockHasKeyMap.end() && !lockHasKeyMap[lockNum]) &&
-                 (lockLockedMap.find(lockNum) != lockLockedMap.end() && lockLockedMap[lockNum])) {
-            writeStatus.lockNums.append(lockNum);
-            writeStatus.lockLockedMap.insert(lockNum, false);
-            writeStatus.lockWorkMap.insert(lockNum, true);
-            isWrite = true;
-        }
+//        else if ((lockHasKeyMap.find(lockNum) != lockHasKeyMap.end() && !lockHasKeyMap[lockNum]) &&
+//                 (lockLockedMap.find(lockNum) != lockLockedMap.end() && lockLockedMap[lockNum])) {
+//            writeStatus.lockNums.append(lockNum);
+//            writeStatus.lockLockedMap.insert(lockNum, false);
+//            writeStatus.lockWorkMap.insert(lockNum, true);
+//            isWrite = true;
+//        }
     }
     if (isWrite) {
         writeLockBuckleAsync(writeStatus);
@@ -900,28 +914,28 @@ void CANClient::readKeyBaseControlStatusAsync()
 
             status.success = true;
 
-            bool prevLeftHasKey = false, prevRightHasKey = false;
-            if (m_keyBaseControlStatus.find(nodeId) != m_keyBaseControlStatus.end()) {
-                prevLeftHasKey = m_keyBaseControlStatus[nodeId].leftLocked;
-                prevRightHasKey = m_keyBaseControlStatus[nodeId].rightLocked;
-            }
+//            bool prevLeftHasKey = false, prevRightHasKey = false;
+//            if (m_keyBaseControlStatus.find(nodeId) != m_keyBaseControlStatus.end()) {
+//                prevLeftHasKey = m_keyBaseControlStatus[nodeId].leftLocked;
+//                prevRightHasKey = m_keyBaseControlStatus[nodeId].rightLocked;
+//            }
 
-            if (!m_keyBaseControlStatus.isEmpty()) {
-                if (!prevLeftHasKey && status.leftLocked) {
-                    qInfo() << "[归还检测] 检测到左钥匙插入!";
+//            if (!m_keyBaseControlStatus.isEmpty()) {
+//                if (!prevLeftHasKey && status.leftLocked) {
+//                    qInfo() << "[归还检测] 检测到左钥匙插入!";
 
-                    if (m_keyRFIDStatus.find(nodeId) != m_keyRFIDStatus.end() &&
-                        !m_keyRFIDStatus[nodeId].leftKeyRFID.isEmpty() &&
-                        m_keyRFIDStatus[nodeId].leftKeyRFID != "00000000") {
-                        qInfo() << "[归还检测] 左钥匙:NFC卡号:" << m_keyRFIDStatus[nodeId].leftKeyRFID;
+//                    if (m_keyRFIDStatus.find(nodeId) != m_keyRFIDStatus.end() &&
+//                        !m_keyRFIDStatus[nodeId].leftKeyRFID.isEmpty() &&
+//                        m_keyRFIDStatus[nodeId].leftKeyRFID != "00000000") {
+//                        qInfo() << "[归还检测] 左钥匙:NFC卡号:" << m_keyRFIDStatus[nodeId].leftKeyRFID;
 
-                        emit nfcDeviceDetected(m_keyRFIDStatus[nodeId].leftKeyRFID, "key", 0);
-                    } else {
-                        qWarning() << "[归还检测] 左钥匙存在但无法读取NFC";
-                        emit nfcDeviceError("key", 0);
-                    }
-                }
-            }
+//                        emit nfcDeviceDetected(m_keyRFIDStatus[nodeId].leftKeyRFID, "key", 0);
+//                    } else {
+//                        qWarning() << "[归还检测] 左钥匙存在但无法读取NFC";
+//                        emit nfcDeviceError("key", 0);
+//                    }
+//                }
+//            }
 
 //            qInfo() << "[KeyBase] 左钥匙:" << (status.leftLocked ? "锁住" : "未锁")
 //                    << ",左充电:" << (status.leftCharging ? "充电中" : "未充电") << (status.leftBuckleFault ? "故障" : "正常")
@@ -978,54 +992,54 @@ void CANClient::readLockStatusAsync()
 //            qDebug() << "FrameId: 0x" << QString::number(respFrame.frameId(), 16) << "Data:" << respFrame.payload().toHex().toUpper();
             status.success = true;
             
-            // ========== 检测锁插入(用于归还流程) ==========
-            QMutexLocker locker(&m_insertDataMutex);
+//            // ========== 检测锁插入(用于归还流程) ==========
+//            QMutexLocker locker(&m_insertDataMutex);
             
-            // 获取之前的锁状态
-            QMap<int, bool> prevLockHasKeyMap;
-            if (m_locksControlStatus.find(nodeId) != m_locksControlStatus.end()) {
-                prevLockHasKeyMap = m_locksControlStatus[nodeId].lockHasKeyMap;
-            }
-            if (!m_locksControlStatus.isEmpty()) {
-                // 检测每个锁位的插入(从无到有)
-                for (int i = 0; i < 5; i++) {
-                    bool prevHasLock = prevLockHasKeyMap.contains(i) ? prevLockHasKeyMap[i] : false;
-                    bool currHasLock = status.lockHasKeyMap.contains(i) ? status.lockHasKeyMap[i] : false;
-
-                    if (!prevHasLock && currHasLock) {
-                        qInfo() << "[归还检测] 检测到" << (i+1) << "号锁插入!";
-                        // 锁插入,获取NFC卡号
-                        if (m_locksRFIDStatus.find(nodeId) != m_locksRFIDStatus.end() &&
-                            m_locksRFIDStatus[nodeId].lockRFIDMap.contains(i) &&
-                            !m_locksRFIDStatus[nodeId].lockRFIDMap[i].isEmpty() &&
-                            m_locksRFIDStatus[nodeId].lockRFIDMap[i] != "00000000") {
-                            qInfo() << "[归还检测]" << (i+1) << "号锁NFC卡号:" << m_locksRFIDStatus[nodeId].lockRFIDMap[i];
-
-                            emit nfcDeviceDetected(m_locksRFIDStatus[nodeId].lockRFIDMap[i], "lock", i);
-                            emit signalLockNfcDeviceDetected(m_locksRFIDStatus[nodeId].lockRFIDMap[i]);
-                        } else {
-                            qWarning() << "[归还检测]" << (i+1) << "号锁存在但无法读取NFC";
-                            emit nfcDeviceError("lock", i);
-                        }
-                    }
-                    else if (prevHasLock && !currHasLock) {
-                        qInfo() << "[取出检测] 检测到"  << (i+1) << "号锁取出!";
-                        qDebug() << m_locksRFIDStatus[nodeId].lockRFIDMap[i];
-                        if (m_locksRFIDStatus.find(nodeId) != m_locksRFIDStatus.end() &&
-                            m_locksRFIDStatus[nodeId].lockRFIDMap.contains(i) &&
-                            !m_locksRFIDStatus[nodeId].lockRFIDMap[i].isEmpty() &&
-                            m_locksRFIDStatus[nodeId].lockRFIDMap[i] != "00000000") {
-                            qInfo() << "[取出检测]" << (i+1) << "号锁NFC卡号:" << m_locksRFIDStatus[nodeId].lockRFIDMap[i];
-
-                            emit signalPopDevices(m_locksRFIDStatus[nodeId].lockRFIDMap[i], "lock", i);
-                        } else {
-                            qWarning() << "[取出检测]" << (i+1) << "号锁存在但无法读取NFC";
-                            emit nfcDeviceError("lock", i);
-                        }
-                    }
-                }
-            }
-            // ====================================================
+//            // 获取之前的锁状态
+//            QMap<int, bool> prevLockHasKeyMap;
+//            if (m_locksControlStatus.find(nodeId) != m_locksControlStatus.end()) {
+//                prevLockHasKeyMap = m_locksControlStatus[nodeId].lockHasKeyMap;
+//            }
+//            if (!m_locksControlStatus.isEmpty()) {
+//                // 检测每个锁位的插入(从无到有)
+//                for (int i = 0; i < 5; i++) {
+//                    bool prevHasLock = prevLockHasKeyMap.contains(i) ? prevLockHasKeyMap[i] : false;
+//                    bool currHasLock = status.lockHasKeyMap.contains(i) ? status.lockHasKeyMap[i] : false;
+
+//                    if (!prevHasLock && currHasLock) {
+//                        qInfo() << "[归还检测] 检测到" << (i+1) << "号锁插入!";
+//                        // 锁插入,获取NFC卡号
+//                        if (m_locksRFIDStatus.find(nodeId) != m_locksRFIDStatus.end() &&
+//                            m_locksRFIDStatus[nodeId].lockRFIDMap.contains(i) &&
+//                            !m_locksRFIDStatus[nodeId].lockRFIDMap[i].isEmpty() &&
+//                            m_locksRFIDStatus[nodeId].lockRFIDMap[i] != "00000000") {
+//                            qInfo() << "[归还检测]" << (i+1) << "号锁NFC卡号:" << m_locksRFIDStatus[nodeId].lockRFIDMap[i];
+
+//                            emit nfcDeviceDetected(m_locksRFIDStatus[nodeId].lockRFIDMap[i], "lock", i);
+//                            emit signalLockNfcDeviceDetected(m_locksRFIDStatus[nodeId].lockRFIDMap[i]);
+//                        } else {
+//                            qWarning() << "[归还检测]" << (i+1) << "号锁存在但无法读取NFC";
+//                            emit nfcDeviceError("lock", i);
+//                        }
+//                    }
+//                    else if (prevHasLock && !currHasLock) {
+//                        qInfo() << "[取出检测] 检测到"  << (i+1) << "号锁取出!";
+//                        qDebug() << m_locksRFIDStatus[nodeId].lockRFIDMap[i];
+//                        if (m_locksRFIDStatus.find(nodeId) != m_locksRFIDStatus.end() &&
+//                            m_locksRFIDStatus[nodeId].lockRFIDMap.contains(i) &&
+//                            !m_locksRFIDStatus[nodeId].lockRFIDMap[i].isEmpty() &&
+//                            m_locksRFIDStatus[nodeId].lockRFIDMap[i] != "00000000") {
+//                            qInfo() << "[取出检测]" << (i+1) << "号锁NFC卡号:" << m_locksRFIDStatus[nodeId].lockRFIDMap[i];
+
+//                            emit signalPopDevices(m_locksRFIDStatus[nodeId].lockRFIDMap[i], "lock", i);
+//                        } else {
+//                            qWarning() << "[取出检测]" << (i+1) << "号锁存在但无法读取NFC";
+//                            emit nfcDeviceError("lock", i);
+//                        }
+//                    }
+//                }
+//            }
+//            // ====================================================
             
             if (m_locksControlStatus.find(nodeId) == m_locksControlStatus.end()) {
                 m_locksControlStatus.insert(nodeId, status);
@@ -1271,6 +1285,36 @@ void CANClient::readKeyRFIDStatusAsync()
             keyStatus.leftKeyReadSuccess = true;
 
             QMutexLocker locker(&m_insertDataMutex);
+
+            QString prevLeftHasKey, prevRightHasKey;
+            if (m_keyRFIDStatus.find(nodeId) != m_keyRFIDStatus.end()) {
+                prevLeftHasKey = m_keyRFIDStatus[nodeId].leftKeyRFID;
+                prevRightHasKey = m_keyRFIDStatus[nodeId].rightKeyRFID;
+            }
+
+            QString currHasLock =  parseRFIDCard(data);;
+            if (!m_keyRFIDStatus.isEmpty()) {
+                if (prevLeftHasKey != currHasLock && !currHasLock.isEmpty() && currHasLock != "00000000") {
+                    qInfo() << "[归还检测] 左钥匙:NFC卡号:" << currHasLock;
+
+                   emit nfcDeviceDetected(currHasLock, "key", 0);
+                }
+//                if (!prevLeftHasKey && status.leftLocked) {
+//                    qInfo() << "[归还检测] 检测到左钥匙插入!";
+
+//                    if (m_keyRFIDStatus.find(nodeId) != m_keyRFIDStatus.end() &&
+//                        !m_keyRFIDStatus[nodeId].leftKeyRFID.isEmpty() &&
+//                        m_keyRFIDStatus[nodeId].leftKeyRFID != "00000000") {
+//                        qInfo() << "[归还检测] 左钥匙:NFC卡号:" << m_keyRFIDStatus[nodeId].leftKeyRFID;
+
+//                        emit nfcDeviceDetected(m_keyRFIDStatus[nodeId].leftKeyRFID, "key", 0);
+//                    } else {
+//                        qWarning() << "[归还检测] 左钥匙存在但无法读取NFC";
+//                        emit nfcDeviceError("key", 0);
+//                    }
+//                }
+            }
+
             if (m_keyRFIDStatus.find(nodeId) == m_keyRFIDStatus.end()) {
                 m_keyRFIDStatus.insert(nodeId, keyStatus);
             }
@@ -1391,13 +1435,15 @@ void CANClient::readLockRFIDStatusAsync()
     QSharedPointer<int> readCount(new int(0));
     const int totalLockNum = 5;
 
+    bool isFirst = m_locksRFIDStatus.isEmpty();
+
     // ========== 读取1-5号锁RFID(索引0x6021~0x6025) ==========
     for (int lockNum = 0; lockNum < 5; lockNum++) {
         quint16 rfidIndex = CAN_LOCK_CARD_INDEX;
         quint8 rfidSubIndex = CAN_LOCK_1_CARD_SUBINDEX + lockNum;
         QCanBusFrame lockFrame = buildReadFrame(nodeId, rfidIndex, rfidSubIndex);
 
-        sendFrameAsync(lockFrame, [this, lockStatus, readCount, totalLockNum, lockNum, rfidIndex, rfidSubIndex, nodeId](const QCanBusFrame& respFrame) mutable {
+        sendFrameAsync(lockFrame, [this, lockStatus, readCount, isFirst, lockNum, rfidIndex, rfidSubIndex, nodeId](const QCanBusFrame& respFrame) mutable {
             bool readSuccess = false;
             QString rfidCard = "";
 
@@ -1416,6 +1462,28 @@ void CANClient::readLockRFIDStatusAsync()
                 readSuccess = true;
 
                 QMutexLocker locker(&m_insertDataMutex);
+                // ========== 检测锁插入(用于归还流程) ==========
+
+                // 获取之前的锁状态
+                QMap<int, QString> prevLockHasKeyMap;
+                if (m_locksRFIDStatus.find(nodeId) != m_locksRFIDStatus.end()) {
+                    prevLockHasKeyMap = m_locksRFIDStatus[nodeId].lockRFIDMap;
+                }
+
+                QString prevHasLock = prevLockHasKeyMap.contains(lockNum) ? prevLockHasKeyMap[lockNum] : "";
+                QString currHasLock = rfidCard;
+
+                if (!prevHasLock.isEmpty()) {
+//                    qInfo() << "[LockRFID] " << prevHasLock << currHasLock;
+                    if (prevHasLock != currHasLock && !currHasLock.isEmpty() && currHasLock != "00000000") {
+                        qInfo() << "[归还检测] 检测到" << (lockNum+1) << "号锁插入!";
+                        qInfo() << "[归还检测]" << (lockNum+1) << "号锁NFC卡号:" << currHasLock;
+
+                        emit nfcDeviceDetected(currHasLock, "lock", lockNum);
+                        emit signalLockNfcDeviceDetected(currHasLock);
+                    }
+                }
+                // ====================================================
 
                 if (m_locksRFIDStatus.find(nodeId) == m_locksRFIDStatus.end()) {
                     m_locksRFIDStatus.insert(nodeId, lockStatus);
@@ -1857,6 +1925,21 @@ void CANClient::testFunc()
 //    readSingleKeyRFIDAsync(true);
 //    msleep(50);
 //    readSingleKeyRFIDAsync(false);
-//    msleep(50);
+    //    msleep(50);
+}
+
+QString CANClient::getLockRFID(int lockNum)
+{
+    for (auto iter = m_locksRFIDStatus.begin(); iter != m_locksRFIDStatus.end(); ++iter) {
+        CANLockRFIDStatus itemRFID = iter.value();
+        if (itemRFID.lockRFIDMap.contains(lockNum) &&
+                itemRFID.lockRFIDMap[lockNum].isEmpty() &&
+                itemRFID.lockRFIDMap[lockNum] != "00000000") {
+            return itemRFID.lockRFIDMap[lockNum];
+        }
+    }
+    readLockRFIDStatusAsync();
+    msleep(CAN_SLEEP_TIME);
+    return QString();
 }
 

+ 2 - 0
src/usr/CANClient.h

@@ -128,6 +128,8 @@ public:
 
     void testFunc();
 
+    QString getLockRFID(int lockNum);
+
     bool workingKey() const {
         return m_workingKey;
     }

+ 2 - 0
src/usr/config.h

@@ -102,12 +102,14 @@ public:
     QString isolationPointById = "/admin-api/iscs/isolation-point/selectIsolationPointById";                   // 根据隔离点ID获取隔离点具体信息
 
     QString uploadJobTicketUrl = "/admin-api/isc/work-handle/insertWorkTicket";
+    QString updateWorkTicketUrl = "/admin-api/isc/work-handle/updateWorkTicket";
     QString uploadPositionInfoUrl = "/admin-api/isc/work-handle/updatePointLock";
 
     QString updateColockUrl = "/admin-api/isc/work-handle/updateUserLock";
     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 updateKeyBack = "/admin-api/isc/work-handle/updateKeyBack";
 
     QString workTicketByNodeId = "/admin-api/isc/work-handle/getWorkTicketByNodeId";