skyline před 2 měsíci
rodič
revize
995c37a935

+ 21 - 0
haha-miniapp/src/main/java/com/haha/miniapp/controller/CallbackController.java

@@ -11,7 +11,12 @@ import com.haha.common.enums.NotifyType;
 import com.haha.common.enums.ProductAuditStatus;
 import com.haha.common.enums.RecognizeActionType;
 import com.haha.common.enums.RecognizeConsumeType;
+import com.haha.common.enums.DeviceDoorStatus;
+import com.haha.common.enums.NotifyType;
+import com.haha.common.enums.RecognizeActionType;
+import com.haha.common.enums.RecognizeConsumeType;
 import com.haha.entity.Order;
+import com.haha.service.DeviceService;
 import com.haha.service.OrderService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -59,6 +64,9 @@ public class CallbackController {
 
     @Autowired
     private OrderService orderService;
+    
+    @Autowired
+    private DeviceService deviceService;
 
     @Autowired
     private StringRedisTemplate redisTemplate;
@@ -174,6 +182,19 @@ public class CallbackController {
 
             redisTemplate.opsForHash().putAll(statusKey, statusData);
             redisTemplate.expire(statusKey, 30, TimeUnit.MINUTES);
+            
+            // 同步更新数据库中的门状态
+            try {
+                String doorStatus = DeviceDoorStatus.convertToStatus(status);
+                boolean updated = deviceService.updateDeviceDoorStatus(deviceId, doorStatus);
+                if (updated) {
+                    log.info("数据库门状态更新成功 - 设备: {}, 状态: {}", deviceId, doorStatus);
+                } else {
+                    log.warn("数据库门状态更新失败 - 设备: {}, 状态: {}", deviceId, doorStatus);
+                }
+            } catch (Exception e) {
+                log.error("更新数据库门状态异常 - 设备: {}", deviceId, e);
+            }
 
             DeviceDoorStatus doorStatus = DeviceDoorStatus.fromCode(status);
             if (doorStatus != null) {

+ 31 - 10
haha-mp/src/pages/shopping/shopping.vue

@@ -47,7 +47,7 @@
 </template>
 
 <script setup lang="ts">
-import { ref, onMounted, onUnmounted } from 'vue';
+import { ref, onMounted, onUnmounted, onActivated, onDeactivated } from 'vue';
 import { pollDeviceStatus, pollRecognizeResult, pollOrderInfo } from '../../api/status';
 import type { RecognizeResultResponse } from '../../api/status';
 
@@ -64,6 +64,18 @@ let countdownTimer: number | null = null;
 let statusCheckTimer: number | null = null;
 let isComponentActive = true; // 组件活跃状态标志
 
+// 统一的定时器清理函数
+const cleanupTimers = () => {
+  if (countdownTimer) {
+    clearInterval(countdownTimer);
+    countdownTimer = null;
+  }
+  if (statusCheckTimer) {
+    clearTimeout(statusCheckTimer);
+    statusCheckTimer = null;
+  }
+};
+
 onMounted(() => {
   // 标记当前页面轮询为活跃状态
   uni.setStorageSync('shoppingPollingActive', 'true');
@@ -89,17 +101,26 @@ onMounted(() => {
 onUnmounted(() => {
   // 设置组件为非活跃状态,停止所有轮询
   isComponentActive = false;
-  
-  if (countdownTimer) {
-    clearInterval(countdownTimer);
-    countdownTimer = null;
-  }
-  if (statusCheckTimer) {
-    clearTimeout(statusCheckTimer);
-    statusCheckTimer = null;
+  // 清理所有定时器
+  cleanupTimers();
+});
+
+// 页面获得焦点时重新激活轮询
+onActivated(() => {
+  if (doorStatus.value === 'opened' || doorStatus.value === 'closing') {
+    isComponentActive = true;
+    // 重新开始轮询
+    startStatusPolling();
   }
 });
 
+// 页面失去焦点时暂停轮询
+onDeactivated(() => {
+  isComponentActive = false;
+  // 清理定时器
+  cleanupTimers();
+});
+
 const startCountdown = () => {
   countdownTimer = setInterval(() => {
     if (countdown.value > 0) {
@@ -195,7 +216,7 @@ const startStatusPolling = async () => {
     }
     
     // 如果还在开门状态,继续轮询
-    if (doorStatus.value === 'opened') {
+    if (doorStatus.value === 'opened' || doorStatus.value === 'closing') {
       statusCheckTimer = setTimeout(() => {
         if (isComponentActive) {
           startStatusPolling();

+ 12 - 8
haha-service/src/main/java/com/haha/service/impl/HahaCallbackServiceImpl.java

@@ -4,6 +4,7 @@ import com.alibaba.fastjson2.JSON;
 import com.alibaba.fastjson2.JSONArray;
 import com.alibaba.fastjson2.JSONObject;
 import com.haha.common.constant.OrderConstants;
+import com.haha.common.enums.DeviceDoorStatus;
 import com.haha.entity.Device;
 import com.haha.entity.Order;
 import com.haha.mapper.DeviceMapper;
@@ -396,18 +397,21 @@ public class HahaCallbackServiceImpl implements HahaCallbackService {
     /**
      * 更新设备门状态
      */
-    private void updateDeviceDoorStatus(String deviceId, String doorStatus) {
+    private void updateDeviceDoorStatus(String deviceId, String status) {
         try {
-            Device device = deviceMapper.selectByDeviceId(deviceId);
-            if (device != null) {
-                device.setDoorStatus(doorStatus);
-                deviceMapper.updateById(device);
-                log.info("更新设备 {} 门状态为: {}", deviceId, doorStatus);
+            // 将原始状态码转换为数据库存储格式
+            String doorStatus = DeviceDoorStatus.convertToStatus(status);
+            
+            // 使用专门的更新方法直接更新数据库
+            int result = deviceMapper.updateDoorStatus(deviceId, doorStatus);
+            
+            if (result > 0) {
+                log.info("更新设备 {} 门状态为: {} (原始状态: {})" , deviceId, doorStatus, status);
             } else {
-                log.warn("未找到设备: {}", deviceId);
+                log.warn("未找到设备或更新失败: {}", deviceId);
             }
         } catch (Exception e) {
-            log.error("更新设备门状态失败 - 设备: {}, 状态: {}", deviceId, doorStatus, e);
+            log.error("更新设备门状态失败 - 设备: {}, 原始状态: {}", deviceId, status, e);
         }
     }