Selaa lähdekoodia

完善设备开关机信号处理逻辑。

Memory_LG 8 kuukautta sitten
vanhempi
commit
d8cd43874e

+ 71 - 16
src/main/java/com/sooka/sponest/lawenforcement/device/controller/DeviceController.java

@@ -1,18 +1,25 @@
 package com.sooka.sponest.lawenforcement.device.controller;
 
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.TypeReference;
+import com.ruoyi.common.core.utils.StringUtils;
 import com.ruoyi.common.core.web.controller.BaseController;
 import com.ruoyi.common.core.web.domain.AjaxResult;
 import com.sooka.sponest.lawenforcement.device.domain.DeviceBO;
 import com.sooka.sponest.lawenforcement.device.service.IDeviceService;
 import com.sooka.sponest.lawenforcement.record.service.ILawenforcementRecordService;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
+import java.util.List;
+
 /**
  * @author LG
  */
 @RestController
 @RequestMapping("/device")
+@Slf4j
 public class DeviceController extends BaseController {
 
     @Autowired
@@ -21,43 +28,91 @@ public class DeviceController extends BaseController {
     @Autowired
     private IDeviceService deviceService;
 
+    private final String OPEN = "1";
+    private final String CLOSE = "0";
+
+    /**
+     * 实时接受设备开关机状态集合
+     * @param arr
+     * @return
+     */
     @PostMapping("/deviceOpenOrClose")
-    public AjaxResult deviceOpenOrClose(@RequestBody DeviceBO bo){
-        if("0".equals(bo.getStatus())){
-            close(bo);
-        }else if("1".equals(bo.getStatus())){
-            open(bo);
-        }else{
-            return AjaxResult.error("状态异常");
+    public AjaxResult deviceOpenOrClose(@RequestBody String arr){
+        log.info("接受的执法设备参数:{}",arr);
+        if(StringUtils.isEmpty(arr)){
+            return AjaxResult.error("数据为空");
         }
+        //将参数转为实体类集合
+        List<DeviceBO> deviceList = JSON.parseObject(arr, new TypeReference<List<DeviceBO>>(){});
+
+        //遍历设备集合,判断设备是否开机
+        deviceList.forEach(bo->{
+            //设备关机状态执行:调用单设备关机信号
+            if(CLOSE.equals(bo.getStatus())){
+                close(bo);
+            }
+            //设备开机状态执行:调用单设备开机信号
+            if(OPEN.equals(bo.getStatus())){
+                open(bo);
+            }
+        });
+        //返回信息
         return AjaxResult.success();
     }
 
+    /**
+     * 单设备开机信号
+     * @param bo
+     * @return
+     */
     @PostMapping("/open")
     public AjaxResult open(@RequestBody DeviceBO bo) {
         deviceService.open(bo);
         return AjaxResult.success();
     }
 
-    // 可以添加其他方法来停止定时任务,例如:
+    /**
+     * 单设备关机信号
+     * @param bo
+     * @return
+     */
+    @PostMapping("/close")
+    public AjaxResult close(@RequestBody DeviceBO bo){
+        //设备关机先尝试删除定时任务
+        deviceService.cancelTask(bo.getCode());
+        //设置任务结束时间和任务状态为完成
+        recordService.updateRecordLogEndTime(bo);
+        return AjaxResult.success();
+    }
+
+    /**
+     * 手动停止定时任务接口
+     * @param deviceCode
+     * @return
+     */
     @PostMapping("/stop/{deviceCode}")
     public AjaxResult stopDevice(@PathVariable String deviceCode) {
         deviceService.cancelTask(deviceCode);
         return AjaxResult.success();
     }
 
+    /**
+     * 获取已开启定时任务的设备列表
+     * @return
+     */
     @GetMapping("/getTaskList")
     public AjaxResult getTaskList(){
         return AjaxResult.success(deviceService.getTaskList());
     }
 
-    @PostMapping("/close")
-    public AjaxResult close(@RequestBody DeviceBO bo){
-        System.out.println(" 设备关闭 ");
-        //设备关机先尝试删除定时任务
-        deviceService.cancelTask(bo.getDeviceCode());
-        //设置任务结束时间和任务状态为完成
-        recordService.updateRecordLogEndTime(bo);
-        return AjaxResult.success();
+    /**
+     * 获取正在执行工单任务的设备列表
+     * @return
+     */
+    @GetMapping("/getOpenedDeviceList")
+    public AjaxResult getOpenedDeviceList(){
+        return AjaxResult.success(deviceService.getTaskOpenedDevice());
     }
+
+
 }

+ 3 - 1
src/main/java/com/sooka/sponest/lawenforcement/device/domain/DeviceBO.java

@@ -2,10 +2,12 @@ package com.sooka.sponest.lawenforcement.device.domain;
 
 import lombok.Getter;
 import lombok.Setter;
+import lombok.ToString;
 
 @Setter
 @Getter
+@ToString
 public class DeviceBO {
-    private String deviceCode;
+    private String code;
     private String status;
 }

+ 5 - 0
src/main/java/com/sooka/sponest/lawenforcement/device/service/IDeviceService.java

@@ -3,6 +3,7 @@ package com.sooka.sponest.lawenforcement.device.service;
 import com.sooka.sponest.lawenforcement.device.domain.DeviceBO;
 
 import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentSkipListSet;
 import java.util.concurrent.ScheduledFuture;
 
 public interface IDeviceService {
@@ -11,4 +12,8 @@ public interface IDeviceService {
     void cancelTask(String deviceCode);
 
     ConcurrentHashMap<String, ScheduledFuture<?>> getTaskList();
+
+    void setOpenedDevice(String deviceCode);
+    void removeOpenedDevice(String deviceCode);
+    ConcurrentSkipListSet<String> getTaskOpenedDevice();
 }

+ 65 - 16
src/main/java/com/sooka/sponest/lawenforcement/device/service/impl/DeviceServiceImpl.java

@@ -13,27 +13,45 @@ public class DeviceServiceImpl implements IDeviceService {
     private final ConcurrentHashMap<String, ScheduledFuture<?>> scheduledTasks = new ConcurrentHashMap<>();
     private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(10);
 
+    //用于存储正在执行任务的集合
+    private final ConcurrentSkipListSet<String> openedDevice = new ConcurrentSkipListSet<>();
+
+
+    /**
+     * 设备开机状态调用的接口
+     * @param bo
+     */
     @Override
     public void open(DeviceBO bo) {
         System.out.println("设备开启");
-        String deviceCode = bo.getDeviceCode();
-
-        // 先取消之前的任务(如果存在)
-        cancelTask(deviceCode);
-
-        // 创建一个新的定时任务
-        Runnable task = () -> {
-            System.out.println("设备开启超过六十分钟: " + deviceCode);
-            /*
-             *  此处发送开机未执法告警
-             */
-            cancelTask(deviceCode); // 确保任务只执行一次
-        };
-        // 延迟60分钟执行
-        ScheduledFuture<?> future = scheduler.schedule(task, 2, TimeUnit.MINUTES);
-        scheduledTasks.put(deviceCode, future);
+        String deviceCode = bo.getCode();
+
+        ScheduledFuture<?> future = scheduledTasks.get(deviceCode);
+        //设备开机时,如果没有开启定时任务,并且没有正在执行工单任务时,开启定时任务
+        if(future == null || future.isCancelled() || openedDevice.contains(deviceCode)){
+            // 创建一个新的定时任务
+            Runnable task = () -> {
+                System.out.println("设备开启超过六十分钟: " + deviceCode);
+                /*
+                 *  此处发送开机未执法告警
+                 */
+                cancelTask(deviceCode); // 确保任务只执行一次
+            };
+            // 延迟60分钟执行
+            ScheduledFuture<?> futureNew = scheduler.schedule(task, 2, TimeUnit.MINUTES);
+            scheduledTasks.put(deviceCode, futureNew);
+        }else{
+            System.out.println(" 设备已开启定时任务!或正在执行工单任务!不开启定时任务");
+        }
+
     }
 
+    /**
+     * 移除定时任务
+     * 1:60分钟定时任务已经执行完成
+     * 2:设备开始执行工单任务时移除
+     * @param deviceCode
+     */
     @Override
     // 取消定时任务的方法
     public void cancelTask(String deviceCode) {
@@ -44,8 +62,39 @@ public class DeviceServiceImpl implements IDeviceService {
         }
     }
 
+    /**
+     * 查看已开启定时任务的设备信息
+     * @return
+     */
     @Override
     public ConcurrentHashMap<String, ScheduledFuture<?>> getTaskList() {
         return scheduledTasks;
     }
+
+    /**
+     * 将执行任务的设备放入到集合中
+     * @param deviceCode
+     */
+    @Override
+    public void setOpenedDevice(String deviceCode){
+        openedDevice.add(deviceCode);
+    }
+
+    /**
+     * 将执行完成工单任务的设备移除集合
+     * @param deviceCode
+     */
+    @Override
+    public void removeOpenedDevice(String deviceCode){
+        openedDevice.remove(deviceCode);
+    }
+
+    /**
+     * 查看正在执行工单任务的设备列表
+     * @return
+     */
+    @Override
+    public ConcurrentSkipListSet<String> getTaskOpenedDevice(){
+        return openedDevice;
+    }
 }

+ 3 - 0
src/main/java/com/sooka/sponest/lawenforcement/record/service/impl/LawenforcementRecordServiceImpl.java

@@ -114,6 +114,7 @@ public class LawenforcementRecordServiceImpl implements ILawenforcementRecordSer
         lawenforcementRecordMapper.addRecordLog(lawenforcementRecordLog);
         //绑定设备后关闭定时任务
         deviceService.cancelTask(lawenforcementRecordLog.getDeviceId());
+        deviceService.setOpenedDevice(lawenforcementRecordLog.getDeviceId());
         return i;
     }
 
@@ -123,6 +124,8 @@ public class LawenforcementRecordServiceImpl implements ILawenforcementRecordSer
         lawenforcementRecordMapper.updateRecordStatus(bo);
         //设置任务结束时间
         lawenforcementRecordMapper.updateRecordLogEndTime(bo);
+        //从正在执行任务的设备集合中移除信息
+        deviceService.removeOpenedDevice(bo.getCode());
     }
 
 }