jinpengyong
2021-08-09 2cf0253cf25e8e74958075eb3d1a1b8eac70356d
screen-api/src/main/java/com/moral/api/service/impl/DeviceServiceImpl.java
@@ -6,7 +6,6 @@
import com.moral.api.mapper.DeviceMapper;
import com.moral.api.service.DeviceService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.moral.api.service.HistoryHourlyService;
import com.moral.constant.Constants;
import com.moral.constant.RedisConstants;
import com.moral.util.DateUtils;
@@ -16,7 +15,9 @@
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -32,7 +33,7 @@
public class DeviceServiceImpl extends ServiceImpl<DeviceMapper, Device> implements DeviceService {
    @Autowired
    DeviceMapper deviceMapper;
    private DeviceMapper deviceMapper;
    @Autowired
    private RedisTemplate redisTemplate;
@@ -40,52 +41,103 @@
    @Override
    public List<Device> getDevicesByMonitorPointId(Integer monitorPointId) {
        QueryWrapper<Device> wrapper = new QueryWrapper();
        wrapper.eq("is_delete", Constants.NOT_DELETE);
        wrapper.eq("monitor_point_id", monitorPointId);
        List<Device> devices = deviceMapper.selectList(wrapper);
        return devices;
        wrapper.eq("is_delete", Constants.NOT_DELETE);
        return deviceMapper.selectList(wrapper);
    }
    @Override
    public Map<String, Object> getSensorsByMac(String mac) {
        //从redis中获取设备因子信息
        Device device = (Device) redisTemplate.opsForHash().get(RedisConstants.DEVICE_INFO, mac);
        List<Sensor> sensors = device.getVersion().getSensors();
        Map<String, Object> result = new HashMap<>();
        for (Sensor sensor : sensors) {
            String sensorCode = sensor.getCode();
            String name = sensor.getName();
            result.put(sensorCode, name);
    public Map<String, Object> getSensorsByMac(Map<String, Object> params) {
        //设备mac
        List<String> macs = (List<String>) params.remove("macs");
        List<Map<String, Object>> elementLists = new ArrayList<>();
        for (String mac : macs) {
            //从redis中获取设备因子信息
            Device device = (Device) redisTemplate.opsForHash().get(RedisConstants.DEVICE_INFO, mac);
            List<Sensor> sensors = device.getVersion().getSensors();
            Map<String, Object> map = new HashMap<>();
            for (Sensor sensor : sensors) {
                String sensorCode = sensor.getCode();
                String name = sensor.getName();
                map.put(sensorCode, name);
            }
            elementLists.add(map);
        }
        return result;
        Map<String, Object> map = elementLists.parallelStream()
                .filter(elementList -> elementList.size() != 0)
                .reduce((a, b) -> {
                    a.keySet().retainAll(b.keySet());
                    return a;
                }).orElse(new HashMap<>());
        return map;
    }
    @Override
    public List<Map<String, Object>> getTrendChartData(Map<String, Object> params) {
        Object type = params.get("type");
        String start = params.remove("time").toString();
        //设备mac
        List<String> macs = (List<String>) params.remove("macs");
        QueryWrapper<Device> queryWrapper = new QueryWrapper<>();
        queryWrapper.select("mac", "name").in("mac", macs);
        List<Device> devices = deviceMapper.selectList(queryWrapper);
        //所选时间
        List<String> times = (List<String>) params.remove("times");
        //因子code
        String sensorCode = params.get("sensorCode").toString();
        String end;
        String timeUnits;
        String dateFormat;
        //返回结果集,time=data
        List<Map<String, Object>> result = new ArrayList<>();
        if ("day".equals(type)) {
            end = DateUtils.getDateAddDay(start, 1);
            timeUnits = "hourly";
            dateFormat = "%H";
        } else if ("month".equals(type)) {
            end = DateUtils.getDateAddMonth(start, 1);
            timeUnits = "daily";
            dateFormat = "%d";
        } else {
            end = DateUtils.getDateAddYear(start, 1);
            timeUnits = "monthly";
            dateFormat = "%m";
        for (String start : times) {
            if ("day".equals(type)) {
                end = DateUtils.getDateAddDay(start, 1);
                timeUnits = "hourly";
            } else if ("month".equals(type)) {
                end = DateUtils.getDateAddMonth(start, 1);
                timeUnits = "daily";
            } else {
                end = DateUtils.getDateAddYear(start, 1);
                timeUnits = "monthly";
            }
            params.put("timeUnits", timeUnits);
            params.put("start", start);
            params.put("end", end);
            params.put("macs", macs);
            params.put("dateFormat", "%Y-%m-%d %H:%i:%s");
            //获取多设备指定因子数据
            List<Map<String, Object>> list = deviceMapper.getTrendChartData(params);
            for (String s : DateUtils.getTimeLag(start)) {
                Map<String, Object> resultMap = new HashMap<>();
                resultMap.put("time", s);
                List<Map<String, Object>> deviceData = new ArrayList<>();
                for (Device device : devices) {
                    Map<String, Object> valueMap = new HashMap<>();
                    valueMap.put("name", device.getName());
                    valueMap.put("sensorValue", "");
                    for (Map<String, Object> map : list) {
                        Object time = map.get("time");
                        Object sensorValue = map.get(sensorCode);
                        Object mac = map.get("mac");
                        if (s.equals(time) && device.getMac().equals(mac)) {
                            valueMap.put("sensorValue", sensorValue);
                        }
                    }
                    deviceData.add(valueMap);
                }
                resultMap.put("deviceData", deviceData);
                result.add(resultMap);
            }
        }
        params.put("dateFormat", dateFormat);
        params.put("timeUnits", timeUnits);
        params.put("start", start);
        params.put("end", end);
        return deviceMapper.getTrendChartData(params);
        return result;
    }
}