| | |
| | | import java.sql.ResultSet; |
| | | import java.sql.SQLException; |
| | | import java.util.ArrayList; |
| | | import java.util.Collections; |
| | | import java.util.List; |
| | | import java.util.concurrent.ConcurrentHashMap; |
| | | public class Dell_tag { |
| | | static List<LocationTag> locationTags; |
| | | public static List<LocationTag> locationTags; |
| | | private static ConcurrentHashMap<String, LocationTag> tagMap; // 设备ID->标签对象的映射 |
| | | public static List<LocationTag> getlocationTags() throws SQLException{ |
| | | List<LocationTag> locationTags = new ArrayList<>(); |
| | | List<LocationTag> locationTags = new ArrayList<>(); |
| | | tagMap = new ConcurrentHashMap<>(); // 初始化映射 |
| | | ResultSet rs =DBConnector.queryTableData("location_tag"); |
| | | if (rs == null) { |
| | | // 说明底层拿不到数据,直接抛异常或打印日志 |
| | | throw new SQLException("DBConnector.queryTableData returned null, " |
| | | + "please check database connection & SQL."); |
| | | } |
| | | while (rs.next()) { |
| | | LocationTag locationTag = new LocationTag(); |
| | | locationTag.setId((int) rs.getLong("id")); |
| | |
| | | locationTag.setIpAddress(rs.getString("ipAddress")); |
| | | locationTag.setIpPort(rs.getString("Interaction_Type")); |
| | | locationTags.add(locationTag); |
| | | tagMap.put(locationTag.getDeviceNumber(), locationTag); // 添加到映射 |
| | | } |
| | | return locationTags; |
| | | } |
| | |
| | | DBConnector.executeUpdate(sql, deviceId); |
| | | } |
| | | |
| | | /** |
| | | * 根据设备ID高效修改属性值 |
| | | * @param deviceId 设备ID(device_id) |
| | | * @param propertyName 属性名(需与setter方法匹配) |
| | | * @param value 新属性值 |
| | | */ |
| | | public static void updateLocationTagProperty(String deviceId, String propertyName, String value) { |
| | | LocationTag tag = tagMap.get(deviceId); |
| | | if (tag == null) return; // 标签不存在则忽略 |
| | | |
| | | // 根据属性名调用对应setter |
| | | switch (propertyName) { |
| | | case "id": tag.setId(Integer.parseInt(value)); break; |
| | | case "deviceNumber": tag.setDeviceNumber(value); break; |
| | | case "deviceName": tag.setDeviceName(value); break; |
| | | case "deviceVersion": tag.setDeviceVersion(value); break; |
| | | case "deviceCardNumber": tag.setDeviceCardNumber(value); break; |
| | | case "deviceType": tag.setDeviceType(value); break; |
| | | case "team": tag.setTeam(value); break; |
| | | case "group": tag.setGroup(value); break; |
| | | case "department": tag.setDepartment(value); break; |
| | | case "iconAddress": tag.setIconAddress(value); break; |
| | | case "gender": tag.setGender(value); break; |
| | | case "ethnicity": tag.setEthnicity(value); break; |
| | | case "communicationAddress": tag.setCommunicationAddress(value); break; |
| | | case "boundPhone": tag.setBoundPhone(value); break; |
| | | case "idNumber": tag.setIdNumber(value); break; |
| | | case "position": tag.setPosition(value); break; |
| | | case "boundPlateNumber": tag.setBoundPlateNumber(value); break; |
| | | case "faceAddress": tag.setFaceAddress(value); break; |
| | | case "heartRate": tag.setHeartRate(value); break; |
| | | case "bloodPressure": tag.setBloodPressure(value); break; |
| | | case "bloodOxygen": tag.setBloodOxygen(value); break; |
| | | case "temperature": tag.setTemperature(value); break; |
| | | case "sosStatus": tag.setSosStatus(value); break; |
| | | case "motionStatus": tag.setMotionStatus(value); break; |
| | | case "onlineStatus": tag.setOnlineStatus(value); break; |
| | | case "searchStatus": tag.setSearchStatus(value); break; |
| | | case "batteryStatus": tag.setBatteryStatus(value); break; |
| | | case "deviceBattery": tag.setDeviceBattery(value); break; |
| | | case "removalStatus": tag.setRemovalStatus(value); break; |
| | | case "collisionStatus": tag.setCollisionStatus(value); break; |
| | | case "elevationStatus": tag.setElevationStatus(value); break; |
| | | case "gatheringCount": tag.setGatheringCount(value); break; |
| | | case "proximityAlarm": tag.setProximityAlarm(value); break; |
| | | case "area": tag.setArea(value); break; |
| | | case "xCoordinate": tag.setXCoordinate(value); break; |
| | | case "yCoordinate": tag.setYCoordinate(value); break; |
| | | case "zCoordinate": tag.setZCoordinate(value); break; |
| | | case "floor": tag.setFloor(value); break; |
| | | case "speed": tag.setSpeed(value); break; |
| | | case "locationSource": tag.setLocationSource(value); break; |
| | | case "lastUwbSignalTime": tag.setLastUwbSignalTime(value); break; |
| | | case "lastSatelliteSignalTime": tag.setLastSatelliteSignalTime(value); break; |
| | | case "uwbTimeSlot": tag.setUwbTimeSlot(value); break; |
| | | case "latestRangingSeq": tag.setLatestRangingSeq(value); break; |
| | | case "latestRangingBaseId": tag.setLatestRangingBaseId(value); break; |
| | | case "latestRangingDistance": tag.setLatestRangingDistance(value); break; |
| | | case "latestRangingBaseCount": tag.setLatestRangingBaseCount(value); break; |
| | | case "latestRangingSignalStrength": tag.setLatestRangingSignalStrength(value); break; |
| | | case "utcTime": tag.setUtcTime(value); break; |
| | | case "latitude": tag.setLatitude(value); break; |
| | | case "longitude": tag.setLongitude(value); break; |
| | | case "satelliteQuality": tag.setSatelliteQuality(value); break; |
| | | case "hdop": tag.setHdop(value); break; |
| | | case "satelliteCount": tag.setSatelliteCount(value); break; |
| | | case "altitude": tag.setAltitude(value); break; |
| | | case "differentialTime": tag.setDifferentialTime(value); break; |
| | | case "geoidHeight": tag.setGeoidHeight(value); break; |
| | | case "satelliteSpeed": tag.setSatelliteSpeed(value); break; |
| | | case "lastBarometricValue": tag.setLastBarometricValue(value); break; |
| | | case "recentCoordinates": tag.setRecentCoordinates(value); break; |
| | | case "recentBarometricValues": tag.setRecentBarometricValues(value); break; |
| | | case "offlineTime": tag.setOfflineTime(value); break; |
| | | case "onlineTime": tag.setOnlineTime(value); break; |
| | | case "offlineDuration": tag.setOfflineDuration(value); break; |
| | | case "onlineDuration": tag.setOnlineDuration(value); break; |
| | | case "motionlessStartTime": tag.setMotionlessStartTime(value); break; |
| | | case "motionlessEndTime": tag.setMotionlessEndTime(value); break; |
| | | case "motionlessDuration": tag.setMotionlessDuration(value); break; |
| | | case "validSatelliteSignal": tag.setValidSatelliteSignal(value); break; |
| | | case "company": tag.setCompany(value); break; |
| | | case "sleepTime": tag.setSleepTime(value); break; |
| | | case "vibrationTime": tag.setVibrationTime(value); break; |
| | | case "frequency": tag.setFrequency(value); break; |
| | | case "motionlessTime": tag.setMotionlessTime(value); break; |
| | | case "accelerationValue": tag.setAccelerationValue(value); break; |
| | | case "imuTime": tag.setImuTime(value); break; |
| | | case "reserved1": tag.setReserved1(value); break; |
| | | case "reserved2": tag.setReserved2(value); break; |
| | | case "reserved3": tag.setReserved3(value); break; |
| | | case "reserved4": tag.setReserved4(value); break; |
| | | case "reserved5": tag.setReserved5(value); break; |
| | | case "ipAndPort": tag.setIpAndPort(value); break; |
| | | case "interactionType": tag.setInteractionType(value); break; |
| | | case "ipAddress": tag.setIpAddress(value); break; |
| | | case "ipPort": tag.setIpPort(value); break; |
| | | default: |
| | | throw new IllegalArgumentException("无效属性: " + propertyName); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 根据设备ID获取标签对象(高效访问) |
| | | * @param deviceId 设备ID |
| | | * @return 标签对象(不存在返回null) |
| | | */ |
| | | public static LocationTag getTagByDeviceId(String deviceId) { |
| | | return tagMap.get(deviceId); |
| | | } |
| | | |
| | | //获取所有的tagid |
| | | public static List<String> getAlldeviceIds() { |
| | | List<String> types = new ArrayList<>(); |
| | |
| | | } |
| | | return types; |
| | | } |
| | | |
| | | /** |
| | | * 获取所有在线状态(onlineStatus=1)的设备(高效内存操作) |
| | | * @return 不可修改的LocationTag集合(避免外部修改缓存) |
| | | */ |
| | | public static List<LocationTag> getOnlineLocationTags() { |
| | | if (tagMap == null || tagMap.isEmpty()) { |
| | | return Collections.emptyList(); // 缓存为空时返回空集合 |
| | | } |
| | | |
| | | List<LocationTag> onlineTags = new ArrayList<>(); |
| | | for (LocationTag tag : tagMap.values()) { |
| | | if ("1".equals(tag.getOnlineStatus())) { // 字符串比较避免NPE |
| | | onlineTags.add(tag); |
| | | } |
| | | } |
| | | return Collections.unmodifiableList(onlineTags); // 返回不可变集合 |
| | | } |
| | | |
| | | /** |
| | | * 快速获取LocationTag对象的总数(使用内存缓存提高性能) |
| | | * @return LocationTag对象的总数 |
| | | */ |
| | | public static int getLocationTagCount() { |
| | | if (tagMap == null) { |
| | | synchronized (Dell_tag.class) { |
| | | if (tagMap == null) { |
| | | try { |
| | | getlocationTags(); // 初始化缓存 |
| | | } catch (SQLException e) { |
| | | e.printStackTrace(); |
| | | return 0; // 初始化失败返回0 |
| | | } |
| | | } |
| | | } |
| | | } |
| | | return tagMap.size(); |
| | | } |
| | | } |