diff --git a/psdc-business/src/main/java/com/psdc/entity/PsdcScene.java b/psdc-business/src/main/java/com/psdc/entity/PsdcScene.java index 14bb853..f48e44a 100644 --- a/psdc-business/src/main/java/com/psdc/entity/PsdcScene.java +++ b/psdc-business/src/main/java/com/psdc/entity/PsdcScene.java @@ -18,6 +18,10 @@ public class PsdcScene { private Integer sceneId ; /** 场景名 */ private String sceneName ; + /** + * 策略码 + */ + private Integer sceneCode; /** 用户id */ private Integer userId; /** 设备id */ diff --git a/psdc-business/src/main/java/com/psdc/entity/vo/DeviceStatusVo.java b/psdc-business/src/main/java/com/psdc/entity/vo/DeviceStatusVo.java index 259902c..ff853df 100644 --- a/psdc-business/src/main/java/com/psdc/entity/vo/DeviceStatusVo.java +++ b/psdc-business/src/main/java/com/psdc/entity/vo/DeviceStatusVo.java @@ -32,5 +32,7 @@ public class DeviceStatusVo { private String photoUrl ; /** 设备运行状态:1-开启,2-关闭 */ private Integer deviceRunstatus ; + /** 设备模型 */ + private String deviceModel; } diff --git a/psdc-business/src/main/java/com/psdc/mapper/PsdcSceneMapper.java b/psdc-business/src/main/java/com/psdc/mapper/PsdcSceneMapper.java index 3733012..edfd7b7 100644 --- a/psdc-business/src/main/java/com/psdc/mapper/PsdcSceneMapper.java +++ b/psdc-business/src/main/java/com/psdc/mapper/PsdcSceneMapper.java @@ -55,6 +55,13 @@ public interface PsdcSceneMapper{ */ List queryByUserId(Long userId); + /** + * 根据策略码查询策略 + * @param sceneCode 策略码 + * @return 策略列表 + */ + List queryBySceneCode(Integer sceneCode); + /** * 获取场景名称分组 * @param userId diff --git a/psdc-business/src/main/java/com/psdc/mapper/PsdcStatisticsDayMapper.java b/psdc-business/src/main/java/com/psdc/mapper/PsdcStatisticsDayMapper.java index 7ea8c19..a283222 100644 --- a/psdc-business/src/main/java/com/psdc/mapper/PsdcStatisticsDayMapper.java +++ b/psdc-business/src/main/java/com/psdc/mapper/PsdcStatisticsDayMapper.java @@ -61,4 +61,13 @@ public interface PsdcStatisticsDayMapper{ * @return 影响行数 */ int deleteById(Integer statisticsId); -} \ No newline at end of file + + /** + * 计算一行数据总和 + * @param deviceId 设备id + * @param datetime 日期 + * @return 总和 + */ + Double queryOneLineSum(@Param("deviceId") Integer deviceId, + @Param("datetime") String datetime); + } \ No newline at end of file diff --git a/psdc-business/src/main/java/com/psdc/mapper/PsdcStatisticsYearMapper.java b/psdc-business/src/main/java/com/psdc/mapper/PsdcStatisticsYearMapper.java index a7e788b..965d4fc 100644 --- a/psdc-business/src/main/java/com/psdc/mapper/PsdcStatisticsYearMapper.java +++ b/psdc-business/src/main/java/com/psdc/mapper/PsdcStatisticsYearMapper.java @@ -82,4 +82,13 @@ public interface PsdcStatisticsYearMapper{ */ PsdcStatisticsYear queryByDeviceIdAndDate(@Param("deviceId") Integer deviceId, @Param("date") String date); + + /** + * 计算一行数据总和 + * @param deviceId 设备id + * @param datetime 日期 + * @return 总和 + */ + Double queryOneLineSum(@Param("deviceId") Integer deviceId, + @Param("datetime") String datetime); } \ No newline at end of file diff --git a/psdc-business/src/main/java/com/psdc/service/IPsdcDeviceService.java b/psdc-business/src/main/java/com/psdc/service/IPsdcDeviceService.java index 76aa545..d4173ab 100644 --- a/psdc-business/src/main/java/com/psdc/service/IPsdcDeviceService.java +++ b/psdc-business/src/main/java/com/psdc/service/IPsdcDeviceService.java @@ -100,4 +100,11 @@ public interface IPsdcDeviceService { * @return */ int setTemperature(Integer deviceId, String key,String value, String controlBym,Integer controlMethod); + + /** + * 执行策略 + * @param strategyCode 策略码 + * @return + */ + int executiveStrategy(Integer strategyCode); } diff --git a/psdc-business/src/main/java/com/psdc/service/IStatisticsAnalysisService.java b/psdc-business/src/main/java/com/psdc/service/IStatisticsAnalysisService.java index 6bae7b9..a63ba3a 100644 --- a/psdc-business/src/main/java/com/psdc/service/IStatisticsAnalysisService.java +++ b/psdc-business/src/main/java/com/psdc/service/IStatisticsAnalysisService.java @@ -1,6 +1,10 @@ package com.psdc.service; +import org.apache.poi.ss.formula.functions.T; + +import java.text.ParseException; import java.util.HashMap; +import java.util.List; public interface IStatisticsAnalysisService { @@ -11,4 +15,11 @@ public interface IStatisticsAnalysisService { * @param toYear 同期 */ HashMap computeYearOnYear(Integer deviceId, String year, String toYear); + + /** + * 计算环比数据 + * @param timeType 时间类型 1 日 2 月 3 年 + * @param datetime 时间 + */ + List> computeLinkRelativeRatio(Integer timeType, String datetime) throws ParseException; } diff --git a/psdc-business/src/main/java/com/psdc/service/impl/PsdcDeviceServiceImpl.java b/psdc-business/src/main/java/com/psdc/service/impl/PsdcDeviceServiceImpl.java index 7c60ada..88c4fef 100644 --- a/psdc-business/src/main/java/com/psdc/service/impl/PsdcDeviceServiceImpl.java +++ b/psdc-business/src/main/java/com/psdc/service/impl/PsdcDeviceServiceImpl.java @@ -2,11 +2,14 @@ package com.psdc.service.impl; import com.psdc.entity.PsdcControlLog; import com.psdc.entity.PsdcDevice; +import com.psdc.entity.PsdcScene; import com.psdc.entity.vo.DeviceStatusVo; +import com.psdc.entity.vo.SceneVo; import com.psdc.enums.ControlKeyEnum; import com.psdc.exception.ControlException; import com.psdc.mapper.PsdcControlLogMapper; import com.psdc.mapper.PsdcDeviceMapper; +import com.psdc.mapper.PsdcSceneMapper; import com.psdc.service.IPsdcDeviceService; import com.psdc.utils.SecurityUtils; import com.psdc.utils.poi.ExcelUtil; @@ -36,6 +39,9 @@ public class PsdcDeviceServiceImpl implements IPsdcDeviceService { @Resource private PsdcControlLogMapper psdcControlLogMapper; + @Resource + private PsdcSceneMapper psdcSceneMapper; + /** * 通过ID查询单条数据 * @@ -266,6 +272,31 @@ public class PsdcDeviceServiceImpl implements IPsdcDeviceService { } + /** + * 执行策略 + * @param strategyCode 策略码 + * @return + */ + @Override + public int executiveStrategy(Integer strategyCode) { + List psdcScenes = psdcSceneMapper.queryBySceneCode(strategyCode); + //根据策略码查询策略列表 + for (PsdcScene psdcScene: psdcScenes ) { + + String controlKey = psdcScene.getSceneKey(); + String controlValue = psdcScene.getSceneValue(); + String controlContext = ControlKeyEnum.getControlContext(controlKey); + //TODO 发送MQTT指令 + // psdcControlLogMapper.insert(new PsdcControlLog(deviceId,psdcDevice.getDeviceName(),psdcDevice.getDeviceSn(),controlContext,controlValue,controlMethod,2,"控制成功",controlBy)); + // psdcControlLogMapper.insert(new PsdcControlLog(deviceId,psdcDevice.getDeviceName(),psdcDevice.getDeviceSn(),controlContext,controlValue,controlMethod,3,"等待终端响应超时",controlBy)); + //发送成功 + psdcControlLogMapper.insert(new PsdcControlLog(deviceId, psdcDevice.getDeviceName(), psdcDevice.getDeviceSn(), controlContext, controlValue, 3, 2, "控制成功", SecurityUtils.getUsername())); + + + } + return 0; + } + private String coverStr(String s, int i) { switch (s) { case "s": diff --git a/psdc-business/src/main/java/com/psdc/service/impl/StatisticsAnalysisService.java b/psdc-business/src/main/java/com/psdc/service/impl/StatisticsAnalysisService.java index aad47f9..2637c20 100644 --- a/psdc-business/src/main/java/com/psdc/service/impl/StatisticsAnalysisService.java +++ b/psdc-business/src/main/java/com/psdc/service/impl/StatisticsAnalysisService.java @@ -1,25 +1,43 @@ package com.psdc.service.impl; +import com.psdc.entity.PsdcDevice; import com.psdc.entity.PsdcStatisticsYear; +import com.psdc.mapper.PsdcDeviceMapper; +import com.psdc.mapper.PsdcStatisticsDayMapper; +import com.psdc.mapper.PsdcStatisticsMonthMapper; import com.psdc.mapper.PsdcStatisticsYearMapper; import com.psdc.service.IStatisticsAnalysisService; +import com.psdc.utils.SecurityUtils; import com.psdc.utils.bean.BeanUtils; +import lombok.extern.slf4j.Slf4j; +import org.apache.poi.ss.formula.functions.T; import org.springframework.stereotype.Service; import javax.annotation.Resource; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.*; +import java.util.stream.Collectors; /** * 统计分析页面服务层 */ @Service +@Slf4j public class StatisticsAnalysisService implements IStatisticsAnalysisService { @Resource private PsdcStatisticsYearMapper psdcStatisticsYearMapper; + @Resource + private PsdcDeviceMapper psdcDeviceMapper; + + @Resource + private PsdcStatisticsMonthMapper psdcStatisticsMonthMapper; + + @Resource + private PsdcStatisticsDayMapper psdcStatisticsDayMapper; + /** * 计算单个设备的同比数据 * @param deviceId 设备id @@ -45,39 +63,146 @@ public class StatisticsAnalysisService implements IStatisticsAnalysisService { Double addUp = 0.0; for (int i = 1; i < 13; i++) { HashMap stringObjectHashMap = new HashMap<>(); - if(i < 10 ){ - stringObjectHashMap.put("month","0" + i + "月"); - } else { - stringObjectHashMap.put("month",i + "月"); - } - if ( yearList.isEmpty() ){ - stringObjectHashMap.put("year",null); - } else { - stringObjectHashMap.put("year",yearList.get(i)); - } - if ( toYearList.isEmpty()){ - stringObjectHashMap.put("toYear",null); - } else { - stringObjectHashMap.put("toYear",toYearList.get(i)); - } + stringObjectHashMap.put("month", i < 10 ? "0" + i + "月" : i + "月"); + stringObjectHashMap.put("year",yearList.isEmpty() ? null : yearList.get(i)); + stringObjectHashMap.put("toYear",toYearList.isEmpty() ? null : toYearList.get(i)); Double compute = null; - if ( !yearList.isEmpty() && yearList.get(i) != null && ( !toYearList.isEmpty() && toYearList.get(i) != null)){ + if ( !yearList.isEmpty() && yearList.get(i) != null && !yearList.get(i).equals("") && ( !toYearList.isEmpty() && toYearList.get(i) != null && !toYearList.get(i).equals(""))){ double yearDouble = Double.parseDouble(yearList.get(i)); double toYearDouble = Double.parseDouble(toYearList.get(i)); if (toYearDouble == 0){ toYearDouble = 1; } - compute = ( yearDouble - toYearDouble ) / toYearDouble / 100; - + compute = ( yearDouble - toYearDouble ) / toYearDouble * 100; } if (compute != null ){ addUp = addUp + compute; + stringObjectHashMap.put("compute",String.format("%.2f%%",compute)); + } else { + stringObjectHashMap.put("compute",null); } - stringObjectHashMap.put("compute",compute); - stringObjectHashMap.put("addUp",addUp); + stringObjectHashMap.put("addUp",String.format("%.2f%%",addUp)); mapList.add(stringObjectHashMap); } map.put("yearOnYear",mapList); + return map; } + + /** + * 计算环比数据 + * @param timeType 时间类型 1 日 2 月 3 年 + * @param datetime 时间 + */ + @Override + public List> computeLinkRelativeRatio(Integer timeType, String datetime) throws ParseException { + //查找设备列表 + List psdcDevices = psdcDeviceMapper.controlQueryByUserId(SecurityUtils.getUserId()); + List> mapList = new ArrayList<>(); + + if ( timeType == 1 ){ + SimpleDateFormat dayFormat = new SimpleDateFormat("yyyy-MM-dd"); + Calendar instance = Calendar.getInstance(); + instance.setTime(dayFormat.parse(datetime)); + instance.add(Calendar.DATE,-1); + String today = dayFormat.format(dayFormat.parse(datetime)); + String yesterday = dayFormat.format(instance.getTime()); + log.info("日环比,本期:{},同期:{}",today,yesterday); + mapList = psdcDevices.stream().map(psdcDevice -> { + HashMap stringObjectHashMap = new HashMap<>(); + Double compute = null; + Double addUp = null; + Integer deviceId = psdcDevice.getDeviceId(); + Double todayTotal = psdcStatisticsDayMapper.queryOneLineSum(deviceId, today); + Double yesterdayTotal = psdcStatisticsDayMapper.queryOneLineSum(deviceId, yesterday); + if( todayTotal == null ){ + todayTotal = 0.0; + } + if ( yesterdayTotal != null && yesterdayTotal != 0.0) { + addUp = todayTotal - yesterdayTotal; + compute = (todayTotal - yesterdayTotal) / yesterdayTotal * 100; + stringObjectHashMap.put("lastMonthTotal", String.format("%.2f", yesterdayTotal)); + stringObjectHashMap.put("addUp", String.format("%.2f", addUp)); + stringObjectHashMap.put("compute", String.format("%.2f%%", compute)); + } else { + stringObjectHashMap.put("addUp", null); + stringObjectHashMap.put("compute", null); + stringObjectHashMap.put("lastMonthTotal", null); + } + stringObjectHashMap.put("deviceId", psdcDevice.getDeviceId()); + stringObjectHashMap.put("deviceName", psdcDevice.getDeviceName()); + stringObjectHashMap.put("thisMonthTotal", String.format("%.2f", todayTotal)); + return stringObjectHashMap; + }).collect(Collectors.toList()); + } else if ( timeType == 2 ){ + SimpleDateFormat monthFormat = new SimpleDateFormat("yyyy-MM"); + Calendar instance = Calendar.getInstance(); + instance.setTime(monthFormat.parse(datetime)); + instance.add(Calendar.MONTH,-1); + String thisMonth = monthFormat.format(monthFormat.parse(datetime)); + String lastMonth = monthFormat.format(instance.getTime()); + log.info("月环比,本期:{},同期:{}",thisMonth,lastMonth); + mapList = psdcDevices.stream().map(psdcDevice -> { + HashMap stringObjectHashMap = new HashMap<>(); + Double compute = null; + Double addUp = null; + Integer deviceId = psdcDevice.getDeviceId(); + Double thisMonthTotal = psdcStatisticsMonthMapper.queryOneLineSum(deviceId, thisMonth); + Double lastMonthTotal = psdcStatisticsMonthMapper.queryOneLineSum(deviceId, lastMonth); + if( thisMonthTotal == null ){ + thisMonthTotal = 0.0; + } + if ( lastMonthTotal != null && lastMonthTotal != 0.0) { + addUp = thisMonthTotal - lastMonthTotal; + compute = (thisMonthTotal - lastMonthTotal) / lastMonthTotal * 100; + stringObjectHashMap.put("lastMonthTotal", String.format("%.2f", lastMonthTotal)); + stringObjectHashMap.put("addUp", String.format("%.2f", addUp)); + stringObjectHashMap.put("compute", String.format("%.2f%%", compute)); + } else { + stringObjectHashMap.put("addUp", null); + stringObjectHashMap.put("compute", null); + stringObjectHashMap.put("lastMonthTotal", null); + } + stringObjectHashMap.put("deviceId", psdcDevice.getDeviceId()); + stringObjectHashMap.put("deviceName", psdcDevice.getDeviceName()); + stringObjectHashMap.put("thisMonthTotal", String.format("%.2f", thisMonthTotal)); + return stringObjectHashMap; + }).collect(Collectors.toList()); + } else if ( timeType == 3){ + SimpleDateFormat yearFormat = new SimpleDateFormat("yyyy"); + Calendar instance = Calendar.getInstance(); + instance.setTime(yearFormat.parse(datetime)); + instance.add(Calendar.YEAR,-1); + String thisYear = yearFormat.format(yearFormat.parse(datetime)); + String lastYear = yearFormat.format(instance.getTime()); + log.info("年环比,本期:{},同期:{}",thisYear,lastYear); + mapList = psdcDevices.stream().map(psdcDevice -> { + HashMap stringObjectHashMap = new HashMap<>(); + Double compute = null; + Double addUp = null; + Integer deviceId = psdcDevice.getDeviceId(); + Double thisYearTotal = psdcStatisticsYearMapper.queryOneLineSum(deviceId, thisYear); + Double lastYearTotal = psdcStatisticsYearMapper.queryOneLineSum(deviceId, lastYear); + if( thisYearTotal == null ){ + thisYearTotal = 0.0; + } + if ( lastYearTotal != null && lastYearTotal != 0.0) { + addUp = thisYearTotal - lastYearTotal; + compute = (thisYearTotal - lastYearTotal) / lastYearTotal * 100; + stringObjectHashMap.put("lastMonthTotal", String.format("%.2f", lastYearTotal)); + stringObjectHashMap.put("addUp", String.format("%.2f", addUp)); + stringObjectHashMap.put("compute", String.format("%.2f%%", compute)); + } else { + stringObjectHashMap.put("addUp", null); + stringObjectHashMap.put("compute", null); + stringObjectHashMap.put("lastMonthTotal", null); + } + stringObjectHashMap.put("deviceId", psdcDevice.getDeviceId()); + stringObjectHashMap.put("deviceName", psdcDevice.getDeviceName()); + stringObjectHashMap.put("thisMonthTotal", String.format("%.2f", thisYearTotal)); + return stringObjectHashMap; + }).collect(Collectors.toList()); + } + return mapList; + } } diff --git a/psdc-business/src/main/resources/mapper/business/PsdcSceneMapper.xml b/psdc-business/src/main/resources/mapper/business/PsdcSceneMapper.xml index 0e38726..f730cc9 100644 --- a/psdc-business/src/main/resources/mapper/business/PsdcSceneMapper.xml +++ b/psdc-business/src/main/resources/mapper/business/PsdcSceneMapper.xml @@ -4,6 +4,7 @@ + @@ -26,7 +27,7 @@ @@ -37,8 +38,8 @@ - insert into psdc_scene(scene_name,user_id,device_id,device_sn,scene_context,scene_key,scene_value) - values (#{sceneName},#{userId},#{deviceId},#{deviceSn},#{sceneContext},#{sceneKey},#{sceneValue}) + insert into psdc_scene(scene_name,scene_code,user_id,device_id,device_sn,scene_context,scene_key,scene_value) + values (#{sceneName},#{sceneCode},#{userId},#{deviceId},#{deviceSn},#{sceneContext},#{sceneKey},#{sceneValue}) @@ -48,6 +49,9 @@ scene_name = #{sceneName}, + + scene_code = #{sceneCode}, + user_id = #{userId}, @@ -77,12 +81,17 @@ + + + - select ps.scene_id,ps.scene_name,ps.user_id,pd.device_name,ps.device_id,pd.device_sn,ps.scene_context,ps.scene_key,ps.scene_value + select ps.scene_id,ps.scene_name,ps.scene_code,ps.user_id,pd.device_name,ps.device_id,pd.device_sn,ps.scene_context,ps.scene_key,ps.scene_value from psdc_scene ps left join sys_user su on ps.user_id = su.user_id left join psdc_device pd on ps.device_id = pd.device_id where su.user_id = #{userId} and pd.device_id = #{deviceId} @@ -100,7 +109,7 @@ - select ps.scene_id,ps.scene_name,ps.user_id,pd.device_name,ps.device_id,pd.device_sn,ps.scene_context,ps.scene_key,ps.scene_value + select ps.scene_id,ps.scene_name,ps.scene_code,ps.user_id,pd.device_name,ps.device_id,pd.device_sn,ps.scene_context,ps.scene_key,ps.scene_value from psdc_scene ps left join psdc_device pd on ps.device_id = pd.device_id where ps.scene_name like concat('%', #{sceneName}, '%') + + \ No newline at end of file diff --git a/psdc-business/src/main/resources/mapper/business/PsdcStatisticsDayMapper.xml b/psdc-business/src/main/resources/mapper/business/PsdcStatisticsDayMapper.xml index e915458..ce0d4b8 100644 --- a/psdc-business/src/main/resources/mapper/business/PsdcStatisticsDayMapper.xml +++ b/psdc-business/src/main/resources/mapper/business/PsdcStatisticsDayMapper.xml @@ -220,4 +220,14 @@ delete from psdc_statistics_day where day_id = #{dayId} + + + \ No newline at end of file diff --git a/psdc-business/src/main/resources/mapper/business/PsdcStatisticsYearMapper.xml b/psdc-business/src/main/resources/mapper/business/PsdcStatisticsYearMapper.xml index 22bbc53..05f715f 100644 --- a/psdc-business/src/main/resources/mapper/business/PsdcStatisticsYearMapper.xml +++ b/psdc-business/src/main/resources/mapper/business/PsdcStatisticsYearMapper.xml @@ -162,4 +162,11 @@ + + \ No newline at end of file diff --git a/psdc-web/src/main/java/com/psdc/controller/control/ManualController.java b/psdc-web/src/main/java/com/psdc/controller/control/ManualController.java index f4fcd8b..0d183b4 100644 --- a/psdc-web/src/main/java/com/psdc/controller/control/ManualController.java +++ b/psdc-web/src/main/java/com/psdc/controller/control/ManualController.java @@ -85,6 +85,17 @@ public class ManualController extends BaseController { return AjaxResult.success(strategyList); } + + /** + * 发送控制策略 + * @return ajax + */ + @PreAuthorize("@ss.hasPermi('control:manual:strategy')") + @GetMapping("/{strategyCode}") + public AjaxResult getStrategyList(@PathVariable(value = "strategyCode") Integer strategyCode){ + psdcDeviceService.executiveStrategy(strategyCode); + } + /** * 设置温度 * @param jsonObject 传参对象 diff --git a/psdc-web/src/main/java/com/psdc/controller/evaluate/EnergyAnalysisController.java b/psdc-web/src/main/java/com/psdc/controller/evaluate/EnergyAnalysisController.java index b367a44..954d53e 100644 --- a/psdc-web/src/main/java/com/psdc/controller/evaluate/EnergyAnalysisController.java +++ b/psdc-web/src/main/java/com/psdc/controller/evaluate/EnergyAnalysisController.java @@ -11,6 +11,9 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; +import java.text.ParseException; +import java.util.HashMap; +import java.util.List; @RestController @Slf4j @@ -25,10 +28,21 @@ public class EnergyAnalysisController { public AjaxResult yearOnYearAnalyse(@RequestBody JSONObject jsonObject){ Integer deviceId = jsonObject.getInteger("deviceId"); String year = jsonObject.getString("year"); - String toyear = jsonObject.getString("toYear"); - log.info("设备id:{},本期年份:{},同期年份:{}",deviceId,year,toyear); - statisticsAnalysisService.computeYearOnYear(deviceId,year,toyear); - return null; + String toYear = jsonObject.getString("toYear"); + log.info("设备id:{},本期年份:{},同期年份:{}",deviceId,year,toYear); + HashMap stringObjectHashMap = statisticsAnalysisService.computeYearOnYear(deviceId, year, toYear); + return AjaxResult.success(stringObjectHashMap); } + @PreAuthorize("@ss.hasPermi('analyse:nhfx:nhhb')") + @PostMapping("/linkRelativeRatio") + public AjaxResult linkRelativeRatio(@RequestBody JSONObject jsonObject) throws ParseException { + Integer timeType = jsonObject.getInteger("timeType"); + String datetime = jsonObject.getString("datetime"); + List> mapList = statisticsAnalysisService.computeLinkRelativeRatio(timeType, datetime); + return AjaxResult.success(mapList); + } + + + }