|
@@ -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());
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|