Prechádzať zdrojové kódy

面板管理模块,情景管理模块

zhj 1 rok pred
rodič
commit
576f400327
33 zmenil súbory, kde vykonal 1286 pridanie a 1 odobranie
  1. 13 0
      src/main/java/com/welampiot/common/InterfaceResultEnum.java
  2. 23 0
      src/main/java/com/welampiot/controller/BaseController.java
  3. 131 0
      src/main/java/com/welampiot/controller/PanelController.java
  4. 91 0
      src/main/java/com/welampiot/controller/SceneController.java
  5. 2 0
      src/main/java/com/welampiot/dao/GroupDao.java
  6. 1 0
      src/main/java/com/welampiot/dao/LampDao.java
  7. 18 0
      src/main/java/com/welampiot/dao/PanelInfoDao.java
  8. 16 0
      src/main/java/com/welampiot/dao/SceneDao.java
  9. 13 0
      src/main/java/com/welampiot/dao/SceneItemDao.java
  10. 1 0
      src/main/java/com/welampiot/dto/GroupDTO.java
  11. 32 0
      src/main/java/com/welampiot/dto/PanelInfoDTO.java
  12. 22 0
      src/main/java/com/welampiot/dto/SceneDTO.java
  13. 15 0
      src/main/java/com/welampiot/dto/SceneItemDTO.java
  14. 2 1
      src/main/java/com/welampiot/service/GroupService.java
  15. 1 0
      src/main/java/com/welampiot/service/LampService.java
  16. 17 0
      src/main/java/com/welampiot/service/PanelInfoService.java
  17. 12 0
      src/main/java/com/welampiot/service/SceneItemService.java
  18. 19 0
      src/main/java/com/welampiot/service/SceneService.java
  19. 10 0
      src/main/java/com/welampiot/service/impl/GroupServiceImpl.java
  20. 5 0
      src/main/java/com/welampiot/service/impl/LampServiceImpl.java
  21. 57 0
      src/main/java/com/welampiot/service/impl/PanelInfoServiceImpl.java
  22. 36 0
      src/main/java/com/welampiot/service/impl/SceneItemServiceImpl.java
  23. 196 0
      src/main/java/com/welampiot/service/impl/SceneServiceImpl.java
  24. 140 0
      src/main/java/com/welampiot/utils/ToolUtils.java
  25. 32 0
      src/main/java/com/welampiot/vo/BaseVO.java
  26. 16 0
      src/main/java/com/welampiot/vo/PanelConfigVO.java
  27. 26 0
      src/main/java/com/welampiot/vo/PanelInfoVO.java
  28. 67 0
      src/main/java/com/welampiot/vo/SceneVO.java
  29. 17 0
      src/main/resources/mapper/GroupMapper.xml
  30. 10 0
      src/main/resources/mapper/LampMapper.xml
  31. 136 0
      src/main/resources/mapper/PanelInfoMapper.xml
  32. 28 0
      src/main/resources/mapper/SceneItemMapper.xml
  33. 81 0
      src/main/resources/mapper/SceneMapper.xml

+ 13 - 0
src/main/java/com/welampiot/common/InterfaceResultEnum.java

@@ -277,6 +277,19 @@ public enum InterfaceResultEnum {
 
     // 集控器 1300-1399
     LACK_CT_TYPE_ERROR("1300", "请选择ctr量程范围" , "Please select a ctr range" , "Пожалуйста, выберите диапазон КТР" ),
+
+    // 按键面板 1400-1499
+    LACK_PANEL_NAME_ERROR("1400", "请输入面板名称" , "Please enter the panel name" , "Пожалуйста, введите имя панели" ),
+    LACK_PANEL_ADDRESS_ERROR("1401", "请输入面板地址" , "Please enter the panel address" , "Пожалуйста, введите адрес панели" ),
+    LACK_PANEL_NET_ADDRESS_ERROR("1402", "请输入面板网关地址" , "Please enter the panel gateway address" , "Введите адрес шлюза панели" ),
+    PANEL_NAME_UNIQUE_ERROR("1403", "面板名称已重复", "The panel name has been repeated", "Имя панели повторяется"),
+    PANEL_ADDRESS_UNIQUE_ERROR("1404", "面板地址已重复", "The panel address has been repeated", "Адрес панели повторяется"),
+
+    // 情景联动 1500-1599
+    LACK_NET_ADDRESS_ERROR("1500", "请输入网关地址", "Please enter the gateway address", "Введите адрес шлюза"),
+
+    LACK_GROUP_ERROR("1501", "请选择要绑定的分组", "Select the group you want to bind", "Пожалуйста, выберите группу для связывания"),
+    GROUP_REPEAT_ERROR("1502", "绑定的分组重复", "The bound group is repeated", "Связывание повторяется группой")
     ;
     private String code;
     private String msgCn;

+ 23 - 0
src/main/java/com/welampiot/controller/BaseController.java

@@ -5,12 +5,30 @@ import com.welampiot.service.UserService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.RestController;
 
+import javax.annotation.PreDestroy;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
 
 @RestController
 public class BaseController {
 
+    // 获取可用的处理器数量
+    private final static int CORE_POOL_SIZE = Runtime.getRuntime().availableProcessors();
+    // 设置最大线程数为可用处理器数量的两倍
+    private final static int MAX_POOL_SIZE = CORE_POOL_SIZE * 2 + 1;
+    // 设置空闲线程的存活时间
+    private final static long KEEP_ALIVE_TIME = 60L;
+    // 设置时间单位
+    private final static TimeUnit TIME_UNIT = TimeUnit.SECONDS;
+    // 设置任务队列
+    private final static BlockingQueue<Runnable> WORK_QUEUE = new LinkedBlockingQueue<>();
+    // 创建动态线程池对象实例
+    public final static ThreadPoolExecutor EXECUTOR_SERVICE = new ThreadPoolExecutor(CORE_POOL_SIZE, MAX_POOL_SIZE, KEEP_ALIVE_TIME, TIME_UNIT, WORK_QUEUE);
+
     @Autowired
     private UserService userService;
 
@@ -34,4 +52,9 @@ public class BaseController {
 
         return sectionList;
     }
+
+    @PreDestroy
+    public void shutdown() {
+        EXECUTOR_SERVICE.shutdown();
+    }
 }

+ 131 - 0
src/main/java/com/welampiot/controller/PanelController.java

@@ -0,0 +1,131 @@
+package com.welampiot.controller;
+
+import com.welampiot.common.BaseResult;
+import com.welampiot.common.InterfaceResultEnum;
+import com.welampiot.dto.PanelInfoDTO;
+import com.welampiot.service.PanelInfoService;
+import com.welampiot.utils.ToolUtils;
+import com.welampiot.vo.PanelConfigVO;
+import com.welampiot.vo.PanelInfoVO;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.CrossOrigin;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+@RestController
+@CrossOrigin
+@RequestMapping("/panel")
+public class PanelController extends BaseController {
+
+    @Autowired
+    private PanelInfoService panelInfoService;
+
+    @Autowired
+    private ToolUtils toolUtils;
+
+    /**
+     * 获取面板列表
+     */
+    @RequestMapping(value = "/getList", method = RequestMethod.POST)
+    private BaseResult<?> getPanelList(PanelInfoVO panelInfoVO) {
+        panelInfoVO.setPageAndCount(panelInfoVO.getPage(), panelInfoVO.getCount());
+        List<Integer> sectionList = getSectionList(panelInfoVO.getUsername());
+        panelInfoVO.setSectionList(sectionList);
+        List<PanelInfoDTO> panelList = panelInfoService.getPanelInfoListByPanelInfoVO(panelInfoVO);
+        Integer total = panelInfoService.getPanelTotalByPanelInfoVO(panelInfoVO);
+        Integer onlineTotal = panelInfoService.getPanelOnlineTotalByPanelInfoVO(panelInfoVO);
+        PanelInfoVO panelInfoVO1 = new PanelInfoVO();
+        panelInfoVO1.setTotal(total);
+        panelInfoVO1.setOnlineTotal(onlineTotal);
+        panelInfoVO1.setList(panelList);
+        return toolUtils.response(InterfaceResultEnum.OPERATION_SUCCESS, panelInfoVO.getVersion(), panelInfoVO1);
+    }
+
+    /**
+     * 添加编辑设备
+     */
+    @RequestMapping(value = "/save", method = RequestMethod.POST)
+    private BaseResult<?> save(PanelInfoVO panelInfoVO) {
+        Integer version = panelInfoVO.getVersion();
+
+        BaseResult<?> baseResult = checkPanelData(panelInfoVO);
+        if (baseResult != null) return baseResult;
+
+        PanelInfoDTO panelInfoDTO = new PanelInfoDTO();
+        BeanUtils.copyProperties(panelInfoVO, panelInfoDTO);
+        if (panelInfoVO.getId() != null && panelInfoVO.getId() != 0) {
+            // 编辑
+            panelInfoService.updatePanelData(panelInfoDTO);
+        } else {
+            // 添加
+            panelInfoService.addPanelData(panelInfoDTO);
+        }
+        return toolUtils.response(InterfaceResultEnum.OPERATION_SUCCESS, version);
+    }
+
+    private BaseResult<?> checkPanelData(PanelInfoVO panelInfoVO) {
+        Integer version = panelInfoVO.getVersion();
+        if (panelInfoVO.getName() == null || panelInfoVO.getName().trim().equals("")) {
+            return toolUtils.response(InterfaceResultEnum.LACK_PANEL_NAME_ERROR, version);
+        }
+        if (panelInfoVO.getNetAddress() == null || panelInfoVO.getNetAddress().trim().equals("")) {
+            return toolUtils.response(InterfaceResultEnum.LACK_PANEL_NET_ADDRESS_ERROR, version);
+        }
+        if (panelInfoVO.getAddress() == null || panelInfoVO.getAddress().trim().equals("")) {
+            return toolUtils.response(InterfaceResultEnum.LACK_PANEL_ADDRESS_ERROR, version);
+        }
+        if (panelInfoVO.getAreaId() == null || panelInfoVO.getAreaId() == 0) {
+            return toolUtils.response(InterfaceResultEnum.LACK_AREA_ERROR, version);
+        }
+        if (panelInfoVO.getSectionId() == null || panelInfoVO.getSectionId() == 0) {
+            return toolUtils.response(InterfaceResultEnum.LACK_SECTION_ERROR, version);
+        }
+        PanelInfoDTO panelInfoDTO = new PanelInfoDTO();
+        panelInfoDTO.setAddress(panelInfoVO.getAddress());
+        panelInfoDTO.setId(panelInfoVO.getId());
+        if (panelInfoService.checkPanelData(panelInfoDTO) > 0) {
+            return toolUtils.response(InterfaceResultEnum.PANEL_ADDRESS_UNIQUE_ERROR, version);
+        }
+        panelInfoDTO = new PanelInfoDTO();
+        panelInfoDTO.setName(panelInfoVO.getName());
+        panelInfoDTO.setAreaId(panelInfoVO.getAreaId());
+        panelInfoDTO.setSectionId(panelInfoVO.getSectionId());
+        panelInfoDTO.setId(panelInfoVO.getId());
+        if (panelInfoService.checkPanelData(panelInfoDTO) > 0) {
+            return toolUtils.response(InterfaceResultEnum.PANEL_NAME_UNIQUE_ERROR, version);
+        }
+        return null;
+    }
+
+    /**
+     * 删除设备
+     */
+    @RequestMapping(value = "/del", method = RequestMethod.POST)
+    private BaseResult<?> del(PanelInfoVO panelInfoVO) {
+        Integer version = panelInfoVO.getVersion();
+        if (panelInfoVO.getId() == null || panelInfoVO.getId() == 0) {
+            return toolUtils.response(InterfaceResultEnum.LACK_PARAM_ERROR, version);
+        }
+        panelInfoService.deletePanelDataById(panelInfoVO.getId());
+        return toolUtils.response(InterfaceResultEnum.OPERATION_SUCCESS, version);
+    }
+
+    /**
+     * 获取按键配置
+     */
+    @RequestMapping(value = "/getConfig", method = RequestMethod.POST)
+    private BaseResult<?> getConfig(PanelInfoVO panelInfoVO) {
+        Integer version = panelInfoVO.getVersion();
+        if (panelInfoVO.getId() == null || panelInfoVO.getId() == 0) {
+            return toolUtils.response(InterfaceResultEnum.LACK_PARAM_ERROR, version);
+        }
+        PanelInfoDTO panelInfoDTO = panelInfoService.getPanelDetailsById(panelInfoVO.getId());
+        if (panelInfoDTO == null) return toolUtils.response(InterfaceResultEnum.PARAM_FAIL, version);
+        PanelConfigVO panelKeyParams = toolUtils.getPanelKeyParams(panelInfoDTO.getNetAddress(), panelInfoDTO.getAddress(), panelInfoVO.getKeyNumber());
+        return toolUtils.response(InterfaceResultEnum.OPERATION_SUCCESS, version, panelKeyParams);
+    }
+}

+ 91 - 0
src/main/java/com/welampiot/controller/SceneController.java

@@ -0,0 +1,91 @@
+package com.welampiot.controller;
+
+import com.welampiot.common.BaseResult;
+import com.welampiot.common.InterfaceResultEnum;
+import com.welampiot.dto.SceneDTO;
+import com.welampiot.service.SceneService;
+import com.welampiot.utils.ToolUtils;
+import com.welampiot.vo.SceneVO;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.CrossOrigin;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+@RestController
+@CrossOrigin
+@RequestMapping("/scene")
+public class SceneController extends BaseController {
+
+    @Autowired
+    private SceneService sceneService;
+
+    @Autowired
+    private ToolUtils toolUtils;
+
+    /**
+     * 获取场景列表
+     */
+    @RequestMapping(value = "/getList", method = RequestMethod.POST)
+    private BaseResult<?> getSceneList(SceneVO sceneVO) {
+        Integer version = sceneVO.getVersion();
+        List<Integer> sectionList = getSectionList(sceneVO.getUsername());
+        sceneVO.setSectionList(sectionList);
+        sceneVO.setPageAndCount(sceneVO.getPage(), sceneVO.getCount());
+        List<SceneDTO> sceneList = sceneService.getSceneListBySceneVO(sceneVO);
+        SceneVO sceneVO1 = new SceneVO();
+        sceneVO1.setTotal(sceneList.size());
+        sceneVO1.setList(sceneList);
+        return toolUtils.response(InterfaceResultEnum.OPERATION_SUCCESS, version, sceneVO1);
+    }
+
+    /**
+     * 情景详情
+     */
+    @RequestMapping(value = "/details", method = RequestMethod.POST)
+    private BaseResult<?> details(SceneVO sceneVO) {
+        Integer version = sceneVO.getVersion();
+        if (sceneVO.getId() == null || sceneVO.getId() == 0) return toolUtils.response(InterfaceResultEnum.LACK_PARAM_ERROR, version);
+        SceneDTO sceneDetails = sceneService.getSceneDetailsAndItemById(sceneVO.getId());
+        if (sceneDetails == null) return toolUtils.response(InterfaceResultEnum.PARAM_FAIL, version);
+        SceneVO sceneVO1 = new SceneVO();
+        BeanUtils.copyProperties(sceneDetails, sceneVO1);
+        return toolUtils.response(InterfaceResultEnum.OPERATION_SUCCESS, version, sceneVO1);
+    }
+
+    /**
+     * 删除情景
+     */
+    @RequestMapping(value = "/del", method = RequestMethod.POST)
+    private BaseResult<?> del(SceneVO sceneVO) {
+        Integer version = sceneVO.getVersion();
+        Integer id = sceneVO.getId();
+        if (id == null || id == 0) return toolUtils.response(InterfaceResultEnum.LACK_PARAM_ERROR, version);
+        sceneService.delSceneDataById(id);
+        return toolUtils.response(InterfaceResultEnum.OPERATION_SUCCESS, version);
+    }
+
+    /**
+     * 发送情景
+     */
+    @RequestMapping(value = "/set", method = RequestMethod.POST)
+    private BaseResult<?> set(SceneVO sceneVO) {
+        Integer version = sceneVO.getVersion();
+        Integer id = sceneVO.getId();
+        if (id == null || id == 0) return toolUtils.response(InterfaceResultEnum.LACK_PARAM_ERROR, version);
+        boolean b = sceneService.applyScene(id);
+        if (!b) return toolUtils.response(InterfaceResultEnum.COMMAND_FAIL, version);
+        return toolUtils.response(InterfaceResultEnum.OPERATION_SUCCESS, version);
+    }
+
+    /**
+     * 添加编辑情景
+     */
+    @RequestMapping(value = "/save", method = RequestMethod.POST)
+    private BaseResult<?> save(SceneVO sceneVO) {
+        return sceneService.saveSceneDataBySceneVO(sceneVO);
+    }
+}

+ 2 - 0
src/main/java/com/welampiot/dao/GroupDao.java

@@ -21,4 +21,6 @@ public interface GroupDao {
     GroupDTO getGroupDTOById(@Param("id") Integer id);
     void updateGroupLampId(GroupDTO dto);
     List<GroupDTO> getListByIds(@Param("ids") String[] ids);
+    GroupDTO getGroupAddrByGroupId(@Param("id") Integer id);
+    List<GroupDTO> getGroupListBySceneId(@Param("sceneId") Integer sceneId);
 }

+ 1 - 0
src/main/java/com/welampiot/dao/LampDao.java

@@ -71,4 +71,5 @@ public interface LampDao {
     List<LampInfoDTO> getLampJoinLogList(Integer id);
     List<LampInfoDTO> getLampLocaltion(LampInfoDTO dto);
     LampInfoDTO getLampById(Integer id);
+    List<LampInfoDTO> getLampListByIdList(@Param("idList") List<String> idList);
 }

+ 18 - 0
src/main/java/com/welampiot/dao/PanelInfoDao.java

@@ -0,0 +1,18 @@
+package com.welampiot.dao;
+
+import com.welampiot.dto.PanelInfoDTO;
+import com.welampiot.vo.PanelInfoVO;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+public interface PanelInfoDao {
+    List<PanelInfoDTO> getPanelInfoListByPanelInfoVO(PanelInfoVO panelInfoVO);
+    Integer getPanelTotalByPanelInfoVO(PanelInfoVO panelInfoVO);
+    Integer getPanelOnlineTotalByPanelInfoVO(PanelInfoVO panelInfoVO);
+    void addPanelData(PanelInfoDTO panelInfoDTO);
+    void updatePanelData(PanelInfoDTO panelInfoDTO);
+    Integer checkPanelData(PanelInfoDTO panelInfoDTO);
+    void deletePanelDataById(@Param("id") Integer id);
+    PanelInfoDTO getPanelDetailsById(@Param("id") Integer id);
+}

+ 16 - 0
src/main/java/com/welampiot/dao/SceneDao.java

@@ -0,0 +1,16 @@
+package com.welampiot.dao;
+
+import com.welampiot.dto.SceneDTO;
+import com.welampiot.vo.SceneVO;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+public interface SceneDao {
+    List<SceneDTO> getSceneListBySceneVO(SceneVO sceneVO);
+    SceneDTO getSceneDetailsById(@Param("id") Integer id);
+    void delSceneDataById(@Param("id") Integer id);
+    void addSceneData(SceneDTO sceneDTO);
+    void updateSceneData(SceneDTO sceneDTO);
+    List<Integer> getSceneIdByNetAddress(@Param("netAddress") String netAddress);
+}

+ 13 - 0
src/main/java/com/welampiot/dao/SceneItemDao.java

@@ -0,0 +1,13 @@
+package com.welampiot.dao;
+
+import com.welampiot.dto.SceneItemDTO;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+public interface SceneItemDao {
+    List<SceneItemDTO> getSceneItemListBySceneId(@Param("sceneId") Integer sceneId);
+    void deleteSceneItemDataBySceneId(@Param("sceneId") Integer sceneId);
+    void addSceneItemData(SceneItemDTO sceneItemDTO);
+    void updateSceneItemData(SceneItemDTO sceneItemDTO);
+}

+ 1 - 0
src/main/java/com/welampiot/dto/GroupDTO.java

@@ -28,6 +28,7 @@ public class GroupDTO {
     private Integer version;
     private Integer status;
     private Integer light;
+    private Integer addr;
     private Integer timezone;
     private Integer patrolInterval;
     private List<Integer> sectionList;

+ 32 - 0
src/main/java/com/welampiot/dto/PanelInfoDTO.java

@@ -0,0 +1,32 @@
+package com.welampiot.dto;
+
+import lombok.Data;
+
+@Data
+public class PanelInfoDTO {
+    private Integer id;
+
+    private String name;
+
+    private String address;
+
+    /** 网关地址 */
+    private String netAddress;
+
+    private String logTime;
+
+    /** 软件版本信息 */
+    private String softwareVersion;
+
+    /** 硬件版本信息 */
+    private String hardwareVersion;
+
+    /** 信号值 */
+    private Integer rssi;
+
+    private String createTime;
+    private String updateTime;
+    private Integer sectionId;
+    private Integer areaId;
+    private Integer online;
+}

+ 22 - 0
src/main/java/com/welampiot/dto/SceneDTO.java

@@ -0,0 +1,22 @@
+package com.welampiot.dto;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class SceneDTO {
+    /** 主键 */
+    private Integer id;
+    /** 情景ID */
+    private Integer nId;
+    private String name;
+    private String netAddress;
+    private Integer areaId;
+    private Integer sectionId;
+    private String area;
+    private String section;
+    private String createTime;
+    private String updateTime;
+    private List<SceneItemDTO> sceneItems;
+}

+ 15 - 0
src/main/java/com/welampiot/dto/SceneItemDTO.java

@@ -0,0 +1,15 @@
+package com.welampiot.dto;
+
+import lombok.Data;
+
+@Data
+public class SceneItemDTO {
+    private Integer id;
+    private Integer itemId;
+    private Integer sceneId;
+    private Integer groupId;
+    /** 情景类型(0 亮度模式,1 闪光,2 快速闪光,3 延迟开关灯,4 延迟开灯) */
+    private Integer type;
+    /** 亮度模式,value为亮度值,延迟模式,value为延迟时间(s),其他模式不使用value */
+    private Integer value;
+}

+ 2 - 1
src/main/java/com/welampiot/service/GroupService.java

@@ -23,5 +23,6 @@ public interface GroupService {
     GroupDTO getGroupDTOById(Integer id);
     void updateGroupLampId(GroupDTO dto);
     List<GroupDTO> getListByIds(@Param("ids") String[] ids);
-
+    GroupDTO getGroupAddrByGroupId(Integer id);
+    List<GroupDTO> getGroupListBySceneId(@Param("sceneId") Integer sceneId);
 }

+ 1 - 0
src/main/java/com/welampiot/service/LampService.java

@@ -71,4 +71,5 @@ public interface LampService {
     List<LampInfoDTO> getLampJoinLogList(Integer id);
     List<LampInfoDTO> getLampLocaltion(LampInfoDTO dto);
     LampInfoDTO getLampById(Integer id);
+    List<LampInfoDTO> getLampListByIdList(List<String> idList);
 }

+ 17 - 0
src/main/java/com/welampiot/service/PanelInfoService.java

@@ -0,0 +1,17 @@
+package com.welampiot.service;
+
+import com.welampiot.dto.PanelInfoDTO;
+import com.welampiot.vo.PanelInfoVO;
+
+import java.util.List;
+
+public interface PanelInfoService {
+    List<PanelInfoDTO> getPanelInfoListByPanelInfoVO(PanelInfoVO panelInfoVO);
+    Integer getPanelTotalByPanelInfoVO(PanelInfoVO panelInfoVO);
+    Integer getPanelOnlineTotalByPanelInfoVO(PanelInfoVO panelInfoVO);
+    void addPanelData(PanelInfoDTO panelInfoDTO);
+    void updatePanelData(PanelInfoDTO panelInfoDTO);
+    Integer checkPanelData(PanelInfoDTO panelInfoDTO);
+    void deletePanelDataById(Integer id);
+    PanelInfoDTO getPanelDetailsById(Integer id);
+}

+ 12 - 0
src/main/java/com/welampiot/service/SceneItemService.java

@@ -0,0 +1,12 @@
+package com.welampiot.service;
+
+import com.welampiot.dto.SceneItemDTO;
+
+import java.util.List;
+
+public interface SceneItemService {
+    List<SceneItemDTO> getSceneItemListBySceneId(Integer sceneId);
+    void deleteSceneItemDataBySceneId(Integer sceneId);
+    void addSceneItemData(SceneItemDTO sceneItemDTO);
+    void updateSceneItemData(SceneItemDTO sceneItemDTO);
+}

+ 19 - 0
src/main/java/com/welampiot/service/SceneService.java

@@ -0,0 +1,19 @@
+package com.welampiot.service;
+
+import com.welampiot.common.BaseResult;
+import com.welampiot.dto.SceneDTO;
+import com.welampiot.vo.SceneVO;
+
+import java.util.List;
+
+public interface SceneService {
+    List<SceneDTO> getSceneListBySceneVO(SceneVO sceneVO);
+    SceneDTO getSceneDetailsById(Integer id);
+    SceneDTO getSceneDetailsAndItemById(Integer id);
+    void delSceneDataById(Integer id);
+    boolean applyScene(Integer id);
+    void addSceneData(SceneDTO sceneDTO);
+    void updateSceneData(SceneDTO sceneDTO);
+    List<Integer> getSceneIdByNetAddress(String netAddress);
+    BaseResult<?> saveSceneDataBySceneVO(SceneVO sceneVO);
+}

+ 10 - 0
src/main/java/com/welampiot/service/impl/GroupServiceImpl.java

@@ -190,4 +190,14 @@ public class GroupServiceImpl implements GroupService {
     public List<GroupDTO> getListByIds(@Param("ids") String[] ids){
         return groupDao.getListByIds(ids);
     }
+
+    @Override
+    public GroupDTO getGroupAddrByGroupId(Integer id) {
+        return groupDao.getGroupAddrByGroupId(id);
+    }
+
+    @Override
+    public List<GroupDTO> getGroupListBySceneId(Integer sceneId) {
+        return groupDao.getGroupListBySceneId(sceneId);
+    }
 }

+ 5 - 0
src/main/java/com/welampiot/service/impl/LampServiceImpl.java

@@ -803,4 +803,9 @@ public class LampServiceImpl implements LampService {
     public LampInfoDTO getLampById(Integer id){
         return lampDao.getLampById(id);
     }
+
+    @Override
+    public List<LampInfoDTO> getLampListByIdList(List<String> idList) {
+        return lampDao.getLampListByIdList(idList);
+    }
 }

+ 57 - 0
src/main/java/com/welampiot/service/impl/PanelInfoServiceImpl.java

@@ -0,0 +1,57 @@
+package com.welampiot.service.impl;
+
+import com.welampiot.dao.PanelInfoDao;
+import com.welampiot.dto.PanelInfoDTO;
+import com.welampiot.service.PanelInfoService;
+import com.welampiot.vo.PanelInfoVO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+public class PanelInfoServiceImpl implements PanelInfoService {
+
+    @Autowired
+    private PanelInfoDao panelInfoDao;
+
+    @Override
+    public List<PanelInfoDTO> getPanelInfoListByPanelInfoVO(PanelInfoVO panelInfoVO) {
+        return panelInfoDao.getPanelInfoListByPanelInfoVO(panelInfoVO);
+    }
+
+    @Override
+    public Integer getPanelTotalByPanelInfoVO(PanelInfoVO panelInfoVO) {
+        return panelInfoDao.getPanelTotalByPanelInfoVO(panelInfoVO);
+    }
+
+    @Override
+    public Integer getPanelOnlineTotalByPanelInfoVO(PanelInfoVO panelInfoVO) {
+        return panelInfoDao.getPanelOnlineTotalByPanelInfoVO(panelInfoVO);
+    }
+
+    @Override
+    public void addPanelData(PanelInfoDTO panelInfoDTO) {
+        panelInfoDao.addPanelData(panelInfoDTO);
+    }
+
+    @Override
+    public void updatePanelData(PanelInfoDTO panelInfoDTO) {
+        panelInfoDao.updatePanelData(panelInfoDTO);
+    }
+
+    @Override
+    public Integer checkPanelData(PanelInfoDTO panelInfoDTO) {
+        return panelInfoDao.checkPanelData(panelInfoDTO);
+    }
+
+    @Override
+    public void deletePanelDataById(Integer id) {
+        panelInfoDao.deletePanelDataById(id);
+    }
+
+    @Override
+    public PanelInfoDTO getPanelDetailsById(Integer id) {
+        return panelInfoDao.getPanelDetailsById(id);
+    }
+}

+ 36 - 0
src/main/java/com/welampiot/service/impl/SceneItemServiceImpl.java

@@ -0,0 +1,36 @@
+package com.welampiot.service.impl;
+
+import com.welampiot.dao.SceneItemDao;
+import com.welampiot.dto.SceneItemDTO;
+import com.welampiot.service.SceneItemService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+public class SceneItemServiceImpl implements SceneItemService {
+
+    @Autowired
+    private SceneItemDao sceneItemDao;
+
+    @Override
+    public List<SceneItemDTO> getSceneItemListBySceneId(Integer sceneId) {
+        return sceneItemDao.getSceneItemListBySceneId(sceneId);
+    }
+
+    @Override
+    public void deleteSceneItemDataBySceneId(Integer sceneId) {
+        sceneItemDao.deleteSceneItemDataBySceneId(sceneId);
+    }
+
+    @Override
+    public void addSceneItemData(SceneItemDTO sceneItemDTO) {
+        sceneItemDao.addSceneItemData(sceneItemDTO);
+    }
+
+    @Override
+    public void updateSceneItemData(SceneItemDTO sceneItemDTO) {
+        sceneItemDao.updateSceneItemData(sceneItemDTO);
+    }
+}

+ 196 - 0
src/main/java/com/welampiot/service/impl/SceneServiceImpl.java

@@ -0,0 +1,196 @@
+package com.welampiot.service.impl;
+
+import com.welampiot.common.BaseResult;
+import com.welampiot.common.InterfaceResultEnum;
+import com.welampiot.controller.BaseController;
+import com.welampiot.dao.SceneDao;
+import com.welampiot.dto.GroupDTO;
+import com.welampiot.dto.LampInfoDTO;
+import com.welampiot.dto.SceneDTO;
+import com.welampiot.dto.SceneItemDTO;
+import com.welampiot.service.GroupService;
+import com.welampiot.service.LampService;
+import com.welampiot.service.SceneItemService;
+import com.welampiot.service.SceneService;
+import com.welampiot.utils.ToolUtils;
+import com.welampiot.vo.SceneVO;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+@Service
+public class SceneServiceImpl extends BaseController implements SceneService {
+
+    @Autowired
+    private SceneDao sceneDao;
+
+    @Autowired
+    private SceneItemService sceneItemService;
+
+    @Autowired
+    private GroupService groupService;
+
+    @Autowired
+    private LampService lampService;
+
+    @Autowired
+    private ToolUtils toolUtils;
+
+    @Override
+    public List<SceneDTO> getSceneListBySceneVO(SceneVO sceneVO) {
+        return sceneDao.getSceneListBySceneVO(sceneVO);
+    }
+
+    @Override
+    public SceneDTO getSceneDetailsById(Integer id) {
+        return sceneDao.getSceneDetailsById(id);
+    }
+
+    @Override
+    public SceneDTO getSceneDetailsAndItemById(Integer id) {
+        SceneDTO sceneDetails = sceneDao.getSceneDetailsById(id);
+        if (sceneDetails == null) return null;
+        List<SceneItemDTO> itemList = sceneItemService.getSceneItemListBySceneId(id);
+        sceneDetails.setSceneItems(itemList);
+        return sceneDetails;
+    }
+
+    @Override
+    public void delSceneDataById(Integer id) {
+        sceneItemService.deleteSceneItemDataBySceneId(id);
+        sceneDao.delSceneDataById(id);
+    }
+
+    @Override
+    public boolean applyScene(Integer id) {
+        SceneDTO sceneDTO = getSceneDetailsAndItemById(id);
+        if (sceneDTO == null) return false;
+        String netAddress = sceneDTO.getNetAddress();
+        Integer nId = sceneDTO.getNId();
+        boolean isSuccess = true;
+        for (SceneItemDTO item : sceneDTO.getSceneItems()) {
+            GroupDTO groupDTO = groupService.getGroupAddrByGroupId(item.getGroupId());
+            boolean b = toolUtils.changeScene(netAddress, groupDTO.getAddr(), nId);
+            if (!b) isSuccess = false;
+        }
+        return isSuccess;
+    }
+
+    @Override
+    public void addSceneData(SceneDTO sceneDTO) {
+        sceneDao.addSceneData(sceneDTO);
+    }
+
+    @Override
+    public void updateSceneData(SceneDTO sceneDTO) {
+        sceneDao.updateSceneData(sceneDTO);
+    }
+
+    @Override
+    public List<Integer> getSceneIdByNetAddress(String netAddress) {
+        return sceneDao.getSceneIdByNetAddress(netAddress);
+    }
+
+    @Override
+    public BaseResult<?> saveSceneDataBySceneVO(SceneVO sceneVO) {
+        BaseResult<?> baseResult = checkSceneData(sceneVO);
+        if (baseResult != null) return baseResult;
+
+        SceneDTO sceneDTO = new SceneDTO();
+        saveSceneData(sceneVO, sceneDTO);
+
+        // 同步情景到网关
+        setSceneData2Gateway(sceneDTO);
+
+        SceneVO sceneVO1 = new SceneVO();
+        sceneVO1.setId(sceneDTO.getId());
+        return toolUtils.response(InterfaceResultEnum.OPERATION_SUCCESS, sceneVO.getVersion(), sceneVO1);
+    }
+
+    /**
+     * 检查情景数据
+     */
+    private BaseResult<?> checkSceneData(SceneVO sceneVO) {
+        Integer version = sceneVO.getVersion();
+        if (sceneVO.getAreaId() == null || sceneVO.getAreaId() == 0)
+            return toolUtils.response(InterfaceResultEnum.LACK_AREA_ERROR, version);
+        if (sceneVO.getSectionId() == null || sceneVO.getSectionId() == 0)
+            return toolUtils.response(InterfaceResultEnum.LACK_SECTION_ERROR, version);
+        if (sceneVO.getName() == null || sceneVO.getName().trim().equals(""))
+            return toolUtils.response(InterfaceResultEnum.LACK_NAME_ERROR, version);
+        if (sceneVO.getNetAddress() == null || sceneVO.getNetAddress().trim().equals(""))
+            return toolUtils.response(InterfaceResultEnum.LACK_NET_ADDRESS_ERROR, version);
+        if (sceneVO.getSceneItemMap() == null || sceneVO.getSceneItemMap().size() == 0)
+            return toolUtils.response(InterfaceResultEnum.LACK_PARAM_ERROR, version);
+
+        List<SceneItemDTO> sceneItems = SceneVO.getSceneItemListByMap(sceneVO.getSceneItemMap());
+        sceneVO.setSceneItems(sceneItems);
+        List<Integer> groupIds = new ArrayList<>();
+        for (SceneItemDTO item : sceneItems) {
+            if (item.getGroupId() == 0) return toolUtils.response(InterfaceResultEnum.LACK_GROUP_ERROR, version);
+            if (groupIds.contains(item.getGroupId())) {
+                return toolUtils.response(InterfaceResultEnum.GROUP_REPEAT_ERROR, version);
+            } else {
+                groupIds.add(item.getGroupId());
+            }
+        }
+
+        return null;
+    }
+
+    /**
+     * 保存情景数据
+     */
+    private void saveSceneData(SceneVO sceneVO, SceneDTO sceneDTO) {
+        BeanUtils.copyProperties(sceneVO, sceneDTO);
+        String nowTime = ToolUtils.getNowTime();
+        sceneDTO.setUpdateTime(nowTime);
+        if (sceneVO.getId() != null && sceneVO.getId() != 0) {
+            // 修改
+            updateSceneData(sceneDTO);
+        } else {
+            // 新增
+            List<Integer> sceneIdList = getSceneIdByNetAddress(sceneVO.getNetAddress());
+            Integer sceneID = ToolUtils.generateSceneID(sceneIdList);
+            sceneDTO.setNId(sceneID);
+            sceneDTO.setCreateTime(nowTime);
+            addSceneData(sceneDTO);
+        }
+
+        Integer id = sceneDTO.getId();
+        for (SceneItemDTO item : sceneVO.getSceneItems()) {
+            item.setSceneId(id);
+            if (item.getId() != null && item.getId() != 0) {
+                sceneItemService.updateSceneItemData(item);
+            } else {
+                sceneItemService.addSceneItemData(item);
+            }
+        }
+    }
+
+    /**
+     * 设置场景数据到网关
+     */
+    public void setSceneData2Gateway(SceneDTO sceneDTO) {
+        List<GroupDTO> groupList = groupService.getGroupListBySceneId(sceneDTO.getId());
+        for (GroupDTO group : groupList) {
+            if (group.getLampId() == null || group.getLampId().trim().isEmpty()) continue;
+            EXECUTOR_SERVICE.submit(() -> submitGroupData(sceneDTO, group));
+        }
+    }
+
+    private void submitGroupData(SceneDTO sceneDTO, GroupDTO group) {
+        List<String> idList = Arrays.asList(group.getLampId().split(","));
+        List<LampInfoDTO> lampList = lampService.getLampListByIdList(idList);
+        for (LampInfoDTO lamp : lampList) {
+            EXECUTOR_SERVICE.submit(() -> {
+                boolean b = toolUtils.setSceneData(sceneDTO.getNetAddress(), lamp.getAddress(),
+                        sceneDTO.getNId(), lamp.getMode(), group.getType(), group.getValue());
+            });
+        }
+    }
+}

+ 140 - 0
src/main/java/com/welampiot/utils/ToolUtils.java

@@ -14,6 +14,7 @@ import com.welampiot.dto.*;
 import com.welampiot.handle.MqttHandler;
 import com.welampiot.service.*;
 import com.welampiot.vo.DevEnumVO;
+import com.welampiot.vo.PanelConfigVO;
 import io.ipdata.client.Ipdata;
 import io.ipdata.client.error.IpdataException;
 import io.ipdata.client.model.IpdataModel;
@@ -2298,6 +2299,145 @@ System.out.println(res);
         }
     }
 
+    /**
+     * 获取按键面板配置命令
+     */
+    public PanelConfigVO getPanelKeyParams(String netAddress, String mac, Integer keyNumber) {
+        int seq = getSeq();
+        String cmd = "{\"Seq\":" + seq + ",\"CmdType\":\"GetKeyParams\",\"DateTime\":\"" + getNowTime()
+                + "\",\"CmdData\":{\"Mac\":\"" + mac + "\",\"ID\":" + keyNumber + ",\"TransferMode\":0}}";
+        String sendTopic = "/MESHGW/commandIn/" + netAddress;
+        String backTopic = "/MESHGW/commandOut/" + netAddress;
+
+        String backResult = sendMqttCmd(sendTopic, cmd, backTopic);
+        PanelConfigVO panelConfigVO = new PanelConfigVO();
+        if (backResult.isEmpty()) return panelConfigVO;
+        JSONObject jsonObject = JSONObject.parseObject(backResult);
+        if (jsonObject.containsKey("CmdRsp")) {
+            JSONObject cmdRsp = (JSONObject) jsonObject.get("CmdRsp");
+            if (cmdRsp == null) return panelConfigVO;
+            String type = cmdRsp.getString("Type");
+            if (type == null) return panelConfigVO;
+            Integer typeInt = getPanelTypeInt(type);
+            Integer groupAddr = cmdRsp.getInteger("GroupAddr");
+            Integer sceneID = cmdRsp.getInteger("SceneID");
+            Integer eventID = cmdRsp.getInteger("EventID");
+            Integer bri = cmdRsp.getInteger("Bri");
+            Integer delay = cmdRsp.getInteger("Delay");
+            panelConfigVO.setType(typeInt);
+            panelConfigVO.setGroupId(groupAddr);
+            panelConfigVO.setSceneId(sceneID);
+            panelConfigVO.setEventId(eventID);
+            panelConfigVO.setLight(bri);
+            panelConfigVO.setDelay(delay);
+        }
+        return panelConfigVO;
+    }
+
+    /**
+     * 获取面板按键模式(0 情景,1 调光,2 呼吸,3 闪光,4 开灯后关灯,5 开灯,6 事件)
+     * @param str 按键模式字符串
+     */
+    private static Integer getPanelTypeInt(String str) {
+        switch (str) {
+            case "AdjustLight":
+                return 1;
+            case "FlashLight":
+                return 2;
+            case "FastFlash":
+                return 3;
+            case "DelayOnOff":
+                return 4;
+            case "DelayOn":
+                return 5;
+            case "TrigEvent":
+                return 6;
+            case "ChangeScene":
+            default:
+                return 0;
+        }
+    }
+
+    /**
+     * 检查2.4G网关返回结果
+     * @return 是否成功
+     */
+    private boolean check2p4BackResult(String backResult) {
+        if (backResult.isEmpty()) return false;
+        JSONObject jsonObject = JSONObject.parseObject(backResult);
+        if (!jsonObject.containsKey("CmdRsp")) return false;
+        JSONObject cmdRsp = (JSONObject) jsonObject.get("CmdRsp");
+        if (!cmdRsp.containsKey("Status")) return false;
+        int status = (int) cmdRsp.get("Status");
+        return status != 0;
+    }
+
+    /**
+     * 设置情景数据
+     * @param netAddress 网关地址
+     * @param mac        灯控mac地址
+     * @param sceneID    情景ID
+     * @param chn        (0 全部,1 A通道,2 B通道)
+     * @param mode       模式(0 亮度模式80,1 闪光84,2 快速闪光85,3 延时开关灯86,4 延时开灯87)
+     * @param value      亮度模式,value为亮度值,延迟模式,value为延迟时间(s),其他模式不使用value
+     */
+    public boolean setSceneData(String netAddress, String mac, Integer sceneID, Integer chn, Integer mode, Integer value) {
+        int seq = getSeq();
+        if (mode == 0) {
+            mode = 80;
+        } else if (mode == 1) {
+            mode = 84;
+        } else if (mode == 2) {
+            mode = 85;
+        } else if (mode == 3) {
+            mode = 86;
+        } else if (mode == 4) {
+            mode = 87;
+        }
+        String sceneData = "{\"ID\":"+sceneID+",\"Chn\":"+chn+",\"Mode\":" + mode + ",\"Data\":" + value + "}";
+        String cmd = "{\"Seq\":" + seq + ",\"CmdType\":\"SetSceneData\",\"DateTime\":\"" + getNowTime()
+                + "\",\"CmdData\":{\"Mac\":\"" + mac + "\",\"List\":[" + sceneData + "]}}";
+        String sendTopic = "/MESHGW/commandIn/" + netAddress;
+        String backTopic = "/MESHGW/commandOut/" + netAddress;
+
+        String backResult = sendMqttCmd(sendTopic, cmd, backTopic);
+        return check2p4BackResult(backResult);
+    }
+
+    /**
+     * 切换情景
+     * @param netAddress 网关地址
+     * @param groupAddr  分组短地址
+     * @param sceneID    情景ID
+     */
+    public boolean changeScene(String netAddress, Integer groupAddr, Integer sceneID) {
+        int seq = getSeq();
+        String cmd = "{\"Seq\":" + seq + ",\"CmdType\":\"ChangeScene\",\"DateTime\":\"" + getNowTime()
+                + "\",\"CmdData\":{\"Addr\":" + groupAddr + ",\"ID\":" + sceneID + "}}";
+        String sendTopic = "/MESHGW/commandIn/" + netAddress;
+        String backTopic = "/MESHGW/commandOut/" + netAddress;
+
+        String backResult = sendMqttCmd(sendTopic, cmd, backTopic);
+        return check2p4BackResult(backResult);
+    }
+
+    /**
+     * 生成场景ID
+     * @param sceneIDList 场景ID列表
+     * @return 场景ID
+     */
+    public static Integer generateSceneID(List<Integer> sceneIDList) {
+        if (sceneIDList == null || sceneIDList.isEmpty()) return 16;
+        Set<Integer> sceneIDSet = new HashSet<>(sceneIDList);
+        for (int i = 16; i <= 63; i++) {
+            if (!sceneIDSet.contains(i)) {
+                return i;
+            }
+        }
+
+        return 16;
+    }
+
     public static void main(String[] args) {
         System.out.println(getPublicIp());
         System.out.println(formatNumber(0.0));

+ 32 - 0
src/main/java/com/welampiot/vo/BaseVO.java

@@ -0,0 +1,32 @@
+package com.welampiot.vo;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class BaseVO {
+    private Integer page;
+    private Integer count;
+    private String keyword;
+    private Integer sectionId;
+    private Integer areaId;
+    private Integer online;
+    private String username;
+    private Integer version;
+    private List<Integer> sectionList;
+
+    public void setPageAndCount(Integer page, Integer count) {
+        if (count == null || count == 0) {
+            this.count = 20;
+        } else {
+            this.count = count;
+        }
+        if (page == null || page == 0) {
+            this.page = 1;
+        } else {
+            this.page = page;
+        }
+        this.page = (this.page - 1) * this.count;
+    }
+}

+ 16 - 0
src/main/java/com/welampiot/vo/PanelConfigVO.java

@@ -0,0 +1,16 @@
+package com.welampiot.vo;
+
+import lombok.Data;
+
+@Data
+public class PanelConfigVO {
+    /** 按键模式(0 情景,1 调光,2 呼吸,3 闪光,4 开灯后关灯,5 开灯,6 事件)*/
+    private Integer type;
+    private Integer groupId;
+    private Integer sceneId;
+    private Integer eventId;
+    /** 亮度值 */
+    private Integer light;
+    /** 延时开灯时间 */
+    private Integer delay;
+}

+ 26 - 0
src/main/java/com/welampiot/vo/PanelInfoVO.java

@@ -0,0 +1,26 @@
+package com.welampiot.vo;
+
+import com.welampiot.dto.PanelInfoDTO;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.List;
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class PanelInfoVO extends BaseVO {
+    private Integer total;
+    private Integer onlineTotal;
+    private List<PanelInfoDTO> list;
+
+    private Integer id;
+    private String name;
+    private String address;
+    /** 网关地址 */
+    private String netAddress;
+    private String createTime;
+    private String updateTime;
+    private Integer sectionId;
+    private Integer areaId;
+    private Integer keyNumber;
+}

+ 67 - 0
src/main/java/com/welampiot/vo/SceneVO.java

@@ -0,0 +1,67 @@
+package com.welampiot.vo;
+
+import com.welampiot.dto.SceneDTO;
+import com.welampiot.dto.SceneItemDTO;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class SceneVO extends BaseVO {
+    private Integer total;
+    private List<SceneDTO> list;
+
+    /** 主键 */
+    private Integer id;
+    /** 情景ID */
+    private Integer nId;
+    private String name;
+    private String netAddress;
+    private Integer areaId;
+    private Integer sectionId;
+    private String area;
+    private String section;
+    private String createTime;
+    private String updateTime;
+    private List<SceneItemDTO> sceneItems;
+    private List<Map<String, String>> sceneItemMap;
+
+    /**
+     * 根据Map集合获取SceneItemDTO集合
+     * @param sceneItemMap map集合
+     * @return SceneItemDTO集合
+     */
+    public static List<SceneItemDTO> getSceneItemListByMap(List<Map<String, String>> sceneItemMap) {
+        if (sceneItemMap == null || sceneItemMap.size() == 0) {
+            return new ArrayList<>();
+        }
+
+        List<SceneItemDTO> sceneItemList = new ArrayList<>();
+        for (Map<String, String> map : sceneItemMap) {
+            SceneItemDTO sceneItemDTO = new SceneItemDTO();
+            String itemId = map.get("itemId");
+            if (itemId == null || itemId.trim().isEmpty()) sceneItemDTO.setItemId(0);
+            else sceneItemDTO.setItemId(Integer.parseInt(itemId));
+
+            String groupId = map.get("groupId");
+            if (groupId == null || groupId.trim().isEmpty()) sceneItemDTO.setGroupId(0);
+            else sceneItemDTO.setGroupId(Integer.parseInt(groupId));
+
+            String type = map.get("type");
+            if (type == null || type.trim().isEmpty()) sceneItemDTO.setType(0);
+            else sceneItemDTO.setType(Integer.parseInt(type));
+
+            String value = map.get("value");
+            if (value == null || value.trim().isEmpty()) sceneItemDTO.setValue(0);
+            else sceneItemDTO.setValue(Integer.parseInt(value));
+
+            sceneItemList.add(sceneItemDTO);
+        }
+
+        return sceneItemList;
+    }
+}

+ 17 - 0
src/main/resources/mapper/GroupMapper.xml

@@ -215,4 +215,21 @@
         </trim>
 
     </select>
+
+    <select id="getGroupAddrByGroupId" resultType="com.welampiot.dto.GroupDTO">
+        select g.id,mgi.addr
+        from `group` g
+        left join mesh_group_info mgi on g.id = mgi.group_id
+        where g.id = #{id}
+        limit 1
+    </select>
+
+    <select id="getGroupListBySceneId" resultType="com.welampiot.dto.GroupDTO">
+        select g.id,g.name,g.lampid as lampId,g.devType,si.type,si.value
+        from `group` g
+        left join scene_item si on g.id = si.group_id
+        left join scene s on si.scene_id = s.id
+        where s.id = #{sceneId}
+    </select>
+
 </mapper>

+ 10 - 0
src/main/resources/mapper/LampMapper.xml

@@ -1383,4 +1383,14 @@
         from lampinfo
         where lamp_pole_id = #{id};
     </select>
+
+    <select id="getLampListByIdList" resultType="com.welampiot.dto.LampInfoDTO">
+        select l.id,l.name,l.address,l.mode
+        from lampinfo l
+        where l.id in
+        <foreach collection="idList" item="item" open="(" separator="," close=")">
+            #{item}
+        </foreach>
+    </select>
+
 </mapper>

+ 136 - 0
src/main/resources/mapper/PanelInfoMapper.xml

@@ -0,0 +1,136 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.welampiot.dao.PanelInfoDao">
+
+    <select id="getPanelInfoListByPanelInfoVO" resultType="com.welampiot.dto.PanelInfoDTO">
+        select p.id,p.name,p.address,p.area_id as areaId,p.section_id as sectionId,
+               p.online,p.rssi,p.software_version as softwareVersion,p.hardware_version as hardwareVersion,
+               p.update_time as updateTime
+        from panel_info p
+        where 1=1
+        <if test="sectionList != null and sectionList.isEmpty()">
+            and p.section_id in
+            <foreach collection="sectionList" item="item" open="(" separator="," close=")">
+                #{item}
+            </foreach>
+        </if>
+        <if test="areaId != null and areaId != 0">
+            and p.area_id = #{areaId}
+        </if>
+        <if test="sectionId != null and sectionId != 0">
+            and p.section_id = #{sectionId}
+        </if>
+        <if test="keyword != null and keyword != ''">
+            and (p.name like '%${keyword}%' or p.address like '%${keyword}%')
+        </if>
+        <if test="online != null and online == 0">
+            and p.online = 0
+        </if>
+        <if test="online != null and online == 1">
+            and p.online = 1
+        </if>
+        <if test="page != null and count != null">
+            limit #{page},#{count}
+        </if>
+    </select>
+
+    <select id="getPanelTotalByPanelInfoVO" resultType="Integer">
+        select count(*)
+        from panel_info p
+        where 1=1
+        <if test="sectionList != null and sectionList.isEmpty()">
+            and p.section_id in
+            <foreach collection="sectionList" item="item" open="(" separator="," close=")">
+                #{item}
+            </foreach>
+        </if>
+        <if test="areaId != null and areaId != 0">
+            and p.area_id = #{areaId}
+        </if>
+        <if test="sectionId != null and sectionId != 0">
+            and p.section_id = #{sectionId}
+        </if>
+    </select>
+
+    <select id="getPanelOnlineTotalByPanelInfoVO" resultType="Integer">
+        select count(*)
+        from panel_info p
+        where p.online = 1
+        <if test="sectionList != null and sectionList.isEmpty()">
+            and p.section_id in
+            <foreach collection="sectionList" item="item" open="(" separator="," close=")">
+                #{item}
+            </foreach>
+        </if>
+        <if test="areaId != null and areaId != 0">
+            and p.area_id = #{areaId}
+        </if>
+        <if test="sectionId != null and sectionId != 0">
+            and p.section_id = #{sectionId}
+        </if>
+    </select>
+
+    <insert id="addPanelData" parameterType="com.welampiot.dto.PanelInfoDTO" useGeneratedKeys="true" keyProperty="id">
+        insert into panel_info(
+        area_id,
+        section_id,
+        `name`,
+        address,
+        net_address,
+        create_time
+        )
+        values (
+        #{areaId},
+        #{sectionId},
+        #{name},
+        #{address},
+        #{netAddress},
+        now()
+        )
+    </insert>
+
+    <update id="updatePanelData" parameterType="com.welampiot.dto.PanelInfoDTO">
+        update panel_info
+        set area_id = #{areaId},
+            section_id = #{sectionId},
+            `name` = #{name},
+            address = #{address},
+            net_address = #{netAddress},
+            update_time = now()
+        where id = #{id}
+    </update>
+
+    <select id="checkPanelData" resultType="Integer">
+        select count(*)
+        from panel_info
+        where 1=1
+        <if test="address != null and address != ''">
+            and address = #{address}
+        </if>
+        <if test="areaId != null and areaId != 0">
+            and area_id = #{areaId}
+        </if>
+        <if test="name != null and name != ''">
+            and `name` = #{name}
+        </if>
+        <if test="sectionId != null and sectionId != 0">
+            and section_id = #{sectionId}
+        </if>
+        <if test="id != null and id != 0">
+            and id != #{id}
+        </if>
+    </select>
+
+    <delete id="deletePanelDataById">
+        delete from panel_info where id = #{id}
+    </delete>
+
+    <select id="getPanelDetailsById" resultType="com.welampiot.dto.PanelInfoDTO">
+        select p.id,p.name,p.address,p.area_id as areaId,p.section_id as sectionId,
+               p.online,p.rssi,p.software_version as softwareVersion,p.hardware_version as hardwareVersion,
+               p.update_time as updateTime
+        from panel_info p
+        where p.id = #{id}
+    </select>
+
+</mapper>

+ 28 - 0
src/main/resources/mapper/SceneItemMapper.xml

@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.welampiot.dao.SceneItemDao">
+
+    <select id="getSceneItemListBySceneId" resultType="com.welampiot.dto.SceneItemDTO">
+        select si.id as itemId,si.group_id as groupId,si.scene_id as sceneId,si.type,si.value
+        from scene_item si
+        where si.scene_id = #{sceneId}
+    </select>
+
+    <delete id="deleteSceneItemDataBySceneId">
+        delete from scene_item where scene_id = #{sceneId}
+    </delete>
+
+    <insert id="addSceneItemData" parameterType="com.welampiot.dto.SceneItemDTO" useGeneratedKeys="true" keyProperty="id">
+        insert into scene_item(group_id,scene_id,type,value)
+        values(#{groupId},#{sceneId},#{type},#{value})
+    </insert>
+
+    <update id="updateSceneItemData" parameterType="com.welampiot.dto.SceneItemDTO">
+        update scene_item
+        set group_id = #{groupId},
+            type = #{type},
+            `value` = #{value}
+        where id = #{id}
+    </update>
+
+</mapper>

+ 81 - 0
src/main/resources/mapper/SceneMapper.xml

@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.welampiot.dao.SceneDao">
+    
+    <select id="getSceneListBySceneVO" resultType="com.welampiot.dto.SceneDTO">
+        select s.id,s.name,s.n_id as nId,s.net_address as netAddress,
+               se.name as section,s.areaid as areaId,s.sectionid as sectionId
+        <choose>
+            <when test="version == 2">
+                ,gl.ru_name as area
+            </when>
+            <when test="version == 1">
+                ,gl.english_name as area
+            </when>
+            <otherwise>
+                ,gl.chinese_name as area
+            </otherwise>
+        </choose>
+        from scene s
+        left join section se on s.sectionid = se.id
+        left join global_location gl on s.areaid = gl.id
+        where 1=1
+        <if test="sectionList != null and sectionList.isEmpty()">
+            and s.sectionid in
+            <foreach collection="sectionList" item="item" open="(" separator="," close=")">
+                #{item}
+            </foreach>
+        </if>
+        <if test="areaId != null and areaId != 0">
+            and s.areaid = #{areaId}
+        </if>
+        <if test="sectionId != null and sectionId != 0">
+            and s.sectionid = #{sectionId}
+        </if>
+        <if test="keyword != null and keyword != ''">
+            and s.name like '%${keyword}%'
+        </if>
+        <if test="page != null and count != null">
+            limit #{page},#{count}
+        </if>
+    </select>
+
+    <select id="getSceneDetailsById" resultType="com.welampiot.dto.SceneDTO">
+        select s.id,s.name,s.areaid as areaId,s.sectionid as sectionId,s.net_address as netAddress,
+               s.n_id as nId,s.create_time as createTime,s.update_time as updateTime
+        from scene s
+        where s.id = #{id}
+    </select>
+
+    <delete id="delSceneDataById">
+        delete from scene where id = #{id}
+    </delete>
+
+    <insert id="addSceneData" parameterType="com.welampiot.dto.SceneDTO" keyProperty="id" useGeneratedKeys="true">
+        insert into scene (`name`,areaid,sectionid,net_address,n_id,create_time,update_time)
+        values (#{name},#{areaId},#{sectionId},#{netAddress},#{nId},#{createTime},#{updateTime})
+    </insert>
+
+    <update id="updateSceneData" parameterType="com.welampiot.dto.SceneDTO">
+        update
+            scene s
+        set
+            s.name = #{name},
+            s.areaid = #{areaId},
+            s.sectionid = #{sectionId},
+            s.net_address = #{netAddress},
+            s.update_time = #{updateTime}
+        where
+            s.id = #{id}
+    </update>
+
+    <select id="getSceneIdByNetAddress" parameterType="java.lang.String">
+        select
+            id
+        from
+            scene
+        where
+            net_address = #{netAddress}
+    </select>
+
+</mapper>