package com.ld.igds.n2.manager; import com.ld.igds.common.CoreDeviceService; import com.ld.igds.constant.DeviceStatus; import com.ld.igds.constant.DeviceType; import com.ld.igds.io.RemoteControlService; import com.ld.igds.io.request.DeviceControlRequest; import com.ld.igds.io.request.ExeDevice; import com.ld.igds.models.Device; import java.util.ArrayList; import java.util.List; import java.util.concurrent.Callable; /** * 自动气调模式执行,首先针对双通道设备,先开口,第二次执行开风机 */ public class N2AutoControlTask implements Callable { private DeviceControlRequest request; private CoreDeviceService coreDeviceService; RemoteControlService remoteControlService; public void setRequest(DeviceControlRequest request) { this.request = request; } public void setRemoteControlService(RemoteControlService remoteControlService) { this.remoteControlService = remoteControlService; } public void setCoreDeviceService(CoreDeviceService coreDeviceService) { this.coreDeviceService = coreDeviceService; } public N2AutoControlTask() { super(); } public N2AutoControlTask(DeviceControlRequest request, CoreDeviceService coreDeviceService, RemoteControlService remoteControlService) { this.request = request; this.coreDeviceService = coreDeviceService; this.remoteControlService = remoteControlService; } @Override public String call() throws Exception { //第一輪執行 List listNext = exeCall(1, request.getDeviceList()); //第二轮执行 Thread.sleep(5 * 1000); if (null == listNext || listNext.isEmpty()) { exeCall(2, request.getDeviceList()); } return "SUCCESS"; } private List exeCall(int index, List listExeDevice) throws Exception { if (listExeDevice.isEmpty()) return null; List result = new ArrayList<>(); //设备状态查询 remoteControlService.queryStatus(request); Thread.sleep(5 * 1000); //取设备状态 List listDevice = coreDeviceService.getCacheDeviceBySerId(request.getCompanyId(), request.getSerId()); //第一轮执行 String curStatus; for (ExeDevice device : listExeDevice) { if (DeviceStatus.W_OPEN.getCode().equals(device.getTargetStatus())) { device.setPassCode(Integer.valueOf(device.getLink())); todoControl(device); continue; } if (DeviceStatus.W_CLOSE.getCode().equals(device.getTargetStatus())) { curStatus = this.getCurDeviceStatus(device.getId(), listDevice); if (DeviceStatus.F_OPEN.getCode().equals(curStatus)) { //第一轮执行-关风机 device.setTargetStatus(DeviceStatus.F_CLOSE.getCode()); todoControl(device); //第二次执行关闭窗户 device.setTargetStatus(DeviceStatus.W_CLOSE.getCode()); device.setPassCode(Integer.valueOf(device.getLink())); result.add(device); } else { device.setPassCode(Integer.valueOf(device.getLink())); todoControl(device); } continue; } if (DeviceStatus.F_OPEN.getCode().equals(device.getTargetStatus())) { if (DeviceType.TYPE_02.getCode().equals(device.getType()) || DeviceType.TYPE_0C.getCode().equals(device.getType())) { curStatus = this.getCurDeviceStatus(device.getId(), listDevice); if (DeviceStatus.W_CLOSE.getCode().equals(curStatus)) { result.add(device); //第一轮执行-开窗 device.setPassCode(Integer.valueOf(device.getLink())); device.setTargetStatus(DeviceStatus.W_OPEN.getCode()); todoControl(device); } else { todoControl(device); } } else { todoControl(device); } continue; } todoControl(device); } if (index == 1) return result; return null; } /** * 执行操作 * * @param device */ private void todoControl(ExeDevice device) { List temp = new ArrayList<>(); temp.add(device); request.setDeviceList(temp); remoteControlService.deviceControl(request); } private String getCurDeviceStatus(String deviceId, List listDevice) { for (Device device : listDevice) { if (deviceId.equals(device.getId())) return device.getStatus(); } return ""; } }