jinx недель назад: 2
Родитель
Сommit
844de94d0b
2 измененных файлов с 238 добавлено и 36 удалено
  1. 37 8
      src/api.js
  2. 201 28
      src/views/Review/index.vue

+ 37 - 8
src/api.js

@@ -61,21 +61,50 @@ export function startReport(data) {
     }
   });
 }
-export function stopReport(data) {
-  const url = `https://test.4dkankan.com/openDevice/end`;
+export function stopReport(data) {
+  const url = `https://test.4dkankan.com/openDevice/end`;
+
+  return axios.post(url, data).then((res) => {
+    if (res?.data?.code === 200 || res?.status === 200) {
+      return res?.data || "stop report success";
+    } else {
+      throw res?.data?.message || "stop report failed";
+    }
+  });
+}
+export function getDebugMessages(deviceId = "sn123") {
+  const currentDeviceId = encodeURIComponent(deviceId || "sn123");
+  const url = `https://test.4dkankan.com/openDevice/mqtt/debug/messages/${currentDeviceId}`;
+
+  return axios.get(url).then((res) => res?.data);
+}
+export function getNewDebugMessages(deviceId = "sn123") {
+  const currentDeviceId = encodeURIComponent(deviceId || "sn123");
+  const url = `https://test.4dkankan.com/openDevice/mqtt/tagdebug/messages/${currentDeviceId}`;
+
+  return axios.get(url).then((res) => res?.data);
+}
+export function newStartReport(data) {
+  const url = `https://test.4dkankan.com/openDevice/mqtt/session/start`;
 
   return axios.post(url, data).then((res) => {
-    if (res?.data?.code === 200 || res?.status === 200) {
+    if (res?.data?.code === 200 || res?.status === 200) {
       return res?.data || "stop report success";
     } else {
       throw res?.data?.message || "stop report failed";
     }
   });
 }
+export function newStopReport(data) {
+  const url = `https://test.4dkankan.com/openDevice/mqtt/session/end`;
 
-export function getDebugMessages(deviceId = "sn123") {
-  const currentDeviceId = encodeURIComponent(deviceId || "sn123");
-  const url = `https://test.4dkankan.com/openDevice/mqtt/debug/messages/${currentDeviceId}`;
-
-  return axios.get(url).then((res) => res?.data);
+  return axios.post(url, data).then((res) => {
+    if (res?.data?.code === 200 || res?.status === 200) {
+      return res?.data || "stop report success";
+    } else {
+      throw res?.data?.message || "stop report failed";
+    }
+  });
 }
+
+export const newStoptReport = newStopReport;

+ 201 - 28
src/views/Review/index.vue

@@ -2,11 +2,35 @@
   <div class="review-page">
     <section class="hero-card">
       <div class="hero-copy">
-        <h2 class="title">
-          轮询设备消息
-        </h2>
+        <h2 class="title">轮询设备消息</h2>
+      </div>
+      <div style="display: block">
+        <span class="field-label">场景码</span>
+        <el-input
+          v-model.trim="sceneNum"
+          placeholder="请输入 sceneNum"
+          clearable
+          style="margin-top: 5px"
+        />
+        <div class="toolbar" style="margin-top: 10px">
+          <el-button
+            class="action-btn"
+            type="primary"
+            plain
+            @click="handleStartRecord"
+          >
+            开始记录
+          </el-button>
+          <el-button
+            class="action-btn"
+            type="danger"
+            plain
+            @click="handleEndRecord"
+          >
+            结束记录
+          </el-button>
+        </div>
       </div>
-
       <div class="toolbar">
         <el-tag
           :type="isPolling ? 'success' : 'info'"
@@ -61,33 +85,25 @@
         <h3>消息列表</h3>
       </div>
 
-      <div
-        v-if="messages.length"
-        class="record-list"
-      >
+      <div v-if="messages.length" class="record-list">
         <article
           v-for="(message, index) in messages"
           :key="message.id"
           class="record-card"
         >
-          <p class="record-order">
-            第 {{ index + 1 }} 条
-          </p>
-          <pre class="record-payload">{{ message.payloadText }}</pre>
+          <p class="record-order">第 {{ index + 1 }} 条</p>
+          <pre class="record-payload"><code>{{ message.codeText }}</code></pre>
         </article>
       </div>
 
-      <el-empty
-        v-else
-        description="点击开启轮询后显示消息"
-      />
+      <el-empty v-else description="点击开启轮询后显示消息" />
     </section>
   </div>
 </template>
 
 <script>
-import { ElMessage } from "element-plus";
-import { getDebugMessages } from "@/api.js";
+import { ElMessage, ElMessageBox } from "element-plus";
+import { getNewDebugMessages, newStartReport, newStopReport } from "@/api.js";
 
 const POLLING_INTERVAL = 500;
 
@@ -102,6 +118,7 @@ export default {
       pollTimer: null,
       errorText: "",
       sequence: 0,
+      sceneNum: "SG-t-rQ14yS9VjVp",
     };
   },
   beforeUnmount() {
@@ -122,7 +139,7 @@ export default {
       this.isRequesting = true;
 
       try {
-        const response = await getDebugMessages(currentDeviceId);
+        const response = await getNewDebugMessages(currentDeviceId);
         const normalizedMessages = this.normalizeMessages(response);
         this.messages = normalizedMessages;
         this.errorText = "";
@@ -153,6 +170,79 @@ export default {
       this.isPolling = false;
       this.isRequesting = false;
     },
+    async handleStartRecord() {
+      const currentDeviceId = this.deviceId || "sn123";
+      const currentSceneNum = this.sceneNum || "SG-t-rQ14yS9VjVp";
+
+      if (!currentDeviceId) {
+        ElMessage({
+          message: "请输入 deviceId",
+          type: "warning",
+        });
+        return;
+      }
+
+      if (!currentSceneNum) {
+        ElMessage({
+          message: "请输入 sceneNum",
+          type: "warning",
+        });
+        return;
+      }
+
+      try {
+        const response = await newStartReport({
+          deviceId: currentDeviceId,
+          sceneCode: currentSceneNum,
+        });
+
+        this.errorText = "";
+        ElMessage({
+          message: "开始记录成功",
+          type: "success",
+        });
+      } catch (err) {
+        this.errorText = err?.message || err || "开始记录失败";
+      }
+    },
+    async handleEndRecord() {
+      const currentDeviceId = this.deviceId || "sn123";
+      const currentSceneNum = this.sceneNum || "SG-t-rQ14yS9VjVp";
+
+      if (!currentDeviceId) {
+        ElMessage({
+          message: "请输入 deviceId",
+          type: "warning",
+        });
+        return;
+      }
+
+      if (!currentSceneNum) {
+        ElMessage({
+          message: "请输入 sceneNum",
+          type: "warning",
+        });
+        return;
+      }
+
+      try {
+        const response = await newStopReport({
+          deviceId: currentDeviceId,
+          sceneCode: currentSceneNum,
+        });
+
+        this.errorText = "";
+
+        if (response?.data) {
+          ElMessage({
+            message: "结束记录成功",
+            type: "info",
+          });
+        }
+      } catch (err) {
+        this.errorText = err?.message || err || "结束记录失败";
+      }
+    },
     handleStartPolling() {
       if (!this.deviceId) {
         ElMessage({
@@ -180,15 +270,51 @@ export default {
 
       return list.map((item) => {
         this.sequence += 1;
-        const payload = item?.payload;
+        const source = this.pickMessageSource(item);
+        const uuidText = this.toDisplayText(source?.uuid || item?.uuid);
 
         return {
-          id: `${this.sequence}-${Date.now()}`,
-          payloadText: this.formatPayload(payload),
+          id:
+            item?.id ||
+            item?._id ||
+            `${this.sequence}-${
+              source?.sessionId || source?.createTime || Date.now()
+            }`,
+          uuid: uuidText,
+          deviceId: this.toDisplayText(source?.deviceId),
+          epc: this.toDisplayText(source?.epc),
+          sessionId: this.toDisplayText(source?.sessionId),
+          createTime: this.toDisplayText(source?.createTime),
+          floor: this.toDisplayText(source?.floor),
+          name: this.toDisplayText(source?.name),
+          codeText: this.formatMessageCode(source, uuidText),
         };
       });
     },
+    pickMessageSource(item) {
+      if (item?.payload && typeof item.payload === "object") {
+        return item.payload;
+      }
+
+      if (item?.data && typeof item.data === "object") {
+        return item.data;
+      }
+
+      return item || {};
+    },
     pickMessageList(response) {
+      if (Array.isArray(response?.messages)) {
+        return response.messages;
+      }
+
+      if (Array.isArray(response?.list)) {
+        return response.list;
+      }
+
+      if (Array.isArray(response?.records)) {
+        return response.records;
+      }
+
       if (Array.isArray(response?.ataMessages)) {
         return response.ataMessages;
       }
@@ -197,6 +323,10 @@ export default {
         return response.dataMessages;
       }
 
+      if (Array.isArray(response?.data)) {
+        return response.data;
+      }
+
       if (response?.data && Array.isArray(response.data.ataMessages)) {
         return response.data.ataMessages;
       }
@@ -205,6 +335,22 @@ export default {
         return response.data.dataMessages;
       }
 
+      if (response?.data && Array.isArray(response.data.messages)) {
+        return response.data.messages;
+      }
+
+      if (response?.data && Array.isArray(response.data.list)) {
+        return response.data.list;
+      }
+
+      if (response?.data && Array.isArray(response.data.records)) {
+        return response.data.records;
+      }
+
+      if (Array.isArray(response?.data?.data)) {
+        return response.data.data;
+      }
+
       if (
         response?.data?.data &&
         Array.isArray(response.data.data.ataMessages)
@@ -219,22 +365,45 @@ export default {
         return response.data.data.dataMessages;
       }
 
+      if (response?.data?.data && Array.isArray(response.data.data.messages)) {
+        return response.data.data.messages;
+      }
+
+      if (response?.data?.data && Array.isArray(response.data.data.list)) {
+        return response.data.data.list;
+      }
+
+      if (response?.data?.data && Array.isArray(response.data.data.records)) {
+        return response.data.data.records;
+      }
+
       if (Array.isArray(response)) {
         return response;
       }
 
       return [];
     },
-    formatPayload(payload) {
-      if (typeof payload === "string") {
-        return payload;
+    toDisplayText(value) {
+      if (value === undefined || value === null || value === "") {
+        return "-";
       }
 
-      if (payload === undefined) {
-        return "";
+      if (typeof value === "object") {
+        return JSON.stringify(value);
       }
 
-      return JSON.stringify(payload, null, 2);
+      return String(value);
+    },
+    formatMessageCode(source, uuidText) {
+      return [
+        `uuid: ${uuidText}`,
+        `deviceId: ${this.toDisplayText(source?.deviceId)}`,
+        `epc: ${this.toDisplayText(source?.epc)}`,
+        `sessionId: ${this.toDisplayText(source?.sessionId)}`,
+        `createTime: ${this.toDisplayText(source?.createTime)}`,
+        `floor: ${this.toDisplayText(source?.floor)}`,
+        `name: ${this.toDisplayText(source?.name)}`,
+      ].join("\n");
     },
   },
 };
@@ -389,6 +558,10 @@ export default {
   line-height: 1.6;
 }
 
+.record-payload code {
+  font-family: Consolas, "Courier New", monospace;
+}
+
 @media (max-width: 767px) {
   .review-page {
     padding: 12px 10px calc(18px + env(safe-area-inset-bottom));