pom.xml
@@ -278,6 +278,7 @@ <module>zhitan-quartz</module> <module>zhitan-generator</module> <module>zhitan-common</module> <module>zhitan-airconditioner</module> </modules> <profiles> zhitan-admin/pom.xml
@@ -71,6 +71,12 @@ <version>1.16.7</version> <scope>compile</scope> </dependency> <dependency> <groupId>com.zhitan</groupId> <artifactId>zhitan-airconditioner</artifactId> <version>2.5.2</version> <scope>compile</scope> </dependency> </dependencies> <build> zhitan-admin/src/main/java/com/zhitan/web/controller/airconditioner/AirConditionerController.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,100 @@ package com.zhitan.web.controller.airconditioner; import java.util.List; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.zhitan.common.annotation.Log; import com.zhitan.common.core.controller.BaseController; import com.zhitan.common.core.domain.AjaxResult; import com.zhitan.common.enums.BusinessType; import com.zhitan.common.utils.poi.ExcelUtil; import com.zhitan.airconditioner.domain.AirConditioner; import com.zhitan.airconditioner.service.IAirConditionerService; import com.zhitan.common.core.page.TableDataInfo; /** * 空è°ç®¡çController * * @author zhitan */ @RestController @RequestMapping("/system/airconditioner") public class AirConditionerController extends BaseController { @Autowired private IAirConditionerService airConditionerService; /** * æ¥è¯¢ç©ºè°å表 */ @PreAuthorize("@ss.hasPermi('system:airconditioner:list')") @GetMapping("/list") public TableDataInfo list(AirConditioner airConditioner) { startPage(); List<AirConditioner> list = airConditionerService.selectAirConditionerList(airConditioner); return getDataTable(list); } /** * è·å空è°è¯¦ç»ä¿¡æ¯ */ @PreAuthorize("@ss.hasPermi('system:airconditioner:query')") @GetMapping(value = "/{id}") public AjaxResult getInfo(@PathVariable("id") Long id) { return success(airConditionerService.selectAirConditionerById(id)); } /** * æ°å¢ç©ºè° */ @PreAuthorize("@ss.hasPermi('system:airconditioner:add')") @Log(title = "空è°ç®¡ç", businessType = BusinessType.INSERT) @PostMapping public AjaxResult add(@RequestBody AirConditioner airConditioner) { return toAjax(airConditionerService.insertAirConditioner(airConditioner)); } /** * ä¿®æ¹ç©ºè° */ @PreAuthorize("@ss.hasPermi('system:airconditioner:edit')") @Log(title = "空è°ç®¡ç", businessType = BusinessType.UPDATE) @PutMapping public AjaxResult edit(@RequestBody AirConditioner airConditioner) { return toAjax(airConditionerService.updateAirConditioner(airConditioner)); } /** * å é¤ç©ºè° */ @PreAuthorize("@ss.hasPermi('system:airconditioner:remove')") @Log(title = "空è°ç®¡ç", businessType = BusinessType.DELETE) @DeleteMapping("/{ids}") public AjaxResult remove(@PathVariable Long[] ids) { return toAjax(airConditionerService.deleteAirConditionerByIds(ids)); } /** * æ§å¶ç©ºè°å¼å ³æº */ @PreAuthorize("@ss.hasPermi('system:airconditioner:control')") @Log(title = "ç©ºè°æ§å¶", businessType = BusinessType.OTHER) @PostMapping("/control") public AjaxResult control(@RequestBody AirConditioner airConditioner) { return toAjax(airConditionerService.controlAirConditioner(airConditioner.getId(), airConditioner.getMode(), "0")); } } zhitan-admin/src/main/java/com/zhitan/web/controller/airconditioner/AirConditionerLogController.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,59 @@ package com.zhitan.web.controller.airconditioner; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.zhitan.common.annotation.Log; import com.zhitan.common.core.controller.BaseController; import com.zhitan.common.core.domain.AjaxResult; import com.zhitan.common.core.page.TableDataInfo; import com.zhitan.common.enums.BusinessType; import com.zhitan.airconditioner.domain.AirConditionerLog; import com.zhitan.airconditioner.service.IAirConditionerLogService; /** * ç©ºè°æä½æ¥å¿Controller * * @author zhitan */ @RestController @RequestMapping("/system/airconditioner/log") public class AirConditionerLogController extends BaseController { @Autowired private IAirConditionerLogService airConditionerLogService; /** * æ¥è¯¢ç©ºè°æä½æ¥å¿å表 */ @PreAuthorize("@ss.hasPermi('airconditioner:log:list')") @GetMapping("/list") public TableDataInfo list(AirConditionerLog airConditionerLog) { startPage(); List<AirConditionerLog> list = airConditionerLogService.selectAirConditionerLogList(airConditionerLog); return getDataTable(list); } /** * è·åç©ºè°æä½æ¥å¿è¯¦ç»ä¿¡æ¯ */ @PreAuthorize("@ss.hasPermi('airconditioner:log:query')") @GetMapping(value = "/{id}") public AjaxResult getInfo(@PathVariable("id") Long id) { return success(airConditionerLogService.selectAirConditionerLogById(id)); } /** * æ ¹æ®ç©ºè°IDæ¥è¯¢æä½æ¥å¿å表 */ @PreAuthorize("@ss.hasPermi('airconditioner:log:list')") @GetMapping("/listByAirConditionerId/{airConditionerId}") public TableDataInfo listByAirConditionerId(@PathVariable("airConditionerId") Long airConditionerId) { startPage(); List<AirConditionerLog> list = airConditionerLogService.selectAirConditionerLogByAirConditionerId(airConditionerId); return getDataTable(list); } } zhitan-admin/src/main/java/com/zhitan/web/controller/airconditioner/AirConditionerScheduleController.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,99 @@ package com.zhitan.web.controller.airconditioner; import java.util.List; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.zhitan.common.annotation.Log; import com.zhitan.common.core.controller.BaseController; import com.zhitan.common.core.domain.AjaxResult; import com.zhitan.common.enums.BusinessType; import com.zhitan.airconditioner.domain.AirConditionerSchedule; import com.zhitan.airconditioner.service.IAirConditionerScheduleService; import com.zhitan.common.core.page.TableDataInfo; /** * 空è°å®æ¶ä»»å¡Controller * * @author zhitan */ @RestController @RequestMapping("/system/airconditioner/schedule") public class AirConditionerScheduleController extends BaseController { @Autowired private IAirConditionerScheduleService airConditionerScheduleService; /** * æ¥è¯¢ç©ºè°å®æ¶ä»»å¡å表 */ @PreAuthorize("@ss.hasPermi('system:airconditioner:schedule:list')") @GetMapping("/list") public TableDataInfo list(AirConditionerSchedule airConditionerSchedule) { startPage(); List<AirConditionerSchedule> list = airConditionerScheduleService.selectAirConditionerScheduleList(airConditionerSchedule); return getDataTable(list); } /** * è·å空è°å®æ¶ä»»å¡è¯¦ç»ä¿¡æ¯ */ @PreAuthorize("@ss.hasPermi('system:airconditioner:schedule:query')") @GetMapping(value = "/{id}") public AjaxResult getInfo(@PathVariable("id") Long id) { return success(airConditionerScheduleService.selectAirConditionerScheduleById(id)); } /** * æ ¹æ®ç©ºè°IDæ¥è¯¢å®æ¶ä»»å¡å表 */ @PreAuthorize("@ss.hasPermi('system:airconditioner:schedule:list')") @GetMapping("/byAirConditioner/{airConditionerId}") public AjaxResult getByAirConditionerId(@PathVariable("airConditionerId") Long airConditionerId) { List<AirConditionerSchedule> list = airConditionerScheduleService.selectAirConditionerScheduleByAirConditionerId(airConditionerId); return success(list); } /** * æ°å¢ç©ºè°å®æ¶ä»»å¡ */ @PreAuthorize("@ss.hasPermi('system:airconditioner:schedule:add')") @Log(title = "空è°å®æ¶ä»»å¡", businessType = BusinessType.INSERT) @PostMapping public AjaxResult add(@RequestBody AirConditionerSchedule airConditionerSchedule) { return toAjax(airConditionerScheduleService.insertAirConditionerSchedule(airConditionerSchedule)); } /** * ä¿®æ¹ç©ºè°å®æ¶ä»»å¡ */ @PreAuthorize("@ss.hasPermi('system:airconditioner:schedule:edit')") @Log(title = "空è°å®æ¶ä»»å¡", businessType = BusinessType.UPDATE) @PutMapping public AjaxResult edit(@RequestBody AirConditionerSchedule airConditionerSchedule) { return toAjax(airConditionerScheduleService.updateAirConditionerSchedule(airConditionerSchedule)); } /** * å é¤ç©ºè°å®æ¶ä»»å¡ */ @PreAuthorize("@ss.hasPermi('system:airconditioner:schedule:remove')") @Log(title = "空è°å®æ¶ä»»å¡", businessType = BusinessType.DELETE) @DeleteMapping("/{ids}") public AjaxResult remove(@PathVariable Long[] ids) { return toAjax(airConditionerScheduleService.deleteAirConditionerScheduleByIds(ids)); } } zhitan-airconditioner/pom.xml
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,44 @@ <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>BaseAdminAPI</artifactId> <groupId>com.zhitan</groupId> <version>2.5.2</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>zhitan-airconditioner</artifactId> <description> ç©ºè°æ§å¶æ¨¡å </description> <dependencies> <!-- éç¨å·¥å ·--> <dependency> <groupId>com.zhitan</groupId> <artifactId>zhitan-common</artifactId> </dependency> <!-- frameworkæ¡æ¶--> <dependency> <groupId>com.zhitan</groupId> <artifactId>zhitan-framework</artifactId> </dependency> <!-- MQTT客æ·ç«¯ --> <dependency> <groupId>org.eclipse.paho</groupId> <artifactId>org.eclipse.paho.client.mqttv3</artifactId> <version>1.2.5</version> </dependency> <!-- SpringBootéæMQTT --> <dependency> <groupId>org.springframework.integration</groupId> <artifactId>spring-integration-mqtt</artifactId> </dependency> </dependencies> </project> zhitan-airconditioner/src/main/java/com/zhitan/airconditioner/config/SchedulingConfig.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,33 @@ package com.zhitan.airconditioner.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.TaskScheduler; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; /** * 宿¶ä»»å¡è°åº¦é ç½® * * @author zhitan */ @Configuration @EnableScheduling public class SchedulingConfig { /** * é ç½®TaskSchedulerï¼ç¨äºå¨æè°åº¦ä»»å¡ * è®¾ç½®çº¿ç¨æ± 大å°ä¸º5ï¼å¯ä»¥æ ¹æ®å®é éæ±è°æ´ * * @return TaskSchedulerå®ä¾ */ @Bean public TaskScheduler taskScheduler() { ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler(); scheduler.setPoolSize(5); scheduler.setThreadNamePrefix("air-conditioner-scheduler-"); scheduler.setWaitForTasksToCompleteOnShutdown(true); scheduler.setAwaitTerminationSeconds(60); return scheduler; } } zhitan-airconditioner/src/main/java/com/zhitan/airconditioner/domain/AirConditioner.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,39 @@ package com.zhitan.airconditioner.domain; import com.zhitan.common.annotation.Excel; import com.zhitan.common.core.domain.BaseEntity; import lombok.Data; import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; /** * ç©ºè°æ§å¶å¨å¯¹è±¡ sys_air_conditioner * * @author zhitan */ @Data public class AirConditioner extends BaseEntity { private static final long serialVersionUID = 1L; /** 空è°ID */ private Long id; /** 空è°åç§° */ @Excel(name = "空è°åç§°") private String name; private String mode; /** æ§å¶å¨ID */ @Excel(name = "æ§å¶å¨ID") private String controllerId; /** å®è£ ä½ç½® */ @Excel(name = "å®è£ ä½ç½®") private String location; /** ç¶æï¼0æ£å¸¸ 1åç¨ï¼ */ @Excel(name = "ç¶æ", readConverterExp = "0=æ£å¸¸,1=åç¨") private String status; } zhitan-airconditioner/src/main/java/com/zhitan/airconditioner/domain/AirConditionerLog.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,148 @@ package com.zhitan.airconditioner.domain; import com.zhitan.common.annotation.Excel; import com.zhitan.common.core.domain.BaseEntity; import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; import java.util.Date; /** * ç©ºè°æä½æ¥å¿å¯¹è±¡ sys_air_conditioner_log * * @author zhitan */ public class AirConditionerLog extends BaseEntity { private static final long serialVersionUID = 1L; /** æ¥å¿ID */ private Long id; /** 空è°ID */ @Excel(name = "空è°ID") private Long airConditionerId; /** 空è°åç§° */ @Excel(name = "空è°åç§°") private String airConditionerName; /** æä½ç±»åï¼0æå¨ 1èªå¨ï¼ */ @Excel(name = "æä½ç±»å", readConverterExp = "0=æå¨,1=èªå¨") private String operateType; /** æä½æ¨¡å¼ï¼0å¶å·å¼æº 1å¶ç弿º 2å ³æºï¼ */ @Excel(name = "æä½æ¨¡å¼", readConverterExp = "0=å¶å·å¼æº,1=å¶ç弿º,2=å ³æº") private String operateMode; /** æä½æ¶é´ */ @Excel(name = "æä½æ¶é´", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") private Date operateTime; /** æä½ç»æï¼0æå 1å¤±è´¥ï¼ */ @Excel(name = "æä½ç»æ", readConverterExp = "0=æå,1=失败") private String operateResult; /** æä½æ¶æ¯ */ @Excel(name = "æä½æ¶æ¯") private String operateMsg; public void setId(Long id) { this.id = id; } public Long getId() { return id; } public void setAirConditionerId(Long airConditionerId) { this.airConditionerId = airConditionerId; } public Long getAirConditionerId() { return airConditionerId; } public void setAirConditionerName(String airConditionerName) { this.airConditionerName = airConditionerName; } public String getAirConditionerName() { return airConditionerName; } public void setOperateType(String operateType) { this.operateType = operateType; } public String getOperateType() { return operateType; } public void setOperateMode(String operateMode) { this.operateMode = operateMode; } public String getOperateMode() { return operateMode; } public void setOperateTime(Date operateTime) { this.operateTime = operateTime; } public Date getOperateTime() { return operateTime; } public void setOperateResult(String operateResult) { this.operateResult = operateResult; } public String getOperateResult() { return operateResult; } public void setOperateMsg(String operateMsg) { this.operateMsg = operateMsg; } public String getOperateMsg() { return operateMsg; } @Override public String toString() { return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) .append("id", getId()) .append("airConditionerId", getAirConditionerId()) .append("airConditionerName", getAirConditionerName()) .append("operateType", getOperateType()) .append("operateMode", getOperateMode()) .append("operateTime", getOperateTime()) .append("operateResult", getOperateResult()) .append("operateMsg", getOperateMsg()) .append("createBy", getCreateBy()) .append("createTime", getCreateTime()) .append("updateBy", getUpdateBy()) .append("updateTime", getUpdateTime()) .append("remark", getRemark()) .toString(); } } zhitan-airconditioner/src/main/java/com/zhitan/airconditioner/domain/AirConditionerSchedule.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,48 @@ package com.zhitan.airconditioner.domain; import com.fasterxml.jackson.annotation.JsonFormat; import com.zhitan.common.annotation.Excel; import com.zhitan.common.core.domain.BaseEntity; import lombok.Data; import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; import java.util.Date; /** * 空è°å®æ¶ä»»å¡å¯¹è±¡ sys_air_conditioner_schedule * * @author zhitan */ @Data public class AirConditionerSchedule extends BaseEntity { private static final long serialVersionUID = 1L; /** 宿¶ä»»å¡ID */ private Long id; /** 空è°ID */ @Excel(name = "空è°ID") private Long airConditionerId; /** å¼å§æ¶é´ */ @Excel(name = "å¼å§æ¶é´", width = 30, dateFormat = "HH:mm:ss") @JsonFormat(pattern = "HH:mm:ss") private Date startTime; /** ç»ææ¶é´ */ @Excel(name = "ç»ææ¶é´", width = 30, dateFormat = "HH:mm:ss") @JsonFormat(pattern = "HH:mm:ss") private Date offTime; /** æ§å¶æ¨¡å¼ï¼0å¶å· 1å¶çï¼ */ @Excel(name = "æ§å¶æ¨¡å¼", readConverterExp = "0=å¶å·,1=å¶ç") private String controlMode; /** ç¶æï¼0æ£å¸¸ 1åç¨ï¼ */ @Excel(name = "ç¶æ", readConverterExp = "0=æ£å¸¸,1=åç¨") private String status; } zhitan-airconditioner/src/main/java/com/zhitan/airconditioner/mapper/AirConditionerLogMapper.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,72 @@ package com.zhitan.airconditioner.mapper; import java.util.List; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.zhitan.airconditioner.domain.AirConditionerLog; import org.apache.ibatis.annotations.Mapper; /** * ç©ºè°æä½æ¥å¿Mapperæ¥å£ * * @author zhitan */ @Mapper public interface AirConditionerLogMapper extends BaseMapper<AirConditionerLog> { /** * æ¥è¯¢ç©ºè°æä½æ¥å¿å表 * * @param airConditionerLog ç©ºè°æä½æ¥å¿ä¿¡æ¯ * @return ç©ºè°æä½æ¥å¿éå */ public List<AirConditionerLog> selectAirConditionerLogList(AirConditionerLog airConditionerLog); /** * æ¥è¯¢ç©ºè°æä½æ¥å¿ä¿¡æ¯ * * @param id ç©ºè°æä½æ¥å¿ID * @return ç©ºè°æä½æ¥å¿ä¿¡æ¯ */ public AirConditionerLog selectAirConditionerLogById(Long id); /** * æ ¹æ®ç©ºè°IDæ¥è¯¢æä½æ¥å¿å表 * * @param airConditionerId 空è°ID * @return æä½æ¥å¿å表 */ public List<AirConditionerLog> selectAirConditionerLogByAirConditionerId(Long airConditionerId); /** * æ°å¢ç©ºè°æä½æ¥å¿ * * @param airConditionerLog ç©ºè°æä½æ¥å¿ä¿¡æ¯ * @return ç»æ */ public int insertAirConditionerLog(AirConditionerLog airConditionerLog); /** * å é¤ç©ºè°æä½æ¥å¿ * * @param id ç©ºè°æä½æ¥å¿ID * @return ç»æ */ public int deleteAirConditionerLogById(Long id); /** * æ¹éå é¤ç©ºè°æä½æ¥å¿ * * @param ids éè¦å é¤çæ°æ®ID * @return ç»æ */ public int deleteAirConditionerLogByIds(Long[] ids); /** * æ ¹æ®ç©ºè°IDå 餿使¥å¿ * * @param airConditionerId 空è°ID * @return ç»æ */ public int deleteAirConditionerLogByAirConditionerId(Long airConditionerId); } zhitan-airconditioner/src/main/java/com/zhitan/airconditioner/mapper/AirConditionerMapper.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,72 @@ package com.zhitan.airconditioner.mapper; import java.util.List; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.zhitan.airconditioner.domain.AirConditioner; import org.apache.ibatis.annotations.Mapper; /** * ç©ºè°æ§å¶å¨Mapperæ¥å£ * * @author zhitan */ @Mapper public interface AirConditionerMapper extends BaseMapper<AirConditioner> { /** * æ¥è¯¢ç©ºè°æ§å¶å¨å表 * * @param airConditioner ç©ºè°æ§å¶å¨ä¿¡æ¯ * @return ç©ºè°æ§å¶å¨éå */ public List<AirConditioner> selectAirConditionerList(AirConditioner airConditioner); /** * æ¥è¯¢ç©ºè°æ§å¶å¨ä¿¡æ¯ * * @param id ç©ºè°æ§å¶å¨ID * @return ç©ºè°æ§å¶å¨ä¿¡æ¯ */ public AirConditioner selectAirConditionerById(Long id); /** * æ ¹æ®æ§å¶å¨IDæ¥è¯¢ç©ºè°æ§å¶å¨ä¿¡æ¯ * * @param controllerId æ§å¶å¨ID * @return ç©ºè°æ§å¶å¨ä¿¡æ¯ */ public AirConditioner selectAirConditionerByControllerId(String controllerId); /** * æ°å¢ç©ºè°æ§å¶å¨ * * @param airConditioner ç©ºè°æ§å¶å¨ä¿¡æ¯ * @return ç»æ */ public int insertAirConditioner(AirConditioner airConditioner); /** * ä¿®æ¹ç©ºè°æ§å¶å¨ * * @param airConditioner ç©ºè°æ§å¶å¨ä¿¡æ¯ * @return ç»æ */ public int updateAirConditioner(AirConditioner airConditioner); /** * å é¤ç©ºè°æ§å¶å¨ * * @param id ç©ºè°æ§å¶å¨ID * @return ç»æ */ public int deleteAirConditionerById(Long id); /** * æ¹éå é¤ç©ºè°æ§å¶å¨ * * @param ids éè¦å é¤çæ°æ®ID * @return ç»æ */ public int deleteAirConditionerByIds(Long[] ids); } zhitan-airconditioner/src/main/java/com/zhitan/airconditioner/mapper/AirConditionerScheduleMapper.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,99 @@ package com.zhitan.airconditioner.mapper; import java.util.List; import java.util.Date; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.zhitan.airconditioner.domain.AirConditionerSchedule; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; /** * 空è°å®æ¶ä»»å¡Mapperæ¥å£ * * @author zhitan */ @Mapper public interface AirConditionerScheduleMapper extends BaseMapper<AirConditionerSchedule> { /** * æ¥è¯¢ç©ºè°å®æ¶ä»»å¡å表 * * @param airConditionerSchedule 空è°å®æ¶ä»»å¡ä¿¡æ¯ * @return 空è°å®æ¶ä»»å¡éå */ public List<AirConditionerSchedule> selectAirConditionerScheduleList(AirConditionerSchedule airConditionerSchedule); /** * æ¥è¯¢ç©ºè°å®æ¶ä»»å¡ä¿¡æ¯ * * @param id 空è°å®æ¶ä»»å¡ID * @return 空è°å®æ¶ä»»å¡ä¿¡æ¯ */ public AirConditionerSchedule selectAirConditionerScheduleById(Long id); /** * æ ¹æ®ç©ºè°IDæ¥è¯¢å®æ¶ä»»å¡å表 * * @param airConditionerId 空è°ID * @return 宿¶ä»»å¡å表 */ public List<AirConditionerSchedule> selectAirConditionerScheduleByAirConditionerId(Long airConditionerId); /** * æ¥è¯¢å½åæ¶é´å éè¦æ§è¡ç宿¶ä»»å¡ * * @param currentTime å½åæ¶é´ * @return 宿¶ä»»å¡å表 */ public List<AirConditionerSchedule> selectActiveSchedules(@Param("currentTime") Date currentTime); /** * æ ¹æ®æ¶é´ç¹æ¥è¯¢éè¦æ§è¡ç宿¶ä»»å¡ * æ¥è¯¢å¼å§æ¶é´æç»ææ¶é´ä¸æå®æ¶é´ç¹å¹é çä»»å¡ * * @param timePoint æ¶é´ç¹ï¼æ ¼å¼ä¸ºHH:mm * @return 宿¶ä»»å¡å表 */ public List<AirConditionerSchedule> selectSchedulesByTimePoint(@Param("timePoint") String timePoint); /** * æ°å¢ç©ºè°å®æ¶ä»»å¡ * * @param airConditionerSchedule 空è°å®æ¶ä»»å¡ä¿¡æ¯ * @return ç»æ */ public int insertAirConditionerSchedule(AirConditionerSchedule airConditionerSchedule); /** * ä¿®æ¹ç©ºè°å®æ¶ä»»å¡ * * @param airConditionerSchedule 空è°å®æ¶ä»»å¡ä¿¡æ¯ * @return ç»æ */ public int updateAirConditionerSchedule(AirConditionerSchedule airConditionerSchedule); /** * å é¤ç©ºè°å®æ¶ä»»å¡ * * @param id 空è°å®æ¶ä»»å¡ID * @return ç»æ */ public int deleteAirConditionerScheduleById(Long id); /** * æ¹éå é¤ç©ºè°å®æ¶ä»»å¡ * * @param ids éè¦å é¤çæ°æ®ID * @return ç»æ */ public int deleteAirConditionerScheduleByIds(Long[] ids); /** * æ ¹æ®ç©ºè°IDå é¤å®æ¶ä»»å¡ * * @param airConditionerId 空è°ID * @return ç»æ */ public int deleteAirConditionerScheduleByAirConditionerId(String airConditionerId); } zhitan-airconditioner/src/main/java/com/zhitan/airconditioner/service/IAirConditionerLogService.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,59 @@ package com.zhitan.airconditioner.service; import java.util.List; import com.zhitan.airconditioner.domain.AirConditionerLog; /** * ç©ºè°æä½æ¥å¿Serviceæ¥å£ * * @author zhitan */ public interface IAirConditionerLogService { /** * æ¥è¯¢ç©ºè°æä½æ¥å¿å表 * * @param airConditionerLog ç©ºè°æä½æ¥å¿ä¿¡æ¯ * @return ç©ºè°æä½æ¥å¿éå */ public List<AirConditionerLog> selectAirConditionerLogList(AirConditionerLog airConditionerLog); /** * æ¥è¯¢ç©ºè°æä½æ¥å¿ä¿¡æ¯ * * @param id ç©ºè°æä½æ¥å¿ID * @return ç©ºè°æä½æ¥å¿ä¿¡æ¯ */ public AirConditionerLog selectAirConditionerLogById(Long id); /** * æ ¹æ®ç©ºè°IDæ¥è¯¢æä½æ¥å¿å表 * * @param airConditionerId 空è°ID * @return æä½æ¥å¿å表 */ public List<AirConditionerLog> selectAirConditionerLogByAirConditionerId(Long airConditionerId); /** * æ°å¢ç©ºè°æä½æ¥å¿ * * @param airConditionerLog ç©ºè°æä½æ¥å¿ä¿¡æ¯ * @return ç»æ */ public int insertAirConditionerLog(AirConditionerLog airConditionerLog); /** * å é¤ç©ºè°æä½æ¥å¿ä¿¡æ¯ * * @param id ç©ºè°æä½æ¥å¿ID * @return ç»æ */ public int deleteAirConditionerLogById(Long id); /** * æ¹éå é¤ç©ºè°æä½æ¥å¿ä¿¡æ¯ * * @param ids éè¦å é¤çç©ºè°æä½æ¥å¿ID * @return ç»æ */ public int deleteAirConditionerLogByIds(Long[] ids); } zhitan-airconditioner/src/main/java/com/zhitan/airconditioner/service/IAirConditionerScheduleService.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,83 @@ package com.zhitan.airconditioner.service; import java.util.List; import com.zhitan.airconditioner.domain.AirConditionerSchedule; /** * 空è°å®æ¶ä»»å¡Serviceæ¥å£ * * @author zhitan */ public interface IAirConditionerScheduleService { /** * æ¥è¯¢ç©ºè°å®æ¶ä»»å¡å表 * * @param airConditionerSchedule 空è°å®æ¶ä»»å¡ä¿¡æ¯ * @return 空è°å®æ¶ä»»å¡éå */ public List<AirConditionerSchedule> selectAirConditionerScheduleList(AirConditionerSchedule airConditionerSchedule); /** * æ¥è¯¢ç©ºè°å®æ¶ä»»å¡ä¿¡æ¯ * * @param id 空è°å®æ¶ä»»å¡ID * @return 空è°å®æ¶ä»»å¡ä¿¡æ¯ */ public AirConditionerSchedule selectAirConditionerScheduleById(Long id); /** * æ ¹æ®ç©ºè°IDæ¥è¯¢å®æ¶ä»»å¡å表 * * @param airConditionerId 空è°ID * @return 宿¶ä»»å¡å表 */ public List<AirConditionerSchedule> selectAirConditionerScheduleByAirConditionerId(Long airConditionerId); /** * æ°å¢ç©ºè°å®æ¶ä»»å¡ * * @param airConditionerSchedule 空è°å®æ¶ä»»å¡ä¿¡æ¯ * @return ç»æ */ public int insertAirConditionerSchedule(AirConditionerSchedule airConditionerSchedule); /** * ä¿®æ¹ç©ºè°å®æ¶ä»»å¡ * * @param airConditionerSchedule 空è°å®æ¶ä»»å¡ä¿¡æ¯ * @return ç»æ */ public int updateAirConditionerSchedule(AirConditionerSchedule airConditionerSchedule); /** * æ¹éå é¤ç©ºè°å®æ¶ä»»å¡ * * @param ids éè¦å é¤ç空è°å®æ¶ä»»å¡ID * @return ç»æ */ public int deleteAirConditionerScheduleByIds(Long[] ids); /** * å é¤ç©ºè°å®æ¶ä»»å¡ä¿¡æ¯ * * @param id 空è°å®æ¶ä»»å¡ID * @return ç»æ */ public int deleteAirConditionerScheduleById(Long id); /** * æ ¹æ®ç©ºè°IDå é¤å®æ¶ä»»å¡ * * @param airConditionerId 空è°ID * @return ç»æ */ public int deleteAirConditionerScheduleByAirConditionerId(String airConditionerId); /** * æ§è¡ç©ºè°å®æ¶ä»»å¡ * * @return ç»æ */ public void executeScheduleTasks(); } zhitan-airconditioner/src/main/java/com/zhitan/airconditioner/service/IAirConditionerService.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,78 @@ package com.zhitan.airconditioner.service; import java.util.List; import com.zhitan.airconditioner.domain.AirConditioner; /** * ç©ºè°æ§å¶å¨Serviceæ¥å£ * * @author zhitan */ public interface IAirConditionerService { /** * æ¥è¯¢ç©ºè°æ§å¶å¨å表 * * @param airConditioner ç©ºè°æ§å¶å¨ä¿¡æ¯ * @return ç©ºè°æ§å¶å¨éå */ public List<AirConditioner> selectAirConditionerList(AirConditioner airConditioner); /** * æ¥è¯¢ç©ºè°æ§å¶å¨ä¿¡æ¯ * * @param id ç©ºè°æ§å¶å¨ID * @return ç©ºè°æ§å¶å¨ä¿¡æ¯ */ public AirConditioner selectAirConditionerById(Long id); /** * æ ¹æ®æ§å¶å¨IDæ¥è¯¢ç©ºè°æ§å¶å¨ä¿¡æ¯ * * @param controllerId æ§å¶å¨ID * @return ç©ºè°æ§å¶å¨ä¿¡æ¯ */ public AirConditioner selectAirConditionerByControllerId(String controllerId); /** * æ°å¢ç©ºè°æ§å¶å¨ * * @param airConditioner ç©ºè°æ§å¶å¨ä¿¡æ¯ * @return ç»æ */ public int insertAirConditioner(AirConditioner airConditioner); /** * ä¿®æ¹ç©ºè°æ§å¶å¨ * * @param airConditioner ç©ºè°æ§å¶å¨ä¿¡æ¯ * @return ç»æ */ public int updateAirConditioner(AirConditioner airConditioner); /** * æ¹éå é¤ç©ºè°æ§å¶å¨ * * @param ids éè¦å é¤çç©ºè°æ§å¶å¨ID * @return ç»æ */ public int deleteAirConditionerByIds(Long[] ids); /** * å é¤ç©ºè°æ§å¶å¨ä¿¡æ¯ * * @param id ç©ºè°æ§å¶å¨ID * @return ç»æ */ public int deleteAirConditionerById(Long id); /** * æ§å¶ç©ºè°å¼å ³æº * * @param id 空è°ID * @param mode æ§å¶æ¨¡å¼ï¼0å¶å· 1å¶ç 2å ³æºï¼ * @param operateType æä½ç±»åï¼0æå¨ 1èªå¨ï¼ * @return ç»æ */ public boolean controlAirConditioner(Long id, String mode, String operateType); } zhitan-airconditioner/src/main/java/com/zhitan/airconditioner/service/impl/AirConditionerLogServiceImpl.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,85 @@ package com.zhitan.airconditioner.service.impl; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.zhitan.airconditioner.mapper.AirConditionerLogMapper; import com.zhitan.airconditioner.domain.AirConditionerLog; import com.zhitan.airconditioner.service.IAirConditionerLogService; /** * ç©ºè°æä½æ¥å¿Serviceä¸å¡å±å¤ç * * @author zhitan */ @Service public class AirConditionerLogServiceImpl implements IAirConditionerLogService { @Autowired private AirConditionerLogMapper airConditionerLogMapper; /** * æ¥è¯¢ç©ºè°æä½æ¥å¿å表 * * @param airConditionerLog ç©ºè°æä½æ¥å¿ä¿¡æ¯ * @return ç©ºè°æä½æ¥å¿éå */ @Override public List<AirConditionerLog> selectAirConditionerLogList(AirConditionerLog airConditionerLog) { return airConditionerLogMapper.selectAirConditionerLogList(airConditionerLog); } /** * æ¥è¯¢ç©ºè°æä½æ¥å¿ä¿¡æ¯ * * @param id ç©ºè°æä½æ¥å¿ID * @return ç©ºè°æä½æ¥å¿ä¿¡æ¯ */ @Override public AirConditionerLog selectAirConditionerLogById(Long id) { return airConditionerLogMapper.selectAirConditionerLogById(id); } /** * æ ¹æ®ç©ºè°IDæ¥è¯¢æä½æ¥å¿å表 * * @param airConditionerId 空è°ID * @return æä½æ¥å¿å表 */ @Override public List<AirConditionerLog> selectAirConditionerLogByAirConditionerId(Long airConditionerId) { return airConditionerLogMapper.selectAirConditionerLogByAirConditionerId(airConditionerId); } /** * æ°å¢ç©ºè°æä½æ¥å¿ * * @param airConditionerLog ç©ºè°æä½æ¥å¿ä¿¡æ¯ * @return ç»æ */ @Override public int insertAirConditionerLog(AirConditionerLog airConditionerLog) { return airConditionerLogMapper.insertAirConditionerLog(airConditionerLog); } /** * å é¤ç©ºè°æä½æ¥å¿ä¿¡æ¯ * * @param id ç©ºè°æä½æ¥å¿ID * @return ç»æ */ @Override public int deleteAirConditionerLogById(Long id) { return airConditionerLogMapper.deleteAirConditionerLogById(id); } /** * æ¹éå é¤ç©ºè°æä½æ¥å¿ä¿¡æ¯ * * @param ids éè¦å é¤çç©ºè°æä½æ¥å¿ID * @return ç»æ */ @Override public int deleteAirConditionerLogByIds(Long[] ids) { return airConditionerLogMapper.deleteAirConditionerLogByIds(ids); } } zhitan-airconditioner/src/main/java/com/zhitan/airconditioner/service/impl/AirConditionerScheduleServiceImpl.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,506 @@ package com.zhitan.airconditioner.service.impl; import java.text.SimpleDateFormat; import java.time.Duration; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; import java.time.ZoneId; import java.util.Calendar; import java.util.Date; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ScheduledFuture; import com.zhitan.airconditioner.domain.AirConditionerSchedule; import com.zhitan.airconditioner.mapper.AirConditionerScheduleMapper; import com.zhitan.airconditioner.service.IAirConditionerScheduleService; import com.zhitan.airconditioner.service.IAirConditionerService; import com.zhitan.common.utils.DateTimeUtil; import com.zhitan.common.utils.DateUtils; import com.zhitan.common.utils.SecurityUtils; import com.zhitan.system.service.ISysHolidayService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.TaskScheduler; import org.springframework.stereotype.Service; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; /** * 空è°å®æ¶ä»»å¡Serviceä¸å¡å±å¤ç * * @author zhitan */ /** * 空è°å®æ¶ä»»å¡Serviceä¸å¡å±å¤ç * * @author zhitan */ @Service public class AirConditionerScheduleServiceImpl implements IAirConditionerScheduleService { private static final Logger log = LoggerFactory.getLogger(AirConditionerScheduleServiceImpl.class); @Autowired private AirConditionerScheduleMapper airConditionerScheduleMapper; @Autowired private IAirConditionerService airConditionerService; @Autowired private TaskScheduler taskScheduler; @Autowired private ISysHolidayService sysHolidayService; // å卿æè°åº¦çä»»å¡ï¼key为任å¡IDï¼value为è°åº¦çFuture对象 private final Map<String, ScheduledFuture<?>> scheduledTasks = new ConcurrentHashMap<>(); /** * åå§å宿¶ä»»å¡ * 仿°æ®åºå è½½ææå®æ¶ä»»å¡å¹¶è¿è¡è°åº¦ */ @PostConstruct public void init() { log.info("空è°å®æ¶ä»»å¡è°åº¦å¨åå§åå¼å§"); // æ¥è¯¢ææææç宿¶ä»»å¡ AirConditionerSchedule query = new AirConditionerSchedule(); query.setStatus("0"); // ç¶ææ£å¸¸çä»»å¡ List<AirConditionerSchedule> schedules = airConditionerScheduleMapper.selectAirConditionerScheduleList(query); if (schedules.isEmpty()) { log.info("æ²¡ææ¾å°éè¦è°åº¦ç空è°å®æ¶ä»»å¡"); return; } log.info("æ¾å°{}个éè¦è°åº¦ç空è°å®æ¶ä»»å¡", schedules.size()); // 为æ¯ä¸ªä»»å¡å建è°åº¦ for (AirConditionerSchedule schedule : schedules) { scheduleTask(schedule); } log.info("空è°å®æ¶ä»»å¡è°åº¦å¨å·²å¯å¨ï¼ä½¿ç¨åºäºæ°æ®åºç精确è°åº¦æºå¶"); } /** * åºç¨å ³éæ¶åæ¶ææå®æ¶ä»»å¡ */ @PreDestroy public void destroy() { for (Map.Entry<String, ScheduledFuture<?>> entry : scheduledTasks.entrySet()) { entry.getValue().cancel(false); } scheduledTasks.clear(); log.info("空è°å®æ¶ä»»å¡è°åº¦å¨å·²å ³éï¼ææä»»å¡å·²åæ¶"); } /** * æ¥è¯¢ç©ºè°å®æ¶ä»»å¡å表 * * @param airConditionerSchedule 空è°å®æ¶ä»»å¡ä¿¡æ¯ * @return 空è°å®æ¶ä»»å¡éå */ @Override public List<AirConditionerSchedule> selectAirConditionerScheduleList(AirConditionerSchedule airConditionerSchedule) { return airConditionerScheduleMapper.selectAirConditionerScheduleList(airConditionerSchedule); } /** * æ¥è¯¢ç©ºè°å®æ¶ä»»å¡ä¿¡æ¯ * * @param id 空è°å®æ¶ä»»å¡ID * @return 空è°å®æ¶ä»»å¡ä¿¡æ¯ */ @Override public AirConditionerSchedule selectAirConditionerScheduleById(Long id) { return airConditionerScheduleMapper.selectAirConditionerScheduleById(id); } /** * æ ¹æ®ç©ºè°IDæ¥è¯¢å®æ¶ä»»å¡å表 * * @param airConditionerId 空è°ID * @return 宿¶ä»»å¡å表 */ @Override public List<AirConditionerSchedule> selectAirConditionerScheduleByAirConditionerId(Long airConditionerId) { return airConditionerScheduleMapper.selectAirConditionerScheduleByAirConditionerId(airConditionerId); } /** * æ°å¢ç©ºè°å®æ¶ä»»å¡ * * @param airConditionerSchedule 空è°å®æ¶ä»»å¡ä¿¡æ¯ * @return ç»æ */ @Override public int insertAirConditionerSchedule(AirConditionerSchedule airConditionerSchedule) { airConditionerSchedule.setCreateTime(DateUtils.getNowDate()); airConditionerSchedule.setCreateBy(SecurityUtils.getUsername()); int rows = airConditionerScheduleMapper.insertAirConditionerSchedule(airConditionerSchedule); if (rows > 0) { // éæ°è°åº¦ä»»å¡ï¼ä½¿æ°æ·»å ç宿¶ä»»å¡çæ rescheduleTask(); } return rows; } /** * ä¿®æ¹ç©ºè°å®æ¶ä»»å¡ * * @param airConditionerSchedule 空è°å®æ¶ä»»å¡ä¿¡æ¯ * @return ç»æ */ @Override public int updateAirConditionerSchedule(AirConditionerSchedule airConditionerSchedule) { airConditionerSchedule.setUpdateTime(DateUtils.getNowDate()); airConditionerSchedule.setUpdateBy(SecurityUtils.getUsername()); int rows = airConditionerScheduleMapper.updateAirConditionerSchedule(airConditionerSchedule); if (rows > 0) { // éæ°è°åº¦ä»»å¡ï¼ä½¿ä¿®æ¹åç宿¶ä»»å¡çæ rescheduleTask(); } return rows; } /** * æ¹éå é¤ç©ºè°å®æ¶ä»»å¡ * * @param ids éè¦å é¤ç空è°å®æ¶ä»»å¡ID * @return ç»æ */ @Override public int deleteAirConditionerScheduleByIds(Long[] ids) { int rows = airConditionerScheduleMapper.deleteAirConditionerScheduleByIds(ids); if (rows > 0) { // éæ°è°åº¦ä»»å¡ï¼ä½¿å 餿ä½çæ rescheduleTask(); } return rows; } /** * å é¤ç©ºè°å®æ¶ä»»å¡ä¿¡æ¯ * * @param id 空è°å®æ¶ä»»å¡ID * @return ç»æ */ @Override public int deleteAirConditionerScheduleById(Long id) { int rows = airConditionerScheduleMapper.deleteAirConditionerScheduleById(id); if (rows > 0) { // éæ°è°åº¦ä»»å¡ï¼ä½¿å 餿ä½çæ rescheduleTask(); } return rows; } /** * æ ¹æ®ç©ºè°IDå é¤å®æ¶ä»»å¡ * * @param airConditionerId 空è°ID * @return ç»æ */ @Override public int deleteAirConditionerScheduleByAirConditionerId(String airConditionerId) { int rows = airConditionerScheduleMapper.deleteAirConditionerScheduleByAirConditionerId(airConditionerId); if (rows > 0) { // éæ°è°åº¦ä»»å¡ï¼ä½¿å 餿ä½çæ rescheduleTask(); } return rows; } /** * æ§è¡ç©ºè°å®æ¶ä»»å¡ * æ¤æ¹æ³ä¿çç¨äºå ¼å®¹æ¥å£ï¼å¨æ°çå®ç°ä¸ä¸åä½¿ç¨ * æ°çå®ç°ä¸ºæ¯ä¸ªå ·ä½çæ¶é´ç¹å建ç¬ç«çè°åº¦ä»»å¡ï¼ä¸åéè¦æ¯å鿣æ¥ä¸æ¬¡ */ @Override public void executeScheduleTasks() { log.info("executeScheduleTasksæ¹æ³å·²è¢«è°ç¨ï¼ä½å¨æ°çå®ç°ä¸ä¸å使ç¨"); log.info("å½å使ç¨åºäºæ°æ®åºçç²¾ç¡®å®æ¶ä»»å¡è°åº¦æºå¶ï¼ä¸ºæ¯ä¸ªæ¶é´ç¹å建ç¬ç«çè°åº¦ä»»å¡"); // 妿æå¿ è¦ï¼å¯ä»¥å¨è¿ééæ°è°åº¦ææä»»å¡ // rescheduleTask(); } /** * éæ°è°åº¦ä»»å¡ * å½å®æ¶ä»»å¡åçååæ¶ï¼å¦æ·»å ãä¿®æ¹ãå é¤å®æ¶ä»»å¡ï¼è°ç¨æ¤æ¹æ³ * åæ¶ææå½åçè°åº¦ä»»å¡å¹¶éæ°å建 */ public void rescheduleTask() { // åæ¶ææç°æçè°åº¦ä»»å¡ for (Map.Entry<String, ScheduledFuture<?>> entry : scheduledTasks.entrySet()) { entry.getValue().cancel(false); } scheduledTasks.clear(); // æ¥è¯¢ææææç宿¶ä»»å¡å¹¶éæ°è°åº¦ AirConditionerSchedule query = new AirConditionerSchedule(); query.setStatus("0"); // ç¶ææ£å¸¸çä»»å¡ List<AirConditionerSchedule> schedules = airConditionerScheduleMapper.selectAirConditionerScheduleList(query); if (schedules.isEmpty()) { log.info("æ²¡ææ¾å°éè¦è°åº¦ç空è°å®æ¶ä»»å¡"); return; } log.info("éæ°è°åº¦{}个空è°å®æ¶ä»»å¡", schedules.size()); // 为æ¯ä¸ªä»»å¡å建è°åº¦ for (AirConditionerSchedule schedule : schedules) { scheduleTask(schedule); } log.info("空è°å®æ¶ä»»å¡å·²éæ°è°åº¦å®æ"); } /** * 为åä¸ªå®æ¶ä»»å¡å建è°åº¦ * åå«ä¸ºå¼æºæ¶é´åå ³æºæ¶é´å建ç¬ç«çè°åº¦ä»»å¡ * 弿ºæä»¤åªå¨æ³å®å·¥ä½æ¥æ·»å 宿¶ä»»å¡ï¼å ³æºæä»¤æ¯å¤©é½æ·»å 宿¶ä»»å¡ * * @param schedule 宿¶ä»»å¡ä¿¡æ¯ */ private void scheduleTask(AirConditionerSchedule schedule) { if (schedule == null || schedule.getId() == null) { log.error("æ æ³è°åº¦ç©ºææ IDç宿¶ä»»å¡"); return; } try { // ä¸ºå¼æºæ¶é´å建è°åº¦ if (schedule.getStartTime() != null) { // 弿ºæä»¤åªå¨æ³å®å·¥ä½æ¥æ·»å 宿¶ä»»å¡ scheduleSpecificTask(schedule, schedule.getStartTime(), true); } // ä¸ºå ³æºæ¶é´å建è°åº¦ if (schedule.getOffTime() != null) { // å ³æºæä»¤æ¯å¤©é½æ·»å 宿¶ä»»å¡ scheduleSpecificTask(schedule, schedule.getOffTime(), false); } } catch (Exception e) { log.error("ä¸ºå®æ¶ä»»å¡å建è°åº¦å¤±è´¥ï¼ä»»å¡IDï¼{}ï¼é误信æ¯ï¼{}", schedule.getId(), e.getMessage()); } } /** * 为ç¹å®æ¶é´ç¹å建è°åº¦ä»»å¡ * * @param schedule 宿¶ä»»å¡ä¿¡æ¯ * @param targetTime ç®æ æ¶é´ç¹ * @param isStartTime æ¯å¦ä¸ºå¼æºæ¶é´ï¼trueä¸ºå¼æºï¼falseä¸ºå ³æºï¼ */ private void scheduleSpecificTask(AirConditionerSchedule schedule, Date targetTime, boolean isStartTime) { // 计ç®ä¸ä¸æ¬¡æ§è¡æ¶é´ Date nextExecutionTime = calculateNextExecutionTime(targetTime); if (nextExecutionTime == null) { log.error("计ç®ä¸ä¸æ¬¡æ§è¡æ¶é´å¤±è´¥ï¼ä»»å¡IDï¼{}", schedule.getId()); return; } // 妿æ¯å¼æºä»»å¡ï¼æ£æ¥æ§è¡æ¥ææ¯å¦ä¸ºå·¥ä½æ¥ if (isStartTime) { // 妿䏿¯å·¥ä½æ¥ï¼å计ç®ä¸ä¸ä¸ªå·¥ä½æ¥ while (!isWorkDay(nextExecutionTime)) { // 䏿¯å·¥ä½æ¥ï¼è·³å°ä¸ä¸å¤©åæ£æ¥ nextExecutionTime = DateUtils.addDays(nextExecutionTime, 1); // æ´æ°æ¶é´é¨åï¼ä¿æåæ¥çæ¶åç§ä¸åï¼ Calendar cal = Calendar.getInstance(); cal.setTime(nextExecutionTime); Calendar targetCal = Calendar.getInstance(); targetCal.setTime(targetTime); cal.set(Calendar.HOUR_OF_DAY, targetCal.get(Calendar.HOUR_OF_DAY)); cal.set(Calendar.MINUTE, targetCal.get(Calendar.MINUTE)); cal.set(Calendar.SECOND, targetCal.get(Calendar.SECOND)); nextExecutionTime = cal.getTime(); } log.info("弿ºä»»å¡å·²è°æ´ä¸ºä¸ä¸ä¸ªå·¥ä½æ¥æ§è¡ï¼æ§è¡æ¶é´ï¼{}", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(nextExecutionTime)); } // å建任å¡IDï¼æ ¼å¼ä¸ºï¼ä»»å¡ID + "_start"æ"_off" String taskKey = schedule.getId() + (isStartTime ? "_start" : "_off"); // åæ¶å·²åå¨çç¸åä»»å¡ï¼å¦ææï¼ ScheduledFuture<?> existingTask = scheduledTasks.get(taskKey); if (existingTask != null) { existingTask.cancel(false); scheduledTasks.remove(taskKey); } // å建æ°çè°åº¦ä»»å¡ ScheduledFuture<?> future = taskScheduler.schedule( () -> executeSpecificTask(schedule, isStartTime), nextExecutionTime ); // ä¿åè°åº¦ä»»å¡ scheduledTasks.put(taskKey, future); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); log.info("已为空è°IDï¼{}å建{}宿¶ä»»å¡ï¼æ§è¡æ¶é´ï¼{}", schedule.getAirConditionerId(), isStartTime ? "弿º" : "å ³æº", sdf.format(nextExecutionTime)); } /** * 计ç®ä¸ä¸æ¬¡æ§è¡æ¶é´ * 妿ä»å¤©çæ§è¡æ¶é´å·²è¿ï¼å宿卿天çå䏿¶é´æ§è¡ * * @param targetTime ç®æ æ¶é´ * @return ä¸ä¸æ¬¡æ§è¡æ¶é´ */ private Date calculateNextExecutionTime(Date targetTime) { if (targetTime == null) { return null; } // å°Date转æ¢ä¸ºLocalTimeï¼åªä¿çæ¶åç§ï¼ LocalTime targetLocalTime = targetTime.toInstant() .atZone(ZoneId.systemDefault()) .toLocalTime(); // è·åå½åæ¥æåæ¶é´ LocalDateTime now = LocalDateTime.now(); LocalDate today = now.toLocalDate(); // å建ä»å¤©çç®æ æ§è¡æ¶é´ LocalDateTime targetDateTime = LocalDateTime.of(today, targetLocalTime); // å¦æç®æ æ¶é´å·²è¿ï¼å®æå¨æå¤©çå䏿¶é´æ§è¡ if (targetDateTime.isBefore(now)) { targetDateTime = targetDateTime.plusDays(1); } // 转æ¢åDateç±»å return Date.from(targetDateTime.atZone(ZoneId.systemDefault()).toInstant()); } /** * æ§è¡ç¹å®ç宿¶ä»»å¡ * * @param schedule 宿¶ä»»å¡ä¿¡æ¯ * @param isStartTime æ¯å¦ä¸ºå¼æºæ¶é´ï¼trueä¸ºå¼æºï¼falseä¸ºå ³æºï¼ */ private void executeSpecificTask(AirConditionerSchedule schedule, boolean isStartTime) { try { if (isStartTime) { // 弿ºæä½ - æ ¹æ®å£èèªå¨å¤æå¶çæå¶å·æ¨¡å¼ String controlMode = determineControlModeByMonth(); log.info("æ§è¡ç©ºè°å¼æºä»»å¡ï¼ç©ºè°IDï¼{}ï¼æ§å¶æ¨¡å¼ï¼{}", schedule.getAirConditionerId(), controlMode); // æ§è¡ç©ºè°å¼æºæ§å¶ airConditionerService.controlAirConditioner( schedule.getAirConditionerId(), controlMode, // 0å¶å·æ1å¶ç "1" // èªå¨æä½ ); } else { // å ³æºæä½ log.info("æ§è¡ç©ºè°å ³æºä»»å¡ï¼ç©ºè°IDï¼{}", schedule.getAirConditionerId()); // æ§è¡ç©ºè°å ³æºæ§å¶ airConditionerService.controlAirConditioner( schedule.getAirConditionerId(), "2", // å ³æº "1" // èªå¨æä½ ); } // 任塿§è¡å®æåï¼éæ°è°åº¦ä¸ä¸å¤©çå䏿¶é´ç¹ // è·ååå§çæ¶é´ç¹ Date originalTime = isStartTime ? schedule.getStartTime() : schedule.getOffTime(); // éæ°è°åº¦ scheduleSpecificTask(schedule, originalTime, isStartTime); } catch (Exception e) { log.error("æ§è¡ç©ºè°{}ä»»å¡å¤±è´¥ï¼ç©ºè°IDï¼{}ï¼é误信æ¯ï¼{}", isStartTime ? "弿º" : "å ³æº", schedule.getAirConditionerId(), e.getMessage()); } } /** * å¤ææ¥ææ¯å¦ä¸ºå·¥ä½æ¥ * 工使¥å¤æé»è¾ï¼ * 1. 妿æ¯å¨ä¸è³å¨äºï¼ä¸ä¸æ¯æ³å®è忥ï¼åä¸ºå·¥ä½æ¥ * 2. 妿æ¯å¨å æ¥ï¼ä½æ¯ä¸ºè°ä¼å·¥ä½æ¥ï¼åä¸ºå·¥ä½æ¥ * * @param date éè¦å¤æçæ¥æ * @return 妿æ¯å·¥ä½æ¥è¿åtrueï¼å¦åè¿åfalse */ private boolean isWorkDay(Date date) { // è°ç¨è忥æå¡è¿è¡ç²¾ç¡®ç工使¥å¤æ return sysHolidayService.isWorkDay(date); } /** * æ ¹æ®æä»½èªå¨å¤æå¶çæå¶å·æ¨¡å¼ * 5-9æä¸ºå¤å£ï¼ä½¿ç¨å¶å·æ¨¡å¼ * 11-3æä¸ºå¬å£ï¼ä½¿ç¨å¶çæ¨¡å¼ * 4æå10æä¸ºè¿æ¸¡å£èï¼æ ¹æ®å½åæ¸©åº¦å¤æ * * @return æ§å¶æ¨¡å¼ï¼0å¶å· 1å¶çï¼ */ private String determineControlModeByMonth() { // è·åå½åæä»½ int currentMonth = DateTimeUtil.getMonthOfYear(new Date()); // æ ¹æ®æä»½å¤æå£è if (currentMonth >= 5 && currentMonth <= 9) { // å¤å£ä½¿ç¨å¶å·æ¨¡å¼ return "0"; } else if ((currentMonth >= 11 && currentMonth <= 12) || (currentMonth >= 1 && currentMonth <= 3)) { // å¬å£ä½¿ç¨å¶çæ¨¡å¼ return "1"; } else { // è¿æ¸¡å£èï¼é»è®¤ä½¿ç¨å¶å·æ¨¡å¼ // å®é åºç¨ä¸å¯ä»¥æ ¹æ®å½åæ¸©åº¦å¤æ return "0"; } } /** * 注æï¼å¯¹äºåªå卿¶åç§çæ¶é´å段ï¼å¦å¼å§æ¶é´åç»ææ¶é´ï¼ï¼ * æ°æ®åºåºè¯¥ä½¿ç¨TIMEç±»åèéDATETIMEæTIMESTAMPç±»åã * * MySQLä¸çTIMEç±»åæ ¼å¼ä¸º'HH:MM:SS'ï¼åªå卿¶é´é¨åï¼ä¸å 嫿¥æä¿¡æ¯ã * è¿æ ·å¯ä»¥åå°åå¨ç©ºé´ï¼å¹¶ä¸æ´ç¬¦åä¸å¡éæ±ã * * å¨Javaå®ä½ç±»ä¸ï¼è½ç¶ä½¿ç¨Dateç±»å表示ï¼ä½å¨ä¸æ°æ®åºäº¤äºæ¶ï¼ * åªææ¶åç§é¨åä¼è¢«ä¿åå读åã */ } zhitan-airconditioner/src/main/java/com/zhitan/airconditioner/service/impl/AirConditionerServiceImpl.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,216 @@ package com.zhitan.airconditioner.service.impl; import java.util.Date; import java.util.List; import com.alibaba.fastjson2.JSONObject; import com.zhitan.airconditioner.domain.AirConditioner; import com.zhitan.airconditioner.domain.AirConditionerLog; import com.zhitan.airconditioner.mapper.AirConditionerLogMapper; import com.zhitan.airconditioner.mapper.AirConditionerMapper; import com.zhitan.airconditioner.service.IAirConditionerService; import com.zhitan.common.utils.DateUtils; import com.zhitan.common.utils.SecurityUtils; import com.zhitan.framework.mqtt.MqttClientUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; /** * ç©ºè°æ§å¶å¨Serviceä¸å¡å±å¤ç * * @author zhitan */ @Service public class AirConditionerServiceImpl implements IAirConditionerService { @Autowired private AirConditionerMapper airConditionerMapper; @Autowired private AirConditionerLogMapper airConditionerLogMapper; @Autowired private MqttClientUtil mqttClientUtil; /** * æ¥è¯¢ç©ºè°æ§å¶å¨å表 * * @param airConditioner ç©ºè°æ§å¶å¨ä¿¡æ¯ * @return ç©ºè°æ§å¶å¨éå */ @Override public List<AirConditioner> selectAirConditionerList(AirConditioner airConditioner) { return airConditionerMapper.selectAirConditionerList(airConditioner); } /** * æ¥è¯¢ç©ºè°æ§å¶å¨ä¿¡æ¯ * * @param id ç©ºè°æ§å¶å¨ID * @return ç©ºè°æ§å¶å¨ä¿¡æ¯ */ @Override public AirConditioner selectAirConditionerById(Long id) { return airConditionerMapper.selectAirConditionerById(id); } /** * æ ¹æ®æ§å¶å¨IDæ¥è¯¢ç©ºè°æ§å¶å¨ä¿¡æ¯ * * @param controllerId æ§å¶å¨ID * @return ç©ºè°æ§å¶å¨ä¿¡æ¯ */ @Override public AirConditioner selectAirConditionerByControllerId(String controllerId) { return airConditionerMapper.selectAirConditionerByControllerId(controllerId); } /** * æ°å¢ç©ºè°æ§å¶å¨ * * @param airConditioner ç©ºè°æ§å¶å¨ä¿¡æ¯ * @return ç»æ */ @Override public int insertAirConditioner(AirConditioner airConditioner) { airConditioner.setCreateTime(DateUtils.getNowDate()); airConditioner.setCreateBy(SecurityUtils.getUsername()); return airConditionerMapper.insertAirConditioner(airConditioner); } /** * ä¿®æ¹ç©ºè°æ§å¶å¨ * * @param airConditioner ç©ºè°æ§å¶å¨ä¿¡æ¯ * @return ç»æ */ @Override public int updateAirConditioner(AirConditioner airConditioner) { airConditioner.setUpdateTime(DateUtils.getNowDate()); airConditioner.setUpdateBy(SecurityUtils.getUsername()); return airConditionerMapper.updateAirConditioner(airConditioner); } /** * æ¹éå é¤ç©ºè°æ§å¶å¨ * * @param ids éè¦å é¤çç©ºè°æ§å¶å¨ID * @return ç»æ */ @Override public int deleteAirConditionerByIds(Long[] ids) { return airConditionerMapper.deleteAirConditionerByIds(ids); } /** * å é¤ç©ºè°æ§å¶å¨ä¿¡æ¯ * * @param id ç©ºè°æ§å¶å¨ID * @return ç»æ */ @Override public int deleteAirConditionerById(Long id) { return airConditionerMapper.deleteAirConditionerById(id); } /** * æ§å¶ç©ºè°å¼å ³æº * * @param id 空è°ID * @param mode æ§å¶æ¨¡å¼ï¼0å¶å· 1å¶ç 2å ³æºï¼ * @param operateType æä½ç±»åï¼0æå¨ 1èªå¨ï¼ * @return ç»æ */ @Override public boolean controlAirConditioner(Long id, String mode, String operateType) { try { // æ¥è¯¢ç©ºè°ä¿¡æ¯ AirConditioner airConditioner = airConditionerMapper.selectAirConditionerById(id); if (airConditioner == null) { return false; } String msg = "{\n" + " \"rw_prot\": {\n" + " \"Ver\": \"1.0.1\",\n" + " \"dir\": \"down\",\n" + " \"id\": \"00601925021000024737\",\n" + " \"r_data\": [\n" + " {\"name\":\"hum\"},\n" + " {\"name\":\"tmp\"},\n" + " {\n" + " \"name\": \"cold\"\n" + " },\n" + " {\n" + " \"name\": \"hot\"\n" + " },\n" + " {\n" + " \"name\": \"off\"\n" + " }\n" + " ],\n" + " \"w_data\": [\n" + " {\n" + " \"name\": \"cold\",\n" + " \"value\": \"0\"\n" + " },\n" + " {\n" + " \"name\": \"hot\",\n" + " \"value\": \"0\"\n" + " },\n" + " {\n" + " \"name\": \"off\",\n" + " \"value\": \"0\"\n" + " }\n" + " ]\n" + " }\n" + "}"; // å°å符串转json JSONObject jsonObject = JSONObject.parseObject(msg); JSONObject rwProt = jsonObject.getJSONObject("rw_prot"); rwProt.put("id", airConditioner.getControllerId()); if ("0".equals(mode)) { rwProt.getJSONArray("w_data").getJSONObject(0).put("value", "1"); } else if ("1".equals(mode)) { rwProt.getJSONArray("w_data").getJSONObject(1).put("value", "1"); } else if ("2".equals(mode)) { rwProt.getJSONArray("w_data").getJSONObject(2).put("value", "1"); } // æå»ºMQTTæ¶æ¯ String topic = "lanbao/nygl/sevice/kt1/down"; String message = jsonObject.toJSONString(); // åéMQTTæ¶æ¯ mqttClientUtil.sendMessage(topic, message, 2); // è®°å½æä½æ¥å¿ AirConditionerLog log = new AirConditionerLog(); log.setAirConditionerId(id); log.setAirConditionerName(airConditioner.getName()); log.setOperateType(operateType); log.setOperateMode(mode); log.setOperateTime(new Date()); log.setOperateResult("1"); // æå log.setOperateMsg("æä½æå"); log.setCreateTime(DateUtils.getNowDate()); if ("1".equals(operateType)) { log.setCreateBy("ç³»ç»"); } else { log.setCreateBy(SecurityUtils.getUsername()); } airConditionerLogMapper.insertAirConditionerLog(log); return true; } catch (Exception e) { e.printStackTrace(); return false; } } } zhitan-quartz/pom.xml
@@ -34,6 +34,12 @@ <groupId>com.zhitan</groupId> <artifactId>zhitan-common</artifactId> </dependency> <dependency> <groupId>com.zhitan</groupId> <artifactId>zhitan-airconditioner</artifactId> <version>2.5.2</version> <scope>compile</scope> </dependency> </dependencies> zhitan-quartz/src/main/java/com/zhitan/quartz/task/AirConditionerTask.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,25 @@ package com.zhitan.quartz.task; import com.zhitan.airconditioner.service.IAirConditionerScheduleService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; /** * 空è°å®æ¶ä»»å¡ * * @author zhitan */ @Component("airConditionerTask") public class AirConditionerTask { @Autowired private IAirConditionerScheduleService airConditionerScheduleService; /** * æ§è¡ç©ºè°å®æ¶ä»»å¡ */ public void executeScheduleTasks() { airConditionerScheduleService.executeScheduleTasks(); } } zhitan-vue/src/api/airconditioner/airconditioner.js
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,57 @@ import request from '@/utils/request' // æ¥è¯¢ç©ºè°å表 export function listAirConditioner(query) { return request({ url: '/system/airconditioner/list', method: 'get', params: query }) } // æ¥è¯¢ç©ºè°è¯¦ç» export function getAirConditioner(id) { return request({ url: '/system/airconditioner/' + id, method: 'get' }) } // æ°å¢ç©ºè° export function addAirConditioner(data) { return request({ url: '/system/airconditioner', method: 'post', data: data }) } // ä¿®æ¹ç©ºè° export function updateAirConditioner(data) { return request({ url: '/system/airconditioner', method: 'put', data: data }) } // å é¤ç©ºè° export function delAirConditioner(id) { return request({ url: '/system/airconditioner/' + id, method: 'delete' }) } // æ§å¶ç©ºè°å¼å ³æº export function controlAirConditioner(id, mode, operateType) { return request({ url: '/system/airconditioner/control', method: 'post', data: { id: id, mode: mode, // 0å¶å· 1å¶ç 2å ³æº operateType: operateType // 0æå¨ 1èªå¨ } }) } zhitan-vue/src/api/airconditioner/log.js
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,26 @@ import request from '@/utils/request' // æ¥è¯¢ç©ºè°æä½æ¥å¿å表 export function listLog(query) { return request({ url: '/system/airconditioner/log/list', method: 'get', params: query }) } // æ¥è¯¢ç©ºè°æä½æ¥å¿è¯¦ç» export function getLog(id) { return request({ url: '/system/airconditioner/log/' + id, method: 'get' }) } // æ ¹æ®ç©ºè°IDæ¥è¯¢æä½æ¥å¿å表 export function getLogByAirConditionerId(airConditionerId) { return request({ url: '/system/airconditioner/log/byAirConditioner/' + airConditionerId, method: 'get' }) } zhitan-vue/src/api/airconditioner/schedule.js
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,52 @@ import request from '@/utils/request' // æ¥è¯¢ç©ºè°å®æ¶ä»»å¡å表 export function listSchedule(query) { return request({ url: '/system/airconditioner/schedule/list', method: 'get', params: query }) } // æ¥è¯¢ç©ºè°å®æ¶ä»»å¡è¯¦ç» export function getSchedule(id) { return request({ url: '/system/airconditioner/schedule/' + id, method: 'get' }) } // æ ¹æ®ç©ºè°IDæ¥è¯¢å®æ¶ä»»å¡å表 export function getScheduleByAirConditionerId(airConditionerId) { return request({ url: '/system/airconditioner/schedule/byAirConditioner/' + airConditionerId, method: 'get' }) } // æ°å¢ç©ºè°å®æ¶ä»»å¡ export function addSchedule(data) { return request({ url: '/system/airconditioner/schedule', method: 'post', data: data }) } // ä¿®æ¹ç©ºè°å®æ¶ä»»å¡ export function updateSchedule(data) { return request({ url: '/system/airconditioner/schedule', method: 'put', data: data }) } // å é¤ç©ºè°å®æ¶ä»»å¡ export function delSchedule(id) { return request({ url: '/system/airconditioner/schedule/' + id, method: 'delete' }) } zhitan-vue/src/views/airconditioner/index.vue
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,76 @@ <template> <div class="app-container"> <el-card class="box-card"> <template #header> <div class="card-header"> <span>ç©ºè°æ§å¶ç³»ç»</span> </div> </template> <el-tabs v-model="activeTab"> <el-tab-pane label="空è°å表" name="list"> <air-conditioner-list ref="airConditionerList" /> </el-tab-pane> <el-tab-pane label="宿¶ä»»å¡ç®¡ç" name="schedule"> <air-conditioner-schedule ref="airConditionerSchedule" /> </el-tab-pane> <el-tab-pane label="æä½æ¥å¿" name="log"> <air-conditioner-log ref="airConditionerLog" /> </el-tab-pane> </el-tabs> </el-card> </div> </template> <script setup name="AirConditioner"> import { ref, onMounted, nextTick } from 'vue' import AirConditionerList from './list.vue' import AirConditionerSchedule from './schedule.vue' import AirConditionerLog from './log.vue' const activeTab = ref('list') const airConditionerList = ref(null) const airConditionerSchedule = ref(null) const scheduleDialogRef = ref(null) // 宿¶ä»»å¡å¼¹çªæ¾ç¤ºç¶æ const scheduleDialogVisible = ref(false) // å¤çä»ç©ºè°åè¡¨åæ¢å°å®æ¶ä»»å¡é¡µé¢çæ¹æ³ï¼éè¿Tabåæ¢ï¼ function handleTabSchedule(airConditionerId) { activeTab.value = 'schedule' // çå¾ DOMæ´æ°åè°ç¨å®æ¶ä»»å¡ç»ä»¶çæ¹æ³ nextTick(() => { if (airConditionerSchedule.value) { airConditionerSchedule.value.loadScheduleByAirConditioner(airConditionerId) } }) } // å¤çæ¾ç¤ºå®æ¶ä»»å¡å¼¹çªçæ¹æ³ï¼éè¿æé®ç¹å»ï¼ function handleShowSchedule(airConditionerId) { scheduleDialogVisible.value = true // çå¾ DOMæ´æ°åè°ç¨å®æ¶ä»»å¡ç»ä»¶çæ¹æ³ nextTick(() => { if (scheduleDialogRef.value) { scheduleDialogRef.value.loadScheduleByAirConditioner(airConditionerId) } }) } // æ´é²æ¹æ³ç»åç»ä»¶è°ç¨ defineExpose({ activeTab, handleShowSchedule, handleTabSchedule }) </script> <style scoped> .card-header { display: flex; justify-content: space-between; align-items: center; } </style> zhitan-vue/src/views/airconditioner/list.vue
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,409 @@ <template> <div class="app-container"> <el-row :gutter="20"> <el-col :span="24"> <el-form :model="queryParams" ref="queryFormRef" :inline="true" v-show="showSearch" label-width="68px"> <el-form-item label="空è°åç§°" prop="name"> <el-input v-model="queryParams.name" placeholder="请è¾å ¥ç©ºè°åç§°" clearable @keyup.enter="handleQuery" /> </el-form-item> <el-form-item label="å®è£ ä½ç½®" prop="location"> <el-input v-model="queryParams.location" placeholder="请è¾å ¥å®è£ ä½ç½®" clearable @keyup.enter="handleQuery" /> </el-form-item> <el-form-item label="ç¶æ" prop="status"> <el-select v-model="queryParams.status" placeholder="空è°ç¶æ" clearable> <el-option v-for="dict in statusOptions" :key="dict.label" :label="dict.label" :value="dict.label" /> </el-select> </el-form-item> <el-form-item> <el-button type="primary" :icon="Search" @click="handleQuery">æç´¢</el-button> <el-button :icon="Refresh" @click="resetQuery">éç½®</el-button> </el-form-item> </el-form> <el-row :gutter="10" class="mb8"> <el-col :span="1.5"> <el-button type="primary" plain :icon="Plus" @click="handleAdd" v-hasPermi="['system:airconditioner:add']" >æ°å¢</el-button> </el-col> <el-col :span="1.5"> <el-button type="success" plain :icon="Edit" :disabled="single" @click="handleUpdate" v-hasPermi="['system:airconditioner:edit']" >ä¿®æ¹</el-button> </el-col> <el-col :span="1.5"> <el-button type="danger" plain :icon="Delete" :disabled="multiple" @click="handleDelete" v-hasPermi="['system:airconditioner:remove']" >å é¤</el-button> </el-col> <right-toolbar v-model:show-search="showSearch" @queryTable="getList"></right-toolbar> </el-row> <el-table v-loading="loading" :data="airConditionerList" @selection-change="handleSelectionChange"> <el-table-column type="selection" width="55" align="center" /> <el-table-column label="空è°ID" align="center" prop="id" /> <el-table-column label="空è°åç§°" align="center" prop="name" /> <el-table-column label="æ§å¶å¨ID" align="center" prop="controllerId" /> <el-table-column label="å®è£ ä½ç½®" align="center" prop="location" /> <el-table-column label="ç¶æ" align="center" prop="status"> <template #default="scope"> <dict-tag :options="statusOptions" :value="scope.row.status"/> </template> </el-table-column> <el-table-column label="æ§å¶" align="center" width="300"> <template #default="scope"> <el-button type="primary" size="small" @click="handleControl('0', scope.row)" >å¶å·å¼æº</el-button> <el-button type="success" size="small" @click="handleControl('1', scope.row)" >å¶ç弿º</el-button> <el-button type="warning" size="small" @click="handleControl('2', scope.row)" >å ³æº</el-button> </template> </el-table-column> <el-table-column label="æä½" align="center" class-name="small-padding fixed-width"> <template #default="scope"> <el-button type="primary" link :icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:airconditioner:edit']" >ä¿®æ¹</el-button> <el-button type="primary" link :icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:airconditioner:remove']" >å é¤</el-button> <el-button type="primary" link :icon="Timer" @click="handleShowSchedule(scope.row)" >宿¶</el-button> </template> </el-table-column> </el-table> <pagination v-show="total>0" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" :total="total" @pagination="getList" /> </el-col> </el-row> <!-- æ·»å æä¿®æ¹ç©ºè°å¯¹è¯æ¡ --> <el-dialog :title="title" v-model="open" width="500px" append-to-body> <el-form ref="formRef" :model="form" :rules="rules" label-width="80px"> <el-form-item label="空è°åç§°" prop="name"> <el-input v-model="form.name" placeholder="请è¾å ¥ç©ºè°åç§°" /> </el-form-item> <el-form-item label="æ§å¶å¨ID" prop="controllerId"> <el-input v-model="form.controllerId" placeholder="请è¾å ¥æ§å¶å¨ID" /> </el-form-item> <el-form-item label="å®è£ ä½ç½®" prop="location"> <el-input v-model="form.location" placeholder="请è¾å ¥å®è£ ä½ç½®" /> </el-form-item> <el-form-item label="ç¶æ"> <el-radio-group v-model="form.status"> <el-radio v-for="dict in statusOptions" :key="dict.value" :label="dict.value" >{{dict.label}}</el-radio> </el-radio-group> </el-form-item> <el-form-item label="夿³¨" prop="remark"> <el-input v-model="form.remark" type="textarea" placeholder="请è¾å ¥å 容" /> </el-form-item> </el-form> <template #footer> <div class="dialog-footer"> <el-button type="primary" @click="submitForm">ç¡® å®</el-button> <el-button @click="cancel">å æ¶</el-button> </div> </template> </el-dialog> <!-- 空è°å®æ¶ä»»å¡å¼¹çª --> <el-dialog title="空è°å®æ¶ä»»å¡" v-model="scheduleDialogVisible" width="900px" append-to-body > <air-conditioner-schedule ref="scheduleDialogRef" /> </el-dialog> </div> </template> <script setup name="AirConditionerList"> import { ref, reactive, onMounted, getCurrentInstance, nextTick } from 'vue' import { Search, Refresh, Plus, Edit, Delete, Setting, Timer, ArrowDown } from '@element-plus/icons-vue' import { ElMessage, ElMessageBox } from 'element-plus' import { listAirConditioner, getAirConditioner, addAirConditioner, updateAirConditioner, delAirConditioner, controlAirConditioner } from "@/api/airconditioner/airconditioner" import AirConditionerSchedule from './schedule.vue' // è·åç¶ç»ä»¶å®ä¾ const { proxy } = getCurrentInstance() const scheduleDialogRef = ref(null) // é®ç½©å± const loading = ref(true) // é䏿°ç» const ids = ref([]) // éå个ç¦ç¨ const single = ref(true) // éå¤ä¸ªç¦ç¨ const multiple = ref(true) // æ¾ç¤ºæç´¢æ¡ä»¶ const showSearch = ref(true) // æ»æ¡æ° const total = ref(0) // 空è°è¡¨æ ¼æ°æ® const airConditionerList = ref([]) // å¼¹åºå±æ é¢ const title = ref('') // æ¯å¦æ¾ç¤ºå¼¹åºå± const open = ref(false) // 表ååæ° const form = ref({}) // è¡¨åæ ¡éª const rules = { name: [ { required: true, message: "空è°åç§°ä¸è½ä¸ºç©º", trigger: "blur" } ], controllerId: [ { required: true, message: "æ§å¶å¨IDä¸è½ä¸ºç©º", trigger: "blur" } ], location: [ { required: true, message: "å®è£ ä½ç½®ä¸è½ä¸ºç©º", trigger: "blur" } ] } // ç¶æåå ¸ const statusOptions = [ { label: "å¶å·", value: "0" }, { label: "å¶ç", value: "1" }, { label: "å ³æº", value: "2" } ] // æ¥è¯¢åæ° const queryParams = ref({ pageNum: 1, pageSize: 10, name: null, location: null, status: null }) // 表åref const formRef = ref() const queryFormRef = ref() /** æ¥è¯¢ç©ºè°å表 */ function getList() { loading.value = true listAirConditioner(queryParams.value).then(response => { airConditionerList.value = response.rows total.value = response.total loading.value = false }) } // åæ¶æé® function cancel() { open.value = false reset() } // 表åéç½® function reset() { form.value = { id: null, name: null, controllerId: null, location: null, status: "2", // é»è®¤ä¸ºå ³æºç¶æ remark: null } nextTick(() => { if (formRef.value) { formRef.value.resetFields() } }) } /** æç´¢æé®æä½ */ function handleQuery() { queryParams.value.pageNum = 1 getList() } /** éç½®æé®æä½ */ function resetQuery() { queryFormRef.value.resetFields() handleQuery() } // å¤éæ¡é䏿°æ® function handleSelectionChange(selection) { ids.value = selection.map(item => item.id) single.value = selection.length !== 1 multiple.value = !selection.length } /** æ°å¢æé®æä½ */ function handleAdd() { reset() open.value = true title.value = "æ·»å 空è°" } /** ä¿®æ¹æé®æä½ */ function handleUpdate(row) { reset() const id = row.id || ids.value[0] getAirConditioner(id).then(response => { form.value = response.data open.value = true title.value = "ä¿®æ¹ç©ºè°" }) } /** æäº¤æé® */ function submitForm() { formRef.value.validate(valid => { if (valid) { if (form.value.id != null) { updateAirConditioner(form.value).then(response => { ElMessage.success("ä¿®æ¹æå") open.value = false getList() }) } else { addAirConditioner(form.value).then(response => { ElMessage.success("æ°å¢æå") open.value = false getList() }) } } }) } /** å é¤æé®æä½ */ function handleDelete(row) { const deleteIds = row.id || ids.value ElMessageBox.confirm('æ¯å¦ç¡®è®¤å é¤ç©ºè°ç¼å·ä¸º"' + deleteIds + '"çæ°æ®é¡¹?') .then(() => { return delAirConditioner(deleteIds) }) .then(() => { getList() ElMessage.success("å 餿å") }) .catch(() => {}) } /** æ§å¶ç©ºè°æä½ */ function handleControl(command, row) { const id = row.id const modeName = command === '0' ? 'å¶å·å¼æº' : command === '1' ? 'å¶ç弿º' : 'å ³æº' ElMessageBox.confirm('æ¯å¦ç¡®è®¤å¯¹ç©ºè°"' + row.name + '"æ§è¡' + modeName + 'æä½?') .then(() => { return controlAirConditioner(id, command, '0') // 0表示æå¨æä½ }) .then(() => { // æ´æ°æ¬å°ç¶æï¼é¿å çå¾ å·æ° row.status = command ElMessage.success(modeName + "æä½æå") // å·æ°åè¡¨æ°æ® getList() }) .catch(() => {}) } /** 宿¶ä»»å¡æä½ */ function handleSchedule(row) { // è°ç¨ç¶ç»ä»¶çhandleShowScheduleæ¹æ³ï¼ä¼ é空è°ID proxy.$parent.handleShowSchedule(row.id) } // 宿¶ä»»å¡å¼¹çªæ¾ç¤ºç¶æ const scheduleDialogVisible = ref(false) // å¤çæ¾ç¤ºå®æ¶ä»»å¡å¼¹çªçæ¹æ³ï¼éè¿æé®ç¹å»ï¼ function handleShowSchedule(airConditionerId) { scheduleDialogVisible.value = true // çå¾ DOMæ´æ°åè°ç¨å®æ¶ä»»å¡ç»ä»¶çæ¹æ³ nextTick(() => { if (scheduleDialogRef.value) { scheduleDialogRef.value.loadScheduleByAirConditioner(airConditionerId) } }) } onMounted(() => { getList() }) // æ´é²æ¹æ³ç»ç¶ç»ä»¶è°ç¨ defineExpose({ getList }) </script> zhitan-vue/src/views/airconditioner/log.vue
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,166 @@ <template> <div class="app-container"> <el-form :model="queryParams" ref="queryFormRef" :inline="true" v-show="showSearch" label-width="68px"> <el-form-item label="空è°ID" prop="airConditionerId"> <el-select v-model="queryParams.airConditionerId" placeholder="è¯·éæ©ç©ºè°" clearable> <el-option v-for="item in airConditionerOptions" :key="item.id" :label="item.name" :value="item.id" /> </el-select> </el-form-item> <el-form-item label="æä½ç±»å" prop="operationType"> <el-select v-model="queryParams.operationType" placeholder="è¯·éæ©æä½ç±»å" clearable> <el-option v-for="dict in operationTypeOptions" :key="dict.value" :label="dict.label" :value="dict.value" /> </el-select> </el-form-item> <el-form-item label="æ¶é´èå´" prop="timeRange"> <el-date-picker v-model="queryParams.timeRange" type="datetimerange" range-separator="è³" start-placeholder="å¼å§æ¶é´" end-placeholder="ç»ææ¶é´" /> </el-form-item> <el-form-item> <el-button type="primary" :icon="Search" @click="handleQuery">æç´¢</el-button> <el-button :icon="Refresh" @click="resetQuery">éç½®</el-button> </el-form-item> </el-form> <el-table v-loading="loading" :data="logList" style="width: 100%" > <el-table-column type="index" width="50" align="center" /> <el-table-column label="æä½æ¶é´" align="center" prop="operateTime" width="160"> <template #default="scope"> <span>{{ parseTime(scope.row.operateTime) }}</span> </template> </el-table-column> <el-table-column label="空è°ä¿¡æ¯" align="center" prop="airConditionerName" /> <el-table-column label="æä½ç±»å" align="center" prop="operateType"> <template #default="scope"> <dict-tag :options="operationTypeOptions" :value="scope.row.operateType"/> </template> </el-table-column> <el-table-column label="工使¨¡å¼" align="center" prop="operateMode" > <template #default="scope"> <dict-tag :options="operationModeOptions" :value="scope.row.operateMode"/> </template> </el-table-column> <el-table-column label="æä½ç»æ" align="center" prop="operateResult"> <template #default="scope"> <el-tag :type="scope.row.operateResult === '1' ? 'success' : 'danger'"> {{ scope.row.operateResult === '1' ? 'æå' : '失败' }} </el-tag> </template> </el-table-column> <el-table-column label="æä½äººå" align="center" prop="operatorName" /> </el-table> <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" /> </div> </template> <script setup name="AirConditionerLog"> import { ref, reactive, onMounted, getCurrentInstance } from 'vue' import { Search, Refresh } from '@element-plus/icons-vue' import { parseTime } from '@/utils/ruoyi' import { listAirConditioner } from '@/api/airconditioner/airconditioner' import { listLog } from '@/api/airconditioner/log' // è·åç¶ç»ä»¶å®ä¾ const { proxy } = getCurrentInstance() // é®ç½©å± const loading = ref(false) // æ¾ç¤ºæç´¢æ¡ä»¶ const showSearch = ref(true) // æ»æ¡æ° const total = ref(0) // æ¥å¿è¡¨æ ¼æ°æ® const logList = ref([]) // 空è°é项 const airConditionerOptions = ref([]) // æä½ç±»åé项 const operationTypeOptions = ref([ { label: 'æå¨', value: '0' }, { label: 'èªå¨', value: '1' } ]) const operationModeOptions = ref([ { label: 'å¶å·', value: '0' }, { label: 'å¶ç', value: '1' }, { label: 'å ³æº', value: '2' }, ]) // 表åref const queryFormRef = ref() // æ¥è¯¢åæ° const queryParams = ref({ pageNum: 1, pageSize: 10, airConditionerId: undefined, operationType: undefined, timeRange: [] }) /** æ¥è¯¢æ¥å¿å表 */ function getList() { loading.value = true listLog(queryParams.value).then(response => { logList.value = response.rows total.value = response.total loading.value = false }) } /** æ¥è¯¢ç©ºè°å表 */ function getAirConditioners() { listAirConditioner().then(response => { airConditionerOptions.value = response.rows }) } /** æç´¢æé®æä½ */ function handleQuery() { queryParams.value.pageNum = 1 getList() } /** éç½®æé®æä½ */ function resetQuery() { queryFormRef.value.resetFields() handleQuery() } onMounted(() => { getList() getAirConditioners() // è·ååå ¸æ°æ® // proxy.getDicts('airconditioner_operation_type').then(response => { // operationTypeOptions.value = response.data // }) }) // æ´é²æ¹æ³ç»ç¶ç»ä»¶è°ç¨ defineExpose({ getList }) </script> zhitan-vue/src/views/airconditioner/schedule.vue
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,434 @@ <template> <div class="app-container"> <el-row :gutter="20"> <el-col :span="24"> <el-form :model="queryParams" ref="queryFormRef" :inline="true" v-show="showSearch" label-width="68px"> <el-form-item label="ç¶æ" prop="status"> <el-select v-model="queryParams.status" placeholder="宿¶ä»»å¡ç¶æ" clearable> <el-option v-for="dict in statusOptions" :key="dict.dictValue" :label="dict.label" :value="dict.dictValue" /> </el-select> </el-form-item> <el-form-item> <el-button type="primary" :icon="Search" @click="handleQuery">æç´¢</el-button> <el-button :icon="Refresh" @click="resetQuery">éç½®</el-button> </el-form-item> </el-form> <el-row :gutter="10" class="mb8"> <el-col :span="1.5"> <el-button type="primary" plain :icon="Plus" @click="handleAdd" v-hasPermi="['system:airconditioner:schedule:add']" >æ°å¢</el-button> </el-col> <el-col :span="1.5"> <el-button type="success" plain :icon="Edit" :disabled="single" @click="handleUpdate" v-hasPermi="['system:airconditioner:schedule:edit']" >ä¿®æ¹</el-button> </el-col> <el-col :span="1.5"> <el-button type="danger" plain :icon="Delete" :disabled="multiple" @click="handleDelete" v-hasPermi="['system:airconditioner:schedule:remove']" >å é¤</el-button> </el-col> <right-toolbar v-model:show-search="showSearch" @queryTable="getList"></right-toolbar> </el-row> <el-table v-loading="loading" :data="scheduleList" @selection-change="handleSelectionChange"> <el-table-column type="selection" width="55" align="center" /> <el-table-column label="ä»»å¡ID" align="center" prop="id" /> <el-table-column label="空è°åç§°" align="center" prop="airConditionerName"> {{ currentAirConditionerName }} <!-- <template #default="scope"> <span>{{ getAirConditionerName(scope.row.airConditionerId) }}</span> </template> --> </el-table-column> <el-table-column label="å¼å§æ¶é´" align="center" prop="startTime" width="120"> <!-- <template #default="scope">--> <!-- <span>{{ formatTimeOnly(scope.row.startTime) }}</span>--> <!-- </template>--> </el-table-column> <el-table-column label="ç»ææ¶é´" align="center" prop="offTime" width="120"> <!-- <template #default="scope">--> <!-- <span>{{ formatTimeOnly(scope.row.offTime) }}</span>--> <!-- </template>--> </el-table-column> <el-table-column label="ç¶æ" align="center" prop="status"> <template #default="scope"> <dict-tag :options="statusOptions" :value="scope.row.status"/> </template> </el-table-column> <el-table-column label="æä½" align="center" class-name="small-padding fixed-width"> <template #default="scope"> <el-button type="primary" link :icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:airconditioner:schedule:edit']" >ä¿®æ¹</el-button> <el-button type="primary" link :icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:airconditioner:schedule:remove']" >å é¤</el-button> </template> </el-table-column> </el-table> <pagination v-show="total>0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" /> </el-col> </el-row> <!-- æ·»å æä¿®æ¹ç©ºè°å®æ¶ä»»å¡å¯¹è¯æ¡ --> <el-dialog :title="title" v-model="open" width="500px" append-to-body> <el-form ref="formRef" :model="form" :rules="rules" label-width="100px"> <el-form-item label="空è°" prop="airConditionerId"> <el-select v-model="form.airConditionerId" placeholder="è¯·éæ©ç©ºè°" style="width: 100%" :disabled="true"> <el-option v-for="item in airConditionerOptions" :key="item.id" :label="item.name" :value="item.id" /> </el-select> </el-form-item> <el-form-item label="å¼å§æ¶é´" prop="startTime"> <el-time-picker v-model="form.startTime" format="HH:mm:ss" placeholder="éæ©å¼å§æ¶é´" style="width: 100%" /> </el-form-item> <el-form-item label="ç»ææ¶é´" prop="offTime"> <el-time-picker v-model="form.offTime" format="HH:mm:ss" placeholder="éæ©ç»ææ¶é´" style="width: 100%" /> </el-form-item> <el-form-item label="ç¶æ"> <el-radio-group v-model="form.status"> <el-radio v-for="dict in statusOptions" :key="dict.value" :label="dict.value" >{{dict.label}}</el-radio> </el-radio-group> </el-form-item> </el-form> <template #footer> <div class="dialog-footer"> <el-button type="primary" @click="submitForm">ç¡® å®</el-button> <el-button @click="cancel">å æ¶</el-button> </div> </template> </el-dialog> </div> </template> <script setup name="AirConditionerSchedule"> import { ref, reactive, onMounted, getCurrentInstance, nextTick } from 'vue' import { Search, Refresh, Plus, Edit, Delete } from '@element-plus/icons-vue' import { ElMessage, ElMessageBox } from 'element-plus' import { listSchedule, getSchedule, addSchedule, updateSchedule, delSchedule, getScheduleByAirConditionerId } from "@/api/airconditioner/schedule" import { listAirConditioner } from "@/api/airconditioner/airconditioner" import { parseTime } from '@/utils/ruoyi' /** æ ¼å¼åæ¶é´ä¸ºæ¶:å:ç§ */ function formatTimeOnly(time) { if (!time) return '' const date = new Date(time) return `${date.getHours().toString().padStart(2, '0')}:${date.getMinutes().toString().padStart(2, '0')}:${date.getSeconds().toString().padStart(2, '0')}` } // è·åç¶ç»ä»¶å®ä¾ const { proxy } = getCurrentInstance() // é®ç½©å± const loading = ref(true) // é䏿°ç» const ids = ref([]) // éå个ç¦ç¨ const single = ref(true) // éå¤ä¸ªç¦ç¨ const multiple = ref(true) // æ¾ç¤ºæç´¢æ¡ä»¶ const showSearch = ref(true) // æ»æ¡æ° const total = ref(0) // 宿¶ä»»å¡è¡¨æ ¼æ°æ® const scheduleList = ref([]) // 空è°é项 const airConditionerOptions = ref([]) // å½åéä¸ç空è°ID const currentAirConditionerId = ref(null) const currentAirConditionerName= ref('') // å¼¹åºå±æ é¢ const title = ref('') // æ¯å¦æ¾ç¤ºå¼¹åºå± const open = ref(false) // 表ååæ° const form = ref({}) // 表åref const formRef = ref() const queryFormRef = ref() // ç¶æåå ¸ const statusOptions = [ { label: "æ£å¸¸", value: "0" }, { label: "åç¨", value: "1" } ] // æ¥è¯¢åæ° const queryParams = ref({ pageNum: 1, pageSize: 10, airConditionerId: null, status: null }) // è¡¨åæ ¡éª const rules = { airConditionerId: [ { required: true, message: "空è°ä¸è½ä¸ºç©º", trigger: "change" } ], startTime: [ { required: true, message: "å¼å§æ¶é´ä¸è½ä¸ºç©º", trigger: "blur" } ], offTime: [ { required: true, message: "ç»ææ¶é´ä¸è½ä¸ºç©º", trigger: "blur" } ] } /** æ¥è¯¢å®æ¶ä»»å¡å表 */ function getList() { loading.value = true // 妿æå½åéä¸ç空è°IDï¼ååªæ¥è¯¢è¯¥ç©ºè°ç宿¶ä»»å¡ if (currentAirConditionerId.value) { getScheduleByAirConditionerId(currentAirConditionerId.value).then(response => { scheduleList.value = response.data.sort((a, b) => { return new Date(a.startTime) - new Date(b.startTime) }) total.value = response.data.length loading.value = false }) } else { // å ¼å®¹åæé»è¾ï¼ä½æ£å¸¸æ åµä¸ä¸ä¼æ§è¡å°è¿é listSchedule(queryParams.value).then(response => { // å æç©ºè°åç§°æåºï¼åæå¼å§æ¶é´æåº scheduleList.value = response.rows.sort((a, b) => { const nameA = getAirConditionerName(a.airConditionerId) const nameB = getAirConditionerName(b.airConditionerId) if (nameA !== nameB) { return nameA.localeCompare(nameB) } return new Date(a.startTime) - new Date(b.startTime) }) total.value = response.total loading.value = false }) } } /** æ¥è¯¢ç©ºè°å表 */ function getAirConditioners() { listAirConditioner().then(response => { airConditionerOptions.value = response.rows }) } /** æ ¹æ®ç©ºè°IDè·å空è°åç§° */ // function getAirConditionerName(airConditionerId) { // const airConditioner = airConditionerOptions.value.find(item => item.id === airConditionerId) // return airConditioner ? airConditioner.name : '' // } // åæ¶æé® function cancel() { open.value = false reset() } // 表åéç½® function reset() { form.value = { id: null, airConditionerId: null, startTime: null, offTime: null, status: "0" } nextTick(() => { if (formRef.value) { formRef.value.resetFields() } }) } /** æç´¢æé®æä½ */ function handleQuery() { queryParams.value.pageNum = 1 getList() } /** éç½®æé®æä½ */ function resetQuery() { queryFormRef.value.resetFields() handleQuery() } // å¤éæ¡é䏿°æ® function handleSelectionChange(selection) { ids.value = selection.map(item => item.id) single.value = selection.length !== 1 multiple.value = !selection.length } /** æ°å¢æé®æä½ */ function handleAdd() { reset() // 设置å½åéä¸ç空è°ID form.value.airConditionerId = currentAirConditionerId.value open.value = true title.value = "æ·»å 宿¶ä»»å¡" } /** ä¿®æ¹æé®æä½ */ function handleUpdate(row) { reset() const id = row.id || ids.value[0] getSchedule(id).then(response => { const data = response.data // å¤çæ¶é´æ ¼å¼ï¼å°HH:MM:SSæ ¼å¼è½¬æ¢ä¸ºDate对象 if (data.startTime) { const [hours, minutes, seconds] = data.startTime.split(':').map(Number) const startTime = new Date() startTime.setHours(hours, minutes, seconds) data.startTime = startTime } if (data.offTime) { const [hours, minutes, seconds] = data.offTime.split(':').map(Number) const offTime = new Date() offTime.setHours(hours, minutes, seconds) data.offTime = offTime } form.value = data open.value = true title.value = "ä¿®æ¹å®æ¶ä»»å¡" }) } /** æäº¤æé® */ function submitForm() { formRef.value.validate(valid => { if (valid) { // å建æäº¤æ°æ®ç坿¬ const submitData = { ...form.value } // å¤çæ¶é´æ ¼å¼ï¼åªä¿çæ¶åç§ if (submitData.startTime) { const startTime = new Date(submitData.startTime) submitData.startTime = `${startTime.getHours().toString().padStart(2, '0')}:${startTime.getMinutes().toString().padStart(2, '0')}:${startTime.getSeconds().toString().padStart(2, '0')}` } if (submitData.offTime) { const offTime = new Date(submitData.offTime) submitData.offTime = `${offTime.getHours().toString().padStart(2, '0')}:${offTime.getMinutes().toString().padStart(2, '0')}:${offTime.getSeconds().toString().padStart(2, '0')}` } if (submitData.id != null) { updateSchedule(submitData).then(response => { ElMessage.success("ä¿®æ¹æå") open.value = false getList() }) } else { addSchedule(submitData).then(response => { ElMessage.success("æ°å¢æå") open.value = false getList() }) } } }) } /** å é¤æé®æä½ */ function handleDelete(row) { const deleteIds = row.id || ids.value ElMessageBox.confirm('æ¯å¦ç¡®è®¤å é¤å®æ¶ä»»å¡ç¼å·ä¸º"' + deleteIds + '"çæ°æ®é¡¹?') .then(() => { return delSchedule(deleteIds) }) .then(() => { getList() ElMessage.success("å 餿å") }) .catch(() => {}) } /** æ ¹æ®ç©ºè°IDå è½½å®æ¶ä»»å¡ */ function loadScheduleByAirConditioner(airConditioner) { console.log('loadScheduleByAirConditioner', airConditioner) if (airConditioner) { currentAirConditionerName.value = airConditioner.name // 设置å½åéä¸ç空è°ID currentAirConditionerId.value = airConditioner.id queryParams.value.airConditionerId = airConditioner.controllerId handleQuery() } } onMounted(() => { // 页é¢å è½½æ¶å è·å空è°å表ï¼ä½ä¸èªå¨å è½½å®æ¶ä»»å¡å表 // 宿¶ä»»å¡å表å°éè¿ç¶ç»ä»¶ä¼ éç空è°IDå è½½ getAirConditioners() }) // æ´é²æ¹æ³ç»ç¶ç»ä»¶è°ç¨ defineExpose({ getList, loadScheduleByAirConditioner }) </script>