From 9a26722f140060bef19277985ea67bb592df5705 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9B=A8=E6=9C=A8c?= <857448963@qq.com> Date: Thu, 4 Aug 2022 14:05:45 +0800 Subject: [PATCH] =?UTF-8?q?1.=E7=94=A8=E8=83=BD=E7=B3=BB=E7=BB=9F=E7=A9=BA?= =?UTF-8?q?=E8=B0=83=E5=85=B3=E6=9C=BA=E7=AD=96=E7=95=A5=202.=E7=BB=88?= =?UTF-8?q?=E7=AB=AF=E6=A8=A1=E5=9D=97=E5=AF=B9=E5=A4=96=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/njcn/device/api/LineFeignClient.java | 10 + .../LineFeignClientFallbackFactory.java | 6 + .../GeneralDeviceInfoController.java | 6 + .../device/controller/LineController.java | 17 + .../com/njcn/device/mapper/LineMapper.java | 6 + .../njcn/device/mapper/mapping/LineMapper.xml | 19 + .../energy/pojo/enums/EnergyResponseEnum.java | 4 +- .../energy/pojo/param/AirStrategyParam.java | 7 +- .../com/njcn/energy/pojo/po/AirStrategy.java | 1 + .../njcn/energy/pojo/vo/AirStrategyVO.java | 3 + .../controller/EleAirStrategyController.java | 20 +- .../mapper/mapping/LogicDeviceLineMapper.xml | 4 +- .../energy/service/EleAirStrategyService.java | 8 + .../impl/EleAirStrategyServiceImpl.java | 447 +++++++++++------- .../src/main/resources/bootstrap.yml | 1 + .../src/main/resources/bootstrap.yml | 5 +- 16 files changed, 375 insertions(+), 189 deletions(-) diff --git a/pqs-device/device-api/src/main/java/com/njcn/device/api/LineFeignClient.java b/pqs-device/device-api/src/main/java/com/njcn/device/api/LineFeignClient.java index 1b480e355..622e5b6ee 100644 --- a/pqs-device/device-api/src/main/java/com/njcn/device/api/LineFeignClient.java +++ b/pqs-device/device-api/src/main/java/com/njcn/device/api/LineFeignClient.java @@ -210,4 +210,14 @@ public interface LineFeignClient { @PostMapping("getDeviceList") HttpResult> getDeviceList(); + /** + * 获取当前状态在线的监测点数量 + * @param lineIds 监测点集合 + * @return 在线的监测点数量 + * @author cdf + * @date 2022/8/1 + */ + @PostMapping("getOnLineCount") + HttpResult getOnLineCount(@RequestBody List lineIds); + } diff --git a/pqs-device/device-api/src/main/java/com/njcn/device/api/fallback/LineFeignClientFallbackFactory.java b/pqs-device/device-api/src/main/java/com/njcn/device/api/fallback/LineFeignClientFallbackFactory.java index fa131a136..9d046b6c2 100644 --- a/pqs-device/device-api/src/main/java/com/njcn/device/api/fallback/LineFeignClientFallbackFactory.java +++ b/pqs-device/device-api/src/main/java/com/njcn/device/api/fallback/LineFeignClientFallbackFactory.java @@ -161,6 +161,12 @@ public class LineFeignClientFallbackFactory implements FallbackFactory getOnLineCount(List lineIds) { + log.error("{}异常,降级处理,异常为:{}", "或取在线监测点数量异常: ", throwable.toString()); + throw new BusinessException(finalExceptionEnum); + } + }; } diff --git a/pqs-device/device-boot/src/main/java/com/njcn/device/controller/GeneralDeviceInfoController.java b/pqs-device/device-boot/src/main/java/com/njcn/device/controller/GeneralDeviceInfoController.java index 6ebf35f9b..9cec73a43 100644 --- a/pqs-device/device-boot/src/main/java/com/njcn/device/controller/GeneralDeviceInfoController.java +++ b/pqs-device/device-boot/src/main/java/com/njcn/device/controller/GeneralDeviceInfoController.java @@ -54,6 +54,7 @@ public class GeneralDeviceInfoController extends BaseController { @ApiImplicitParams({ @ApiImplicitParam(name = "deviceInfoParam", value = "查询终端条件", required = true) }) + @Deprecated public HttpResult> getPracticalRunDeviceInfoAsDept(@RequestBody @Validated DeviceInfoParam deviceInfoParam) { String methodDescribe = getMethodDescribe("getPracticalRunDeviceInfoAsDept"); List deptDeviceInfos = generalDeviceService.getDeviceInfoAsDept(deviceInfoParam, Stream.of(0).collect(Collectors.toList()), Stream.of(1).collect(Collectors.toList())); @@ -73,6 +74,7 @@ public class GeneralDeviceInfoController extends BaseController { @ApiImplicitParams({ @ApiImplicitParam(name = "deviceInfoParam", value = "查询终端条件", required = true) }) + @Deprecated public HttpResult> getOfflineRunDeviceInfoAsDept(@RequestBody @Validated DeviceInfoParam deviceInfoParam) { String methodDescribe = getMethodDescribe("getOfflineRunDeviceInfoAsDept"); List deptDeviceInfos = generalDeviceService.getDeviceInfoAsDept(deviceInfoParam, Stream.of(0).collect(Collectors.toList()), Stream.of(2).collect(Collectors.toList())); @@ -93,6 +95,7 @@ public class GeneralDeviceInfoController extends BaseController { @ApiImplicitParams({ @ApiImplicitParam(name = "deviceInfoParam", value = "查询终端条件", required = true) }) + @Deprecated public HttpResult> getPracticalAllDeviceInfoAsDept(@RequestBody @Validated DeviceInfoParam deviceInfoParam) { String methodDescribe = getMethodDescribe("getPracticalAllDeviceInfoAsDept"); List deptDeviceInfos = generalDeviceService.getDeviceInfoAsDept(deviceInfoParam, null, Stream.of(1).collect(Collectors.toList())); @@ -120,6 +123,7 @@ public class GeneralDeviceInfoController extends BaseController { @ApiImplicitParams({ @ApiImplicitParam(name = "deviceInfoParam", value = "查询终端条件", required = true) }) + @Deprecated public HttpResult> getPracticalRunDeviceInfoAsSubstation(@RequestBody @Validated DeviceInfoParam deviceInfoParam) { String methodDescribe = getMethodDescribe("getPracticalRunDeviceInfoAsSubstation"); List substationDeviceInfos = generalDeviceService.getDeviceInfoAsSubstation(deviceInfoParam, Stream.of(0).collect(Collectors.toList()), Stream.of(1).collect(Collectors.toList())); @@ -139,6 +143,7 @@ public class GeneralDeviceInfoController extends BaseController { @ApiImplicitParams({ @ApiImplicitParam(name = "deviceInfoParam", value = "查询终端条件", required = true) }) + @Deprecated public HttpResult> getPracticalRunDeviceInfo(@RequestBody @Validated DeviceInfoParam deviceInfoParam) { String methodDescribe = getMethodDescribe("getPracticalRunDeviceInfo"); List deptDeviceInfos = generalDeviceService.getDeviceInfo(deviceInfoParam, Stream.of(0).collect(Collectors.toList()), Stream.of(1).collect(Collectors.toList())); @@ -158,6 +163,7 @@ public class GeneralDeviceInfoController extends BaseController { @ApiImplicitParams({ @ApiImplicitParam(name = "deviceInfoParam", value = "查询终端条件", required = true) }) + @Deprecated public HttpResult> getOfflineRunDeviceInfo(@RequestBody @Validated DeviceInfoParam deviceInfoParam) { String methodDescribe = getMethodDescribe("getOfflineRunDeviceInfo"); List deptDeviceInfos = generalDeviceService.getDeviceInfo(deviceInfoParam, Stream.of(0).collect(Collectors.toList()), Stream.of(2).collect(Collectors.toList())); diff --git a/pqs-device/device-boot/src/main/java/com/njcn/device/controller/LineController.java b/pqs-device/device-boot/src/main/java/com/njcn/device/controller/LineController.java index ce68696e3..9a5e0fbb4 100644 --- a/pqs-device/device-boot/src/main/java/com/njcn/device/controller/LineController.java +++ b/pqs-device/device-boot/src/main/java/com/njcn/device/controller/LineController.java @@ -288,4 +288,21 @@ public class LineController extends BaseController { return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, lineMapper.getDeviceList(), methodDescribe); } + + /** + * 获取当前状态在线的监测点数量 + * @param lineIds 监测点集合 + * @return 在线的监测点数量 + * @author cdf + * @date 2022/8/1 + */ + @OperateInfo(info = LogEnum.BUSINESS_COMMON) + @PostMapping("/getOnLineCount") + @ApiOperation("获取当前状态在线的监测点数量") + @ApiImplicitParam(name = "lineIds", value = "监测点集合", required = true) + public HttpResult getOnLineCount(@RequestBody List lineIds) { + String methodDescribe = getMethodDescribe("getOnLineCount"); + return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, lineMapper.getOnLineCount(lineIds), methodDescribe); + } + } diff --git a/pqs-device/device-boot/src/main/java/com/njcn/device/mapper/LineMapper.java b/pqs-device/device-boot/src/main/java/com/njcn/device/mapper/LineMapper.java index 5a898ea25..e453df8e5 100644 --- a/pqs-device/device-boot/src/main/java/com/njcn/device/mapper/LineMapper.java +++ b/pqs-device/device-boot/src/main/java/com/njcn/device/mapper/LineMapper.java @@ -318,4 +318,10 @@ public interface LineMapper extends BaseMapper { * @return 装置Id */ List getDeviceList(); + + /** + * 获取当前状态在线的监测点数量 + * @return 装置Id + */ + Integer getOnLineCount(@Param("lineIds")List lineIds); } diff --git a/pqs-device/device-boot/src/main/java/com/njcn/device/mapper/mapping/LineMapper.xml b/pqs-device/device-boot/src/main/java/com/njcn/device/mapper/mapping/LineMapper.xml index e10d92078..b341e9d66 100644 --- a/pqs-device/device-boot/src/main/java/com/njcn/device/mapper/mapping/LineMapper.xml +++ b/pqs-device/device-boot/src/main/java/com/njcn/device/mapper/mapping/LineMapper.xml @@ -952,4 +952,23 @@ FROM + + + diff --git a/pqs-energy/energy-api/src/main/java/com/njcn/energy/pojo/enums/EnergyResponseEnum.java b/pqs-energy/energy-api/src/main/java/com/njcn/energy/pojo/enums/EnergyResponseEnum.java index b38de6966..2247cfe4e 100644 --- a/pqs-energy/energy-api/src/main/java/com/njcn/energy/pojo/enums/EnergyResponseEnum.java +++ b/pqs-energy/energy-api/src/main/java/com/njcn/energy/pojo/enums/EnergyResponseEnum.java @@ -67,7 +67,9 @@ public enum EnergyResponseEnum { TASK_HAS_START("508","任务已经执行完毕"), TASK_DEL_ERROR("509","定时任务删除失败,请联系管理员"), TASK_RUNING("510","任务正在执行无法操作,请先停止任务"), - TASK_TIME_ERROR("511","两条策略时间差应在5分钟以上") + TASK_TIME_ERROR("511","两条策略时间差应在5分钟以上"), + TASK_NO_RUN("512","策略不在执行中"), + TASK_STOP_ERROR("513","策略停止失败,请联系管理员"), ; private final String code; diff --git a/pqs-energy/energy-api/src/main/java/com/njcn/energy/pojo/param/AirStrategyParam.java b/pqs-energy/energy-api/src/main/java/com/njcn/energy/pojo/param/AirStrategyParam.java index 855217c9e..7c6be8459 100644 --- a/pqs-energy/energy-api/src/main/java/com/njcn/energy/pojo/param/AirStrategyParam.java +++ b/pqs-energy/energy-api/src/main/java/com/njcn/energy/pojo/param/AirStrategyParam.java @@ -31,14 +31,16 @@ public class AirStrategyParam{ @NotBlank(message = "名称不可为空") private String name; + @ApiModelProperty(name = "类型",required = true,value = "0.普通策略 1.关机策略 2.开机策略") + @NotNull(message = "策略类型不能为空") + private Integer type; + @ApiModelProperty(name = "开始时间",required = true) @NotBlank(message = "开始时间不可为空") - @DateTimeStrValid(format = "yyyy-MM-dd HH:mm:ss",message = "开始时间格式有误") private String startTime; @ApiModelProperty(name = "开始时间",required = true) @NotBlank(message = "开始时间不可为空") - @DateTimeStrValid(format = "yyyy-MM-dd HH:mm:ss",message = "结束时间格式有误") private String endTime; @ApiModelProperty(name = "空调模式",required = true) @@ -83,6 +85,7 @@ public class AirStrategyParam{ @EqualsAndHashCode(callSuper = true) public static class AirStrategyQueryParam extends BaseParam { + private Integer type; } diff --git a/pqs-energy/energy-api/src/main/java/com/njcn/energy/pojo/po/AirStrategy.java b/pqs-energy/energy-api/src/main/java/com/njcn/energy/pojo/po/AirStrategy.java index eb8b507c0..9547f7003 100644 --- a/pqs-energy/energy-api/src/main/java/com/njcn/energy/pojo/po/AirStrategy.java +++ b/pqs-energy/energy-api/src/main/java/com/njcn/energy/pojo/po/AirStrategy.java @@ -15,6 +15,7 @@ import lombok.Data; public class AirStrategy extends BaseEntity { private String id; private String name; + private Integer type; private String startTime; private String endTime; private String mode; diff --git a/pqs-energy/energy-api/src/main/java/com/njcn/energy/pojo/vo/AirStrategyVO.java b/pqs-energy/energy-api/src/main/java/com/njcn/energy/pojo/vo/AirStrategyVO.java index 783ae6272..17ce0d372 100644 --- a/pqs-energy/energy-api/src/main/java/com/njcn/energy/pojo/vo/AirStrategyVO.java +++ b/pqs-energy/energy-api/src/main/java/com/njcn/energy/pojo/vo/AirStrategyVO.java @@ -30,6 +30,9 @@ public class AirStrategyVO { @ApiModelProperty(name = "策略名称",required = true) private String name; + @ApiModelProperty(name = "策略类型",required = true) + private Integer type; + @ApiModelProperty(name = "开始时间",required = true) private String startTime; diff --git a/pqs-energy/energy-boot/src/main/java/com/njcn/energy/controller/EleAirStrategyController.java b/pqs-energy/energy-boot/src/main/java/com/njcn/energy/controller/EleAirStrategyController.java index dc6edcbb3..5ea28598f 100644 --- a/pqs-energy/energy-boot/src/main/java/com/njcn/energy/controller/EleAirStrategyController.java +++ b/pqs-energy/energy-boot/src/main/java/com/njcn/energy/controller/EleAirStrategyController.java @@ -109,7 +109,7 @@ public class EleAirStrategyController extends BaseController { @OperateInfo(info = LogEnum.SYSTEM_COMMON, operateType = OperateType.DELETE) @GetMapping("/delete") @ApiOperation("删除空调策略") - @ApiImplicitParam(name = "id", value = "网关设备索引", required = true) + @ApiImplicitParam(name = "id", value = "策略索引", required = true) public HttpResult delete(@RequestParam("id") String id) { String methodDescribe = getMethodDescribe("delete"); boolean result = eleAirStrategyService.deleteAirStrategy(id); @@ -121,6 +121,24 @@ public class EleAirStrategyController extends BaseController { } + /** + * 停止空调策略 + */ + @OperateInfo(info = LogEnum.SYSTEM_COMMON) + @GetMapping("/stop") + @ApiOperation("停止空调策略") + @ApiImplicitParam(name = "id", value = "策略索引", required = true) + public HttpResult stopAirStrategy(@RequestParam("id") String id) { + String methodDescribe = getMethodDescribe("stopAirStrategy"); + boolean result = eleAirStrategyService.stopAirStrategy(id); + if (result) { + return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, null, methodDescribe); + } else { + return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.FAIL, null, methodDescribe); + } + } + + /** * 查询空调策略详情 * @author cdf diff --git a/pqs-energy/energy-boot/src/main/java/com/njcn/energy/mapper/mapping/LogicDeviceLineMapper.xml b/pqs-energy/energy-boot/src/main/java/com/njcn/energy/mapper/mapping/LogicDeviceLineMapper.xml index 5b514722e..e7678ed24 100644 --- a/pqs-energy/energy-boot/src/main/java/com/njcn/energy/mapper/mapping/LogicDeviceLineMapper.xml +++ b/pqs-energy/energy-boot/src/main/java/com/njcn/energy/mapper/mapping/LogicDeviceLineMapper.xml @@ -12,7 +12,7 @@ @@ -178,7 +178,7 @@ WHERE inner join ele_logic_dev b on a.pid = b.id inner join ele_net_dev c on b.pid = c.id where a.state = 1 - and a.id in + and a.line_id in #{item} diff --git a/pqs-energy/energy-boot/src/main/java/com/njcn/energy/service/EleAirStrategyService.java b/pqs-energy/energy-boot/src/main/java/com/njcn/energy/service/EleAirStrategyService.java index bad5ba362..ef492a7c4 100644 --- a/pqs-energy/energy-boot/src/main/java/com/njcn/energy/service/EleAirStrategyService.java +++ b/pqs-energy/energy-boot/src/main/java/com/njcn/energy/service/EleAirStrategyService.java @@ -45,6 +45,14 @@ public interface EleAirStrategyService extends IService { */ boolean deleteAirStrategy(String id); + /** + * 停止策略 + * @param id id + * @return 操作结果 + */ + boolean stopAirStrategy(String id); + + /** * 获取空调策略信息 * @param id id diff --git a/pqs-energy/energy-boot/src/main/java/com/njcn/energy/service/impl/EleAirStrategyServiceImpl.java b/pqs-energy/energy-boot/src/main/java/com/njcn/energy/service/impl/EleAirStrategyServiceImpl.java index dcf2e0b78..fffb55099 100644 --- a/pqs-energy/energy-boot/src/main/java/com/njcn/energy/service/impl/EleAirStrategyServiceImpl.java +++ b/pqs-energy/energy-boot/src/main/java/com/njcn/energy/service/impl/EleAirStrategyServiceImpl.java @@ -39,6 +39,9 @@ import com.njcn.energy.pojo.vo.AirStrategyVO; import com.njcn.energy.pojo.vo.EnergyDeviceTreeVO; import com.njcn.energy.service.EleAirStrategyService; import com.njcn.energy.service.IEleSetService; +import com.njcn.influxdb.param.InfluxDBPublicParam; +import com.njcn.influxdb.utils.InfluxDBCommUtils; +import com.njcn.influxdb.utils.InfluxDbUtils; import com.njcn.job.api.JobFeignClient; import com.njcn.job.model.XxlJobInfo; import com.njcn.web.factory.PageFactory; @@ -48,10 +51,12 @@ import lombok.AllArgsConstructor; import lombok.RequiredArgsConstructor; import org.apache.commons.lang.StringUtils; import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.influxdb.dto.QueryResult; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; @@ -75,17 +80,19 @@ public class EleAirStrategyServiceImpl extends ServiceImpl param.like("ele_air_strategy.name", queryParam.getSearchValue())); } + if (queryParam.getType() == 0) { + queryWrapper.eq("ele_air_strategy.type", queryParam.getType()); + } else { + queryWrapper.ne("ele_air_strategy.type", 0); + } //排序 if (ObjectUtil.isAllNotEmpty(queryParam.getSortBy(), queryParam.getOrderBy())) { @@ -107,6 +119,7 @@ public class EleAirStrategyServiceImpl extends ServiceImpl(PageFactory.getPageNum(queryParam), PageFactory.getPageSize(queryParam)), queryWrapper); @@ -115,108 +128,156 @@ public class EleAirStrategyServiceImpl extends ServiceImpl tem = new LambdaQueryWrapper<>(); - tem.eq(AirStrategy::getState, DataStateEnum.ENABLE.getCode()); - List temList = this.list(tem); - if (CollectionUtil.isNotEmpty(temList)) { - for (AirStrategy airStrategy : temList) { - LocalDateTime start = LocalDateTimeUtil.parse(airStrategy.getStartTime(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); - LocalDateTime startParam = LocalDateTimeUtil.parse(airStrategyParam.getStartTime(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); - long rangeStart = LocalDateTimeUtil.between(start, startParam).toMinutes(); - LocalDateTime end = LocalDateTimeUtil.parse(airStrategy.getStartTime(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); - LocalDateTime endParam = LocalDateTimeUtil.parse(airStrategyParam.getStartTime(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); - long rangeEnd = LocalDateTimeUtil.between(end, endParam).toMinutes(); + if (airStrategyParam.getType() == 0) { + //默认策略 + //校验参数 + LambdaQueryWrapper tem = new LambdaQueryWrapper<>(); + tem.eq(AirStrategy::getState, DataStateEnum.ENABLE.getCode()); + tem.eq(AirStrategy::getType,0); + List temList = this.list(tem); + if (CollectionUtil.isNotEmpty(temList)) { + for (AirStrategy airStrategy : temList) { + LocalDateTime start = LocalDateTimeUtil.parse(airStrategy.getStartTime(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); + LocalDateTime startParam = LocalDateTimeUtil.parse(airStrategyParam.getStartTime(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); + long rangeStart = LocalDateTimeUtil.between(start, startParam).toMinutes(); + LocalDateTime end = LocalDateTimeUtil.parse(airStrategy.getStartTime(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); + LocalDateTime endParam = LocalDateTimeUtil.parse(airStrategyParam.getStartTime(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); + long rangeEnd = LocalDateTimeUtil.between(end, endParam).toMinutes(); - if(rangeStart<=5 ||rangeEnd<=5 ){ - throw new BusinessException(EnergyResponseEnum.TASK_TIME_ERROR); + if (rangeStart <= 5 || rangeEnd <= 5) { + throw new BusinessException(EnergyResponseEnum.TASK_TIME_ERROR); + } } + + } + AirStrategy airStrategy = assAirStrategy(airStrategyParam); + + List list = new ArrayList<>(); + airStrategyParam.getLineIds().forEach((item) -> { + AirSet airSet = new AirSet(airStrategy.getId(), item); + list.add(airSet); + }); + iEleSetService.saveBatch(list); + + + //时间表达式需要处理成 秒 分 时 日 月 ? 年,标志指定时间执行一次 + LocalDateTime startTime = LocalDateTimeUtil.parse(airStrategy.getStartTime(), DatePattern.NORM_DATETIME_PATTERN); + String cronOn = "" + startTime.getSecond() + CharUtil.SPACE + startTime.getMinute() + CharUtil.SPACE + startTime.getHour() + CharUtil.SPACE + startTime.getDayOfMonth() + CharUtil.SPACE + startTime.getMonthValue() + CharUtil.SPACE + "?" + CharUtil.SPACE + startTime.getYear(); + String paramOn = "open" + StrUtil.C_COMMA + airStrategy.getId(); + + XxlJobInfo xxlJobInfo = assScheduling("测试定时开空调",cronOn,paramOn); + HttpResult result = jobFeignClient.addJob(xxlJobInfo); + if (result.getCode().equals(String.valueOf(ReturnT.FAIL_CODE))) { + throw new BusinessException(EnergyResponseEnum.TASK_CREATE_ERROR); } + + //时间表达式需要处理成 秒 分 时 日 月 ? 年,标志指定时间执行一次 + LocalDateTime startTimeEnd = LocalDateTimeUtil.parse(airStrategy.getEndTime(), DatePattern.NORM_DATETIME_PATTERN); + String cronOff = "" + startTimeEnd.getSecond() + CharUtil.SPACE + startTimeEnd.getMinute() + CharUtil.SPACE + startTimeEnd.getHour() + CharUtil.SPACE + startTimeEnd.getDayOfMonth() + CharUtil.SPACE + startTimeEnd.getMonthValue() + CharUtil.SPACE + "?" + CharUtil.SPACE + startTimeEnd.getYear(); + String paramOff = "close" + StrUtil.C_COMMA + airStrategy.getId(); + XxlJobInfo airStrategyClose = assScheduling("测试定时关空调",cronOff,paramOff); + HttpResult result2 = jobFeignClient.addJob(airStrategyClose); + if (result2.getCode().equals(String.valueOf(ReturnT.FAIL_CODE))) { + throw new BusinessException(EnergyResponseEnum.TASK_CREATE_ERROR); + } + + String ids = result.getData() + StrUtil.COMMA + result2.getData(); + airStrategy.setXxlId(ids); + this.updateById(airStrategy); + } else if(airStrategyParam.getType() == 1) { + + + //开关机策略 + AirStrategy airStrategyOnOff = assAirStrategy(airStrategyParam); + + List list = new ArrayList<>(); + airStrategyParam.getLineIds().forEach((item) -> { + AirSet airSet = new AirSet(airStrategyOnOff.getId(), item); + list.add(airSet); + }); + iEleSetService.saveBatch(list); + /* + * 添加开机调度任务 + */ + //时间表达式需要处理成 秒 分 时 日 月 ? 年,标志指定时间执行一次 + String startTime = airStrategyOnOff.getStartTime(); + String[] temTime = startTime.split(":"); + String cron = "0" + CharUtil.SPACE + temTime[1] + CharUtil.SPACE + temTime[0] + CharUtil.SPACE + "* * ?"; + String param = "close" + StrUtil.C_COMMA + airStrategyOnOff.getId(); + XxlJobInfo xOn = assScheduling("每日定时关空调",cron,param); + HttpResult result = jobFeignClient.addJob(xOn); + if (result.getCode().equals(String.valueOf(ReturnT.FAIL_CODE))) { + throw new BusinessException(EnergyResponseEnum.TASK_CREATE_ERROR); + } + airStrategyOnOff.setXxlId(result.getData()); + this.updateById(airStrategyOnOff); + } else if(airStrategyParam.getType() == 2) { + //开机策略 + AirStrategy airStrategyOnOff = assAirStrategy(airStrategyParam); + List list = new ArrayList<>(); + airStrategyParam.getLineIds().forEach((item) -> { + AirSet airSet = new AirSet(airStrategyOnOff.getId(), item); + list.add(airSet); + }); + iEleSetService.saveBatch(list); + /* + * 添加开机调度任务 + */ + String startTime = airStrategyOnOff.getStartTime(); + String[] temTime = startTime.split(":"); + String cron = "0" + CharUtil.SPACE + temTime[1] + CharUtil.SPACE + temTime[0] + CharUtil.SPACE + "* * ?"; + String param = "open" + StrUtil.C_COMMA + airStrategyOnOff.getId(); + XxlJobInfo xOff = assScheduling("每日定时开空调",cron,param); + HttpResult result = jobFeignClient.addJob(xOff); + if (result.getCode().equals(String.valueOf(ReturnT.FAIL_CODE))) { + throw new BusinessException(EnergyResponseEnum.TASK_CREATE_ERROR); + } + airStrategyOnOff.setXxlId(result.getData()); + this.updateById(airStrategyOnOff); } - AirStrategy airStrategy = new AirStrategy(); - BeanUtils.copyProperties(airStrategyParam, airStrategy); - airStrategy.setState(DataStateEnum.ENABLE.getCode()); - airStrategy.setStatus(0); - airStrategy.setCreateBy(RequestUtil.getUserIndex()); - airStrategy.setCreateTime(LocalDateTime.now()); - airStrategy.setUpdateTime(LocalDateTime.now()); - this.save(airStrategy); + + return true; + } + /*组装数据库数据*/ + private AirStrategy assAirStrategy(AirStrategyParam airStrategyParam){ + AirStrategy airStrategyOnOff = new AirStrategy(); + BeanUtils.copyProperties(airStrategyParam, airStrategyOnOff); + airStrategyOnOff.setState(DataStateEnum.ENABLE.getCode()); + airStrategyOnOff.setStatus(0); + airStrategyOnOff.setCreateBy(RequestUtil.getUserIndex()); + airStrategyOnOff.setCreateTime(LocalDateTime.now()); + airStrategyOnOff.setUpdateTime(LocalDateTime.now()); + this.save(airStrategyOnOff); + return airStrategyOnOff; + } - - List list = new ArrayList<>(); - airStrategyParam.getLineIds().forEach((item)->{ - AirSet airSet = new AirSet(airStrategy.getId(),item); - list.add(airSet); - }); - iEleSetService.saveBatch(list); - - - - /* - * 此处做示例,手动指定 - */ + /*组装调度任务*/ + private XxlJobInfo assScheduling(String desc,String confTime,String param){ XxlJobInfo xxlJobInfo = new XxlJobInfo(); //执行器ID,手动指定,此处设置为3,对应xxl_job_group中的executor--测试执行器 xxlJobInfo.setJobGroup(xxlGroup); //任务描述 - xxlJobInfo.setJobDesc("开启空调"); + xxlJobInfo.setJobDesc(desc); xxlJobInfo.setAuthor("cdf"); xxlJobInfo.setScheduleType("CRON"); - //时间表达式需要处理成 秒 分 时 日 月 ? 年,标志指定时间执行一次 - LocalDateTime startTime = LocalDateTimeUtil.parse(airStrategy.getStartTime(), DatePattern.NORM_DATETIME_PATTERN); - xxlJobInfo.setScheduleConf("" + startTime.getSecond() + CharUtil.SPACE + startTime.getMinute() + CharUtil.SPACE + startTime.getHour() + CharUtil.SPACE + startTime.getDayOfMonth() + CharUtil.SPACE + startTime.getMonthValue() + CharUtil.SPACE + "?" + CharUtil.SPACE + startTime.getYear()); + xxlJobInfo.setScheduleConf(confTime); xxlJobInfo.setMisfireStrategy("DO_NOTHING"); xxlJobInfo.setExecutorRouteStrategy("FIRST"); xxlJobInfo.setExecutorBlockStrategy("SERIAL_EXECUTION"); //指定处理器 xxlJobInfo.setExecutorHandler("airStrategyJob"); //传递的参数 - xxlJobInfo.setExecutorParam("open" + StrUtil.C_COMMA + airStrategy.getId()); + xxlJobInfo.setExecutorParam(param); xxlJobInfo.setGlueType("BEAN"); xxlJobInfo.setGlueRemark("GLUE代码初始化"); - HttpResult result = jobFeignClient.addJob(xxlJobInfo); - if (result.getCode().equals(ReturnT.FAIL_CODE)) { - throw new BusinessException(EnergyResponseEnum.TASK_CREATE_ERROR); - } - - /* - * 此处做示例,手动指定 - */ - XxlJobInfo xxlJobInfoEnd = new XxlJobInfo(); - //执行器ID,手动指定,此处设置为3,对应xxl_job_group中的executor--测试执行器 - xxlJobInfoEnd.setJobGroup(xxlGroup); - //任务描述 - xxlJobInfoEnd.setJobDesc("关闭空调"); - xxlJobInfoEnd.setAuthor("cdf"); - xxlJobInfoEnd.setScheduleType("CRON"); - //时间表达式需要处理成 秒 分 时 日 月 ? 年,标志指定时间执行一次 - LocalDateTime startTimeEnd = LocalDateTimeUtil.parse(airStrategy.getEndTime(), DatePattern.NORM_DATETIME_PATTERN); - xxlJobInfoEnd.setScheduleConf("" + startTimeEnd.getSecond() + CharUtil.SPACE + startTimeEnd.getMinute() + CharUtil.SPACE + startTimeEnd.getHour() + CharUtil.SPACE + startTimeEnd.getDayOfMonth() + CharUtil.SPACE + startTimeEnd.getMonthValue() + CharUtil.SPACE + "?" + CharUtil.SPACE + startTimeEnd.getYear()); - xxlJobInfoEnd.setMisfireStrategy("DO_NOTHING"); - xxlJobInfoEnd.setExecutorRouteStrategy("FIRST"); - xxlJobInfoEnd.setExecutorBlockStrategy("SERIAL_EXECUTION"); - //指定处理器 - xxlJobInfoEnd.setExecutorHandler("airStrategyJob"); - //传递的参数 - xxlJobInfoEnd.setExecutorParam("close"+StrUtil.C_COMMA+airStrategy.getId()); - xxlJobInfoEnd.setGlueType("BEAN"); - xxlJobInfoEnd.setGlueRemark("GLUE代码初始化"); - HttpResult result2 = jobFeignClient.addJob(xxlJobInfoEnd); - - if (result2.getCode().equals(ReturnT.FAIL_CODE)) { - throw new BusinessException(EnergyResponseEnum.TASK_CREATE_ERROR); - } - - - String ids = result.getData().toString() + StrUtil.COMMA + result2.getData().toString(); - airStrategy.setXxlId(ids); - this.updateById(airStrategy); - - return true; + return xxlJobInfo; } @Override @@ -227,6 +288,7 @@ public class EleAirStrategyServiceImpl extends ServiceImpl list = new ArrayList<>(); updateParam.getLineIds().forEach((item) -> { AirSet airSet = new AirSet(airStrategy.getId(), item); list.add(airSet); }); iEleSetService.saveBatch(list); - /* - * 此处做示例,手动指定 - */ + + String[] jobIds = airStrategyRes.getXxlId().split(StrUtil.COMMA); - XxlJobInfo xxlJobInfo = new XxlJobInfo(); - //执行器ID,手动指定,此处设置为3,对应xxl_job_group中的executor--测试执行器 - xxlJobInfo.setId(Integer.parseInt(jobIds[0])); - xxlJobInfo.setJobGroup(xxlGroup); - //任务描述 - xxlJobInfo.setJobDesc("开启空调"); - xxlJobInfo.setAuthor("cdf"); - xxlJobInfo.setScheduleType("CRON"); - //时间表达式需要处理成 秒 分 时 日 月 ? 年,标志指定时间执行一次 - LocalDateTime startTime = LocalDateTimeUtil.parse(airStrategy.getStartTime(), DatePattern.NORM_DATETIME_PATTERN); - xxlJobInfo.setScheduleConf("" + startTime.getSecond() + CharUtil.SPACE + startTime.getMinute() + CharUtil.SPACE + startTime.getHour() + CharUtil.SPACE + startTime.getDayOfMonth() + CharUtil.SPACE + startTime.getMonthValue() + CharUtil.SPACE + "?" + CharUtil.SPACE + startTime.getYear()); - xxlJobInfo.setMisfireStrategy("DO_NOTHING"); - xxlJobInfo.setExecutorRouteStrategy("FIRST"); - xxlJobInfo.setExecutorBlockStrategy("SERIAL_EXECUTION"); - //指定处理器 - xxlJobInfo.setExecutorHandler("airStrategyJob"); - //传递的参数 - xxlJobInfo.setExecutorParam("open" + StrUtil.C_COMMA + airStrategy.getId()); - xxlJobInfo.setGlueType("BEAN"); - xxlJobInfo.setGlueRemark("GLUE代码初始化"); - HttpResult result = jobFeignClient.updateJob(xxlJobInfo); - if (result.getCode().equals(ReturnT.FAIL_CODE)) { - throw new BusinessException(EnergyResponseEnum.TASK_CREATE_ERROR); + if(updateParam.getType() == 0) { + //时间表达式需要处理成 秒 分 时 日 月 ? 年,标志指定时间执行一次 + LocalDateTime startTime = LocalDateTimeUtil.parse(airStrategy.getStartTime(), DatePattern.NORM_DATETIME_PATTERN); + String cronOn = "" + startTime.getSecond() + CharUtil.SPACE + startTime.getMinute() + CharUtil.SPACE + startTime.getHour() + CharUtil.SPACE + startTime.getDayOfMonth() + CharUtil.SPACE + startTime.getMonthValue() + CharUtil.SPACE + "?" + CharUtil.SPACE + startTime.getYear(); + String paramOn = "open" + StrUtil.C_COMMA + airStrategy.getId(); + + XxlJobInfo xxlJobInfo = assScheduling("测试开空调",cronOn,paramOn); + xxlJobInfo.setId(Integer.parseInt(jobIds[0])); + HttpResult result = jobFeignClient.updateJob(xxlJobInfo); + if (result.getCode().equals(String.valueOf(ReturnT.FAIL_CODE))) { + throw new BusinessException(EnergyResponseEnum.TASK_CREATE_ERROR); + } + LocalDateTime startTimeEnd = LocalDateTimeUtil.parse(airStrategy.getEndTime(), DatePattern.NORM_DATETIME_PATTERN); + String cronOff = "" + startTimeEnd.getSecond() + CharUtil.SPACE + startTimeEnd.getMinute() + CharUtil.SPACE + startTimeEnd.getHour() + CharUtil.SPACE + startTimeEnd.getDayOfMonth() + CharUtil.SPACE + startTimeEnd.getMonthValue() + CharUtil.SPACE + "?" + CharUtil.SPACE + startTimeEnd.getYear(); + String paramOff = "close" + StrUtil.C_COMMA + airStrategy.getId(); + + XxlJobInfo xxlJobInfoOff = assScheduling("测试关空调",cronOff,paramOff); + xxlJobInfoOff.setId(Integer.parseInt(jobIds[1])); + HttpResult result2 = jobFeignClient.updateJob(xxlJobInfoOff); + if (result.getCode().equals(String.valueOf(ReturnT.FAIL_CODE))) { + throw new BusinessException(EnergyResponseEnum.TASK_CREATE_ERROR); + } + + if (result2.getCode().equals(String.valueOf(ReturnT.FAIL_CODE))) { + throw new BusinessException(EnergyResponseEnum.TASK_CREATE_ERROR); + } + }else if(updateParam.getType() == 1){ + String[] temTime = updateParam.getStartTime().split(":"); + String cron = "0" + CharUtil.SPACE + temTime[1] + CharUtil.SPACE + temTime[0] + CharUtil.SPACE + "* * ?"; + String param = "close" + StrUtil.C_COMMA + airStrategy.getId(); + XxlJobInfo xOff = assScheduling("每日定时关空调",cron,param); + xOff.setId(Integer.parseInt(jobIds[0])); + HttpResult result = jobFeignClient.updateJob(xOff); + if (result.getCode().equals(String.valueOf(ReturnT.FAIL_CODE))) { + throw new BusinessException(EnergyResponseEnum.TASK_CREATE_ERROR); + } + }else if(updateParam.getType() == 2){ + String[] temTime = updateParam.getStartTime().split(":"); + String cron = "0" + CharUtil.SPACE + temTime[1] + CharUtil.SPACE + temTime[0] + CharUtil.SPACE + "* * ?"; + String param = "open" + StrUtil.C_COMMA + airStrategy.getId(); + XxlJobInfo xOff = assScheduling("每日定时开空调",cron,param); + xOff.setId(Integer.parseInt(jobIds[0])); + HttpResult result = jobFeignClient.updateJob(xOff); + if (result.getCode().equals(String.valueOf(ReturnT.FAIL_CODE))) { + throw new BusinessException(EnergyResponseEnum.TASK_CREATE_ERROR); + } } - - /* - * 此处做示例,手动指定 - */ - XxlJobInfo xxlJobInfoEnd = new XxlJobInfo(); - xxlJobInfoEnd.setId(Integer.parseInt(jobIds[1])); - //执行器ID,手动指定,此处设置为3,对应xxl_job_group中的executor--测试执行器 - xxlJobInfoEnd.setJobGroup(xxlGroup); - //任务描述 - xxlJobInfoEnd.setJobDesc("关闭空调"); - xxlJobInfoEnd.setAuthor("cdf"); - xxlJobInfoEnd.setScheduleType("CRON"); - //时间表达式需要处理成 秒 分 时 日 月 ? 年,标志指定时间执行一次 - LocalDateTime startTimeEnd = LocalDateTimeUtil.parse(airStrategy.getEndTime(), DatePattern.NORM_DATETIME_PATTERN); - xxlJobInfoEnd.setScheduleConf("" + startTimeEnd.getSecond() + CharUtil.SPACE + startTimeEnd.getMinute() + CharUtil.SPACE + startTimeEnd.getHour() + CharUtil.SPACE + startTimeEnd.getDayOfMonth() + CharUtil.SPACE + startTimeEnd.getMonthValue() + CharUtil.SPACE + "?" + CharUtil.SPACE + startTimeEnd.getYear()); - xxlJobInfoEnd.setMisfireStrategy("DO_NOTHING"); - xxlJobInfoEnd.setExecutorRouteStrategy("FIRST"); - xxlJobInfoEnd.setExecutorBlockStrategy("SERIAL_EXECUTION"); - //指定处理器 - xxlJobInfoEnd.setExecutorHandler("airStrategyJob"); - //传递的参数 - xxlJobInfoEnd.setExecutorParam("close" + StrUtil.C_COMMA + airStrategy.getId()); - xxlJobInfoEnd.setGlueType("BEAN"); - xxlJobInfoEnd.setGlueRemark("GLUE代码初始化"); - HttpResult result2 = jobFeignClient.updateJob(xxlJobInfoEnd); - - if (result2.getCode().equals(ReturnT.FAIL_CODE)) { - throw new BusinessException(EnergyResponseEnum.TASK_CREATE_ERROR); - } - return true; } @@ -337,6 +390,33 @@ public class EleAirStrategyServiceImpl extends ServiceImpl result = jobFeignClient.stopJob(Integer.parseInt(xxlId)); + if (result.getCode().equals(StrUtil.toString(ReturnT.FAIL_CODE))) { + throw new BusinessException(EnergyResponseEnum.TASK_STOP_ERROR); + } + } + + this.lambdaUpdate() + .set(AirStrategy::getStatus, 4) + .eq(AirStrategy::getId, id) + .update(); + + return true; + } + + @Override public AirStrategyVO findById(String id) { AirStrategy airStrategy = this.lambdaQuery().eq(AirStrategy::getId, id).one(); @@ -361,20 +441,15 @@ public class EleAirStrategyServiceImpl extends ServiceImpl result = jobFeignClient.startTask(Integer.parseInt(xxlId)); if (result.getCode().equals(StrUtil.toString(ReturnT.FAIL_CODE))) { throw new BusinessException(EnergyResponseEnum.TASK_RUNING); } } - - this.lambdaUpdate().set(AirStrategy::getStatus, 1).eq(AirStrategy::getId, id).update(); - } else if (airStrategy.getStatus() == 1) { //已经执行中 - for (String xxlId : ids) { HttpResult result = jobFeignClient.stopJob(Integer.parseInt(xxlId)); if (result.getCode().equals(StrUtil.toString(ReturnT.FAIL_CODE))) { @@ -386,7 +461,6 @@ public class EleAirStrategyServiceImpl extends ServiceImpl lambdaQueryWrapper = new LambdaQueryWrapper<>(); lambdaQueryWrapper.eq(AirSet::getId, id); List list = iEleSetService.list(lambdaQueryWrapper); if (CollectionUtil.isNotEmpty(list)) { List lineIds = list.stream().map(AirSet::getLineId).collect(Collectors.toList()); + //如果是关闭操作 + if ("close".equals(operation)) { + StringBuilder temSql = assToInfluxParam(lineIds); + String sql = "select LineId from air_data_Real where " + temSql + " and ACInStat = 'On'"; + QueryResult result = influxDbUtils.query(sql); + List listSeries = result.getResults().get(0).getSeries(); + if (!CollectionUtils.isEmpty(listSeries)) { + System.out.println(listSeries); + List lineIdTem = new ArrayList<>(); + listSeries.get(0).getValues().forEach(item -> { + lineIdTem.add(item.get(1).toString()); + }); + lineIds = lineIdTem; + } + } + System.out.println(lineIds); List netDevList = logicDeviceLineMapper.getNetAndDevByLineIds(lineIds); - if (CollectionUtil.isNotEmpty(netDevList)) { for (NetAndDevByLineDTO netAndDevByLineDTO : netDevList) { @@ -419,11 +510,11 @@ public class EleAirStrategyServiceImpl extends ServiceImpl lineIds) { + StringBuilder lineIdsStr = new StringBuilder("("); + for (int i = 0; i < lineIds.size(); i++) { + if (lineIds.size() - i != 1) { + lineIdsStr.append("LineId ='").append(lineIds.get(i)).append("' or "); + } else { + lineIdsStr.append("LineId ='").append(lineIds.get(i)).append("') "); + } + } + return lineIdsStr; + } + } diff --git a/pqs-energy/energy-boot/src/main/resources/bootstrap.yml b/pqs-energy/energy-boot/src/main/resources/bootstrap.yml index 1e900cca4..65a1f2aa3 100644 --- a/pqs-energy/energy-boot/src/main/resources/bootstrap.yml +++ b/pqs-energy/energy-boot/src/main/resources/bootstrap.yml @@ -20,6 +20,7 @@ spring: cloud: nacos: discovery: + ip: @service.server.url@ server-addr: @nacos.url@ namespace: @nacos.namespace@ config: diff --git a/pqs-job/job-executor/src/main/resources/bootstrap.yml b/pqs-job/job-executor/src/main/resources/bootstrap.yml index 288fd560a..17fe0b1cb 100644 --- a/pqs-job/job-executor/src/main/resources/bootstrap.yml +++ b/pqs-job/job-executor/src/main/resources/bootstrap.yml @@ -16,6 +16,7 @@ spring: cloud: nacos: discovery: + ip: @service.server.url@ server-addr: @nacos.url@ namespace: @nacos.namespace@ config: @@ -41,12 +42,12 @@ logging: xxl: job: admin: - addresses: http://192.168.1.13:10217/job-admin + addresses: http://192.168.1.102:10217/job-admin #执行器通讯TOKEN [选填]:非空时启用; accessToken: executor: #执行器AppName [选填]:执行器心跳注册分组依据;为空则关闭自动注册 - appname: executor + appname: executorCdf #执行器注册 [选填]:优先使用该配置作为注册地址,为空时使用内嵌服务 ”IP:PORT“ 作为注册地址。从而更灵活的支持容器类型执行器动态IP和动态映射端口问题。 address: #执行器IP [选填]:默认为空表示自动获取IP,多网卡时可手动设置指定IP,该IP不会绑定Host仅作为通讯实用;地址信息用于 "执行器注册" 和 "调度中心请求并触发任务";