2021与蓝度共同重构项目,服务端
liuhaonan
2022-09-26 17e18047a47f43187f590a045b1aebe130459292
ximon-admin/src/main/java/com/sandu/ximon/admin/service/LightService.java
@@ -22,17 +22,17 @@
import com.sandu.ximon.admin.param.LightControlParam;
import com.sandu.ximon.admin.param.LightPowerSettingParam;
import com.sandu.ximon.admin.param.LightRemarkParam;
import com.sandu.ximon.admin.redis.DeviceRedisKey;
import com.sandu.ximon.admin.redis.LightKey;
import com.sandu.ximon.admin.security.SecurityUtils;
import com.sandu.ximon.admin.utils.RedisUtils;
import com.sandu.ximon.admin.utils.StoreOperationRecordsUtils;
import com.sandu.ximon.admin.vo.ControlLightCommandVO;
import com.sandu.ximon.admin.vo.EquipmentInfomation;
import com.sandu.ximon.admin.vo.RedisDeviceStatus;
import com.sandu.ximon.dao.bo.LightBo;
import com.sandu.ximon.dao.bo.PoleTaskLightPowerBo;
import com.sandu.ximon.dao.domain.Light;
import com.sandu.ximon.dao.domain.LightReportData;
import com.sandu.ximon.dao.domain.Pole;
import com.sandu.ximon.dao.domain.PoleBinding;
import com.sandu.ximon.dao.domain.*;
import com.sandu.ximon.dao.enums.DeviceRespStatusEnums;
import com.sandu.ximon.dao.enums.OrderByEnums;
import com.sandu.ximon.dao.mapper.LightMapper;
@@ -43,9 +43,10 @@
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
@@ -62,6 +63,7 @@
    private final LightReportDataService lightReportDataService;
    private final PoleBindingService bindingService;
    private final PoleService poleService;
    private final RedisUtils redisUtils;
    /**
     * 录入当前设备码的路灯数据
@@ -73,7 +75,7 @@
        Boolean hasKey = redisService.hasKey(LightKey.REPORT_MAC.key(deviceName));
        if (!hasKey) {
            int count = count(Wrappers.lambdaQuery(Light.class).eq(Light::getDeviceCode, deviceName));
            log.info("redis查不到路灯数据{}={}", count, deviceName);
            log.info("redis查不到路灯数据 数量:{}={}", count, deviceName);
            // 当前路灯表没有录入设备吗
            if (count == 0) {
                Light light = new Light();
@@ -306,151 +308,6 @@
        return resultList;
    }
    /**
     * 单灯节能率
     *
     * @return
     */
    public List controlEnergySaving() {
        //获取到正在执行的任务列表
        List<LightTaskDto> lightTaskDtos = SpringContextHolder.getBean(LightTaskService.class).listTask();
        LocalDateTime now = LocalDateTime.now();
        List<LightTaskDto> list1 = new ArrayList<>();
        List<LightTaskDto> list2 = new ArrayList<>();
        List<LightTaskDto> list3 = new ArrayList<>();
        List<LightTaskDto> list4 = new ArrayList<>();
        List<LightTaskDto> list5 = new ArrayList<>();
        List<LightTaskDto> list6 = new ArrayList<>();
        List<LightTaskDto> list7 = new ArrayList<>();
        for (LightTaskDto lightTaskDto : lightTaskDtos) {
            List<Integer> weekList = lightTaskDto.getWeekList();
            for (Integer one : weekList) {
                switch (one) {
                    case 1:
                        list1.add(lightTaskDto);
                        break;
                    case 2:
                        list2.add(lightTaskDto);
                        break;
                    case 4:
                        list3.add(lightTaskDto);
                        break;
                    case 8:
                        list4.add(lightTaskDto);
                        break;
                    case 16:
                        list5.add(lightTaskDto);
                        break;
                    case 32:
                        list6.add(lightTaskDto);
                        break;
                    case 64:
                        list7.add(lightTaskDto);
                        break;
                    default:
                }
            }
        }
        //获取当前星期几 1-7
        int currentWeekValue = now.getDayOfWeek().getValue();
        Map map;
        List<Map> temp = new ArrayList<>();
        //获取日期 精确到天
        LocalDateTime localDateTime = now.with(LocalTime.MIN);
        for (int i = 1; i < 8; i++) {
            currentWeekValue--;
            if (currentWeekValue < 1) {
                currentWeekValue = 7;
            }
            map = new LinkedHashMap();
            map.put("time", localDateTime.minusDays(i).format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
            map.put("value", getlist(currentWeekValue));
            temp.add(map);
        }
        return temp;
    }
    /**
     * 单灯能耗
     *
     * @return
     */
    public List controlEnergy() {
        //获取到正在执行的任务列表
        List<LightTaskDto> lightTaskDtos = SpringContextHolder.getBean(LightTaskService.class).listTask();
        LocalDateTime now = LocalDateTime.now();
        List<LightTaskDto> list1 = new ArrayList<>();
        List<LightTaskDto> list2 = new ArrayList<>();
        List<LightTaskDto> list3 = new ArrayList<>();
        List<LightTaskDto> list4 = new ArrayList<>();
        List<LightTaskDto> list5 = new ArrayList<>();
        List<LightTaskDto> list6 = new ArrayList<>();
        List<LightTaskDto> list7 = new ArrayList<>();
        for (LightTaskDto lightTaskDto : lightTaskDtos) {
            List<Integer> weekList = lightTaskDto.getWeekList();
            System.out.println(weekList + "===========================");
            for (Integer one : weekList) {
                switch (one) {
                    case 1:
                        list1.add(lightTaskDto);
                        break;
                    case 2:
                        list2.add(lightTaskDto);
                        break;
                    case 4:
                        list3.add(lightTaskDto);
                        break;
                    case 8:
                        list4.add(lightTaskDto);
                        break;
                    case 16:
                        list5.add(lightTaskDto);
                        break;
                    case 32:
                        list6.add(lightTaskDto);
                        break;
                    case 64:
                        list7.add(lightTaskDto);
                        break;
                    default:
                }
            }
        }
        Integer currentWeekValue = now.getDayOfWeek().getValue();
        Map map;
        List<Map> temp = new ArrayList<>();
        //获取当前日期  格式为yyyy-MM-dd
        LocalDateTime localDateTime = now.with(LocalTime.MIN);
        for (int i = 1; i < 8; i++) {
            currentWeekValue--;
            if (currentWeekValue < 1) {
                currentWeekValue = 7;
            }
            map = new LinkedHashMap();
            map.put("time", localDateTime.minusDays(i).format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
            map.put("value", getlistEnergy(currentWeekValue));
            temp.add(map);
        }
        return temp;
    }
    public BigDecimal getlist(Integer week) {
@@ -636,7 +493,7 @@
     *
     * @return
     */
    public BigDecimal jisuan(LightTaskDto Task) {
    public BigDecimal jisuan(LightTaskDto Task, LightTaskPoleRelation bean) {
        final BigDecimal[] bigDecimalResult = {new BigDecimal(0.00)};
        /**
         * 节能率计算开始
@@ -758,9 +615,10 @@
     * 一天的能耗
     *
     * @param
     * @param bean
     * @return
     */
    public BigDecimal jisuanEnergy(LightTaskDto Task) {
    public BigDecimal jisuanEnergy(LightTaskDto Task, LightTaskPoleRelation bean) {
        //存放能耗
        final BigDecimal[] bigEnergy = {new BigDecimal(0.00)};
@@ -779,9 +637,21 @@
        }
        /**
         * 节能率计算开始
         * 能耗计算开始
         */
        List<PoleTaskLightPowerBo> poleTaskLightPowerBos = SpringContextHolder.getBean(LightTaskMapper.class).listLightTaskByTaskId(Task.getTaskId());
//        List<PoleTaskLightPowerBo> poleTaskLightPowerBos = SpringContextHolder.getBean(LightTaskMapper.class).listLightTaskByTaskId(Task.getTaskId());
        List<PoleTaskLightPowerBo> poleTaskLightPowerBos = new ArrayList<>();
        PoleTaskLightPowerBo poleTaskLightPowerBo = new PoleTaskLightPowerBo();
        Light one = getOne(Wrappers.lambdaQuery(Light.class).eq(Light::getDeviceCode, bean.getDeviceCode()));
        if (one != null) {
            if ("0001".equals(bean.getLightAddress())) {
                poleTaskLightPowerBo.setPower1(one.getPower1());
            } else {
                poleTaskLightPowerBo.setPower2(one.getPower2());
            }
        }
        poleTaskLightPowerBos.add(poleTaskLightPowerBo);
        ControlLightCommandVO startTime = parseSwitchLightCommand(Task.getOpenOrder());
        ControlLightCommandVO endTime = parseSwitchLightCommand(Task.getCloseOrder());
        //获取到单灯任务的节能率
@@ -992,16 +862,31 @@
    }
    /**
     * 用户拥有的路灯(用于首页数据统计)
     *
     * @return
     */
    public List<LightBo> listLightOnHome() {
        List<LightBo> listLight;
        if (SecurityUtils.getClientId() != null) {
            listLight = baseMapper.listLight(SecurityUtils.getUserId(), null);
        } else {
            listLight = baseMapper.listLight(null, null);
        }
        return listLight;
    }
    /**
     * 获取用户所有的设备码
     */
    public CommonPage<String> listDeviceCode(int pageNo, int pageSize, String keyword, String deviceCode) {
    public CommonPage<String> listDeviceCode(int pageNo, int pageSize, String keyword, String deviceCode, String orderBy) {
        List<String> list;
        if (SecurityUtils.getClientId() != null) {
            PageHelper.startPage(pageNo, pageSize);
            list = baseMapper.listCode(SecurityUtils.getUserId(), keyword, deviceCode);
        } else {
            PageHelper.startPage(pageNo, pageSize);
            PageHelper.startPage(pageNo, pageSize, orderBy);
            list = baseMapper.listCode(null, keyword, deviceCode);
        }
@@ -1016,8 +901,64 @@
        lights.forEach(light -> {
            light.setPower1(lightPowerSettingParam.getPower1());
            light.setPower2(lightPowerSettingParam.getPower2());
            //存在非0功率  即为存在该灯头
            if (lightPowerSettingParam.getPower1() != null || lightPowerSettingParam.getPower1() != 0) {
                light.setLight1(1);
            } else if (lightPowerSettingParam.getPower1() == 0) {
                //手动设置灯头功率为0  即不存在该灯头
                light.setLight1(0);
            } else {
                light.setLight1(0);
            }
            //存在非0功率  即为存在该灯头
            if (lightPowerSettingParam.getPower2() != null || lightPowerSettingParam.getPower2() != 0) {
                light.setLight2(1);
            } else if (lightPowerSettingParam.getPower2() == 0) {
                //手动设置灯头功率为0  即不存在该灯头
                light.setLight2(0);
            } else {
                light.setLight2(0);
            }
            light.setLightCount(lightPowerSettingParam.getLightCount());
        });
        return updateBatchById(lights);
    }
    /**
     * 向Redis中存入设备状态
     */
    public void setCacheData() {
        List<String> collect = list().stream().map(Light::getDeviceCode).collect(Collectors.toList());
        List<List<String>> split = CollectionUtil.split(collect, 100);
        List<BatchGetDeviceStateResponse.DeviceStatus> deviceStatuses = null;
        List<RedisDeviceStatus> statusList = null;
        for (List<String> splist : split) {
            deviceStatuses = MainBoardInvokeSyncService.getInstance().batchGetDeviceState(splist);
            if (deviceStatuses != null) {
                for (BatchGetDeviceStateResponse.DeviceStatus deviceStatus : deviceStatuses) {
                    RedisDeviceStatus device = new RedisDeviceStatus();
                    device.setDeviceId(deviceStatus.getDeviceName());
                    if ("ONLINE".equals(deviceStatus.getStatus())) {
                        device.setStatus(0);
                    } else if ("OFFLINE".equals(deviceStatus.getStatus())) {
                        device.setStatus(1);
                    } else {
                        device.setStatus(2);
                    }
                    statusList.add(device);
                }
            }
        }
        statusList.forEach(status -> {
            redisUtils.set(DeviceRedisKey.LIGHT_DEVICE + status.getDeviceId(), status);
        });
    }
}