浏览代码

优化设施导入,websocket同租户群发告警

hanzhengyi 1 年之前
父节点
当前提交
0740efd618

+ 16 - 7
service-iot/service-iot-biz/src/main/java/com/usky/iot/service/config/websocket/WebSocket.java

@@ -10,6 +10,8 @@ import javax.websocket.Session;
 import javax.websocket.server.PathParam;
 import javax.websocket.server.ServerEndpoint;
 import java.io.IOException;
+import java.util.Iterator;
+import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 
 @ServerEndpoint(value = "/websocket/{userId}")
@@ -21,13 +23,20 @@ public class WebSocket {
 
     //新增一个方法用于主动向客户端发送消息
     public void sendMessage(Object message, String userId) {
-        WebSocket webSocket = webSocketMap.get(userId);
-        if (webSocket != null) {
-            try {
-                webSocket.session.getBasicRemote().sendText(JSONUtil.toJsonStr(message));
-                System.out.println("【websocket消息】发送消息成功,用户=" + userId + ",消息内容" + message.toString());
-            } catch (IOException e) {
-                e.printStackTrace();
+        Iterator<Map.Entry<String, WebSocket>> iterator = webSocketMap.entrySet().iterator();
+        while (iterator.hasNext()) {
+            Map.Entry<String, WebSocket> entry = iterator.next();
+            int index = entry.getKey().indexOf(",");
+            String result = entry.getKey().substring(0, index);
+            if (result.equals(userId)){
+                if (entry.getValue() != null) {
+                    try {
+                        entry.getValue().session.getBasicRemote().sendText(JSONUtil.toJsonStr(message));
+                        System.out.println("【websocket消息】发送消息成功,用户=" + userId + ",消息内容" + message.toString());
+                    } catch (IOException e) {
+                        e.printStackTrace();
+                    }
+                }
             }
         }
     }

+ 30 - 20
service-iot/service-iot-biz/src/main/java/com/usky/iot/service/impl/BaseAlarmServiceImpl.java

@@ -9,11 +9,8 @@ import com.usky.common.core.exception.BusinessException;
 import com.usky.common.security.utils.SecurityUtils;
 import com.usky.iot.domain.*;
 import com.usky.iot.mapper.BaseAlarmMapper;
-import com.usky.iot.service.BaseAlarmService;
+import com.usky.iot.service.*;
 import com.usky.common.mybatis.core.AbstractCrudService;
-import com.usky.iot.service.BaseFacilityDeviceService;
-import com.usky.iot.service.DmpDeviceInfoService;
-import com.usky.iot.service.DmpProductInfoService;
 import com.usky.iot.service.config.websocket.WebSocket;
 import com.usky.iot.service.vo.BaseAlarmListVO;
 import com.usky.iot.service.vo.BaseAlarmRequestVO;
@@ -48,6 +45,9 @@ public class BaseAlarmServiceImpl extends AbstractCrudService<BaseAlarmMapper, B
     @Autowired
     private WebSocket webSocket;
 
+    @Autowired
+    private BaseAlarmTypeService baseAlarmTypeService;
+
     @Override
     public CommonPage<BaseAlarmResponeVO> statistic(BaseAlarmRequestVO baseAlarmRequestVO){
 
@@ -222,38 +222,48 @@ public class BaseAlarmServiceImpl extends AbstractCrudService<BaseAlarmMapper, B
     @Override
     public boolean add(BaseAlarm baseAlarm) {
         baseAlarm.setHandleStatus(0);
-        if (StringUtils.isNotBlank(baseAlarm.getProductCode()) && StringUtils.isNotBlank(baseAlarm.getDeviceId())){
+        if (StringUtils.isNotBlank(baseAlarm.getProductCode()) && StringUtils.isNotBlank(baseAlarm.getDeviceId()) && StringUtils.isNotBlank(baseAlarm.getAlarmType())){
             LambdaQueryWrapper<DmpProductInfo> lambdaQuery = Wrappers.lambdaQuery();
-            lambdaQuery.eq(StringUtils.isNotBlank(baseAlarm.getProductCode()),DmpProductInfo::getProductCode,baseAlarm.getProductCode())
+            lambdaQuery.eq(DmpProductInfo::getProductCode,baseAlarm.getProductCode())
                     .eq(DmpProductInfo::getDeleteFlag,0);
             List<DmpProductInfo> records = dmpProductInfoService.list(lambdaQuery);
             LambdaQueryWrapper<BaseFacilityDevice> lambdaQuery1 = Wrappers.lambdaQuery();
-            lambdaQuery1.eq(StringUtils.isNotBlank(baseAlarm.getDeviceId()),BaseFacilityDevice::getDeviceId,
-                    baseAlarm.getDeviceId());
+            lambdaQuery1.eq(BaseFacilityDevice::getDeviceId,baseAlarm.getDeviceId());
             List<BaseFacilityDevice> records1 = baseFacilityDeviceService.list(lambdaQuery1);
-            if(records.size()>0){
+            LambdaQueryWrapper<DmpDeviceInfo> lambdaQuery2 = Wrappers.lambdaQuery();
+            lambdaQuery2.eq(DmpDeviceInfo::getDeviceId,baseAlarm.getDeviceId())
+                    .eq(DmpDeviceInfo::getProductCode,baseAlarm.getProductCode())
+                    .eq(DmpDeviceInfo::getDeleteFlag,0);
+            List<DmpDeviceInfo> records2 = dmpDeviceInfoService.list(lambdaQuery2);
+            LambdaQueryWrapper<BaseAlarmType> lambdaQuery3 = Wrappers.lambdaQuery();
+            lambdaQuery3.eq(BaseAlarmType::getTypeCode,baseAlarm.getAlarmType())
+                    .eq(BaseAlarmType::getDeleteFlag,0);
+            List<BaseAlarmType> records3 = baseAlarmTypeService.list(lambdaQuery3);
+            if(records.size()>0 && records3.size()>0 && records2.size()>0){
                 baseAlarm.setTenantId(records.get(0).getTenantId());
-                if (StringUtils.isNotBlank(baseAlarm.getHandleBy()) || StringUtils.isNotBlank(baseAlarm.getHandlePhone())){
+                if (StringUtils.isNotBlank(baseAlarm.getHandleBy()) || StringUtils.isNotBlank(baseAlarm.getHandlePhone())) {
                     baseAlarm.setHandleStatus(1);
                     LambdaQueryWrapper<BaseAlarm> queryWrapper = Wrappers.lambdaQuery();
-                    queryWrapper.eq(BaseAlarm::getDeviceId,baseAlarm.getDeviceId())
-                            .eq(BaseAlarm::getAlarmType,baseAlarm.getAlarmType())
-                            .eq(BaseAlarm::getAlarmAddress,baseAlarm.getAlarmAddress())
-                            .eq(BaseAlarm::getAlarmGrade,baseAlarm.getAlarmGrade());
-                    return this.update(baseAlarm,queryWrapper);
-                }else {
+                    queryWrapper.eq(BaseAlarm::getDeviceId, baseAlarm.getDeviceId())
+                            .eq(BaseAlarm::getAlarmType, baseAlarm.getAlarmType())
+                            .eq(BaseAlarm::getAlarmAddress, baseAlarm.getAlarmAddress())
+                            .eq(BaseAlarm::getAlarmGrade, baseAlarm.getAlarmGrade());
+                    return this.update(baseAlarm, queryWrapper);
+                } else {
                     boolean saveResult = this.save(baseAlarm);
-                    if(records1.size()>0){
+                    if (records1.size() > 0) {
                         baseAlarm.setFacilityId(records1.get(0).getFacilityId());
                     }
-                    webSocket.sendMessage(baseAlarm,records.get(0).getTenantId().toString());
+                    baseAlarm.setDeviceName(records2.get(0).getDeviceName());
+                    baseAlarm.setTypeImg(records3.get(0).getTypeImg());
+                    webSocket.sendMessage(baseAlarm, records.get(0).getTenantId().toString());
                     return saveResult;
                 }
             }else {
-                throw new BusinessException("告警数据投递失败,产品编码有误");
+                throw new BusinessException("告警数据投递失败,请检查产品编码、设备编号、告警类型,是否有误");
             }
         }else {
-            throw new BusinessException("告警数据投递失败,产品编码或设备编号不能为空");
+            throw new BusinessException("告警数据投递失败,请检查产品编码、设备编号、告警类型,不能为空");
         }
     }
 }

+ 69 - 26
service-iot/service-iot-biz/src/main/java/com/usky/iot/service/impl/BaseGgpFacilityServiceImpl.java

@@ -31,6 +31,8 @@ import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.interceptor.TransactionAspectSupport;
 import org.springframework.web.multipart.MultipartFile;
 
+import java.io.IOException;
+import java.io.InputStream;
 import java.text.SimpleDateFormat;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
@@ -409,40 +411,81 @@ public class BaseGgpFacilityServiceImpl extends AbstractCrudService<BaseGgpFacil
         return list;
     }
 
+//    @Override
+//    public void facilityImport(MultipartFile multipartFile) {
+//        ImportParams params = new ImportParams();
+//        params.setHeadRows(1);
+//        params.setTitleRows(1);
+//        String err="文件导入失败";
+//        try {
+//            List<FacilityImportVo> facilityImportVos = ExcelImportUtil.importExcel(multipartFile.getInputStream(),
+//                    FacilityImportVo.class, params);
+//            if (CollectionUtils.isNotEmpty(facilityImportVos)){
+//                int rot=0;
+//                for (FacilityImportVo facilityImportVo:facilityImportVos) {
+//                    BaseGgpFacility baseGgpFacility = BeanMapperUtils.map(facilityImportVo, BaseGgpFacility.class);
+//                    if (StringUtils.isBlank(baseGgpFacility.getFacilityType())||StringUtils.isBlank(baseGgpFacility.getFacilityName())||StringUtils.isBlank(baseGgpFacility.getAddress())||StringUtils.isBlank(baseGgpFacility.getLatitude())||StringUtils.isBlank(baseGgpFacility.getLongitude())){
+//                        int h=rot+3;
+//                        err="文件导入失败,第"+h+"行数据导入失败,必填字段不能为空";
+//                        throw  new BusinessException(err);
+//                    }
+//                    try{
+//                        this.add(baseGgpFacility);
+//                    }catch (Exception e){
+//                        int h=rot+3;
+//                        err="文件导入失败,第"+h+"行数据导入失败";
+//                        throw  new BusinessException(err);
+//                    }
+//                    rot++;
+//                }
+//            }else {
+//                err="文件不能为空";
+//                throw new BusinessException(err);
+//            }
+//        }catch (Exception e){
+//            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+//            throw  new BusinessException(err);
+//        }
+//    }
+
     @Override
     public void facilityImport(MultipartFile multipartFile) {
+        String FILE_IMPORT_FAILED = "文件导入失败";
+        String FILE_EMPTY = "文件不能为空";
+        String ROW_IMPORT_FAILED = "第%d行数据导入失败";
+
         ImportParams params = new ImportParams();
         params.setHeadRows(1);
         params.setTitleRows(1);
-        String err="文件导入失败";
-        try {
-            List<FacilityImportVo> facilityImportVos = ExcelImportUtil.importExcel(multipartFile.getInputStream(),
-                    FacilityImportVo.class, params);
-            if (CollectionUtils.isNotEmpty(facilityImportVos)){
-                int rot=0;
-                for (FacilityImportVo facilityImportVo:facilityImportVos) {
-                    BaseGgpFacility baseGgpFacility = BeanMapperUtils.map(facilityImportVo, BaseGgpFacility.class);
-                    if (StringUtils.isBlank(baseGgpFacility.getFacilityType())||StringUtils.isBlank(baseGgpFacility.getFacilityName())||StringUtils.isBlank(baseGgpFacility.getAddress())||StringUtils.isBlank(baseGgpFacility.getLatitude())||StringUtils.isBlank(baseGgpFacility.getLongitude())){
-                        int h=rot+3;
-                        err="文件导入失败,第"+h+"行数据导入失败,必填字段不能为空";
-                        throw  new BusinessException(err);
-                    }
-                    try{
-                        this.add(baseGgpFacility);
-                    }catch (Exception e){
-                        int h=rot+3;
-                        err="文件导入失败,第"+h+"行数据导入失败";
-                        throw  new BusinessException(err);
-                    }
-                    rot++;
+
+        try (InputStream inputStream = multipartFile.getInputStream()) {
+            List<BaseGgpFacility> facilityList = new ArrayList<>();
+            List<FacilityImportVo> facilityImportVos = ExcelImportUtil.importExcel(inputStream, FacilityImportVo.class, params);
+            if (CollectionUtils.isEmpty(facilityImportVos)) {
+                throw new BusinessException(FILE_EMPTY);
+            }
+
+            for (int i = 0; i < facilityImportVos.size(); i++) {
+                FacilityImportVo facilityImportVo = facilityImportVos.get(i);
+                BaseGgpFacility baseGgpFacility = BeanMapperUtils.map(facilityImportVo, BaseGgpFacility.class);
+                if (isBlank(baseGgpFacility.getFacilityType()) || isBlank(baseGgpFacility.getFacilityName()) || isBlank(baseGgpFacility.getAddress()) || isBlank(baseGgpFacility.getLatitude()) || isBlank(baseGgpFacility.getLongitude())) {
+                    throw new BusinessException(String.format(ROW_IMPORT_FAILED, i + 1));
                 }
-            }else {
-                err="文件不能为空";
-                throw new BusinessException(err);
+                facilityList.add(baseGgpFacility);
+            }
+            try {
+                this.saveBatch(facilityList);
+            } catch (Exception e) {
+                throw new BusinessException(FILE_IMPORT_FAILED);
             }
-        }catch (Exception e){
+        } catch (Exception e) {
+            log.error("文件导入失败", e);
             TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
-            throw  new BusinessException(err);
+            throw new BusinessException(FILE_IMPORT_FAILED);
         }
     }
+
+    private boolean isBlank(String str) {
+        return StringUtils.isBlank(str) || StringUtils.isBlank(str.trim());
+    }
 }