소스 검색

Merge remote-tracking branch 'origin/master'

zhangcl 3 일 전
부모
커밋
ab61bcc630

+ 6 - 1
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/IotDeviceController.java

@@ -487,7 +487,9 @@ public class IotDeviceController {
         }
         //连油设备
         devicePageReqVO.setProductId(649L);
-        List<String> codes = yfDeviceService.getDevicePage(devicePageReqVO).getList().stream().map(YfDeviceDO::getSerialNumber).collect(Collectors.toList());
+        List<YfDeviceDO> list = yfDeviceService.getDevicePage(devicePageReqVO).getList();
+        List<String> codes = list.stream().map(YfDeviceDO::getSerialNumber).collect(Collectors.toList());
+//        List<String> codes = yfDeviceService.getDevicePage(devicePageReqVO).getList().stream().map(YfDeviceDO::getSerialNumber).collect(Collectors.toList());
         PageResult<IotDeviceDO> pageResult = iotDeviceService.getIotDeviceTdPage(pageReqVO, codes);
         if (CollUtil.isEmpty(pageResult.getList())) {
             return success(new PageResult<>(pageResult.getTotal()));
@@ -501,6 +503,9 @@ public class IotDeviceController {
             iotDeviceRespVO.setAssetClassName(iotProductClassify.getName());
             DeptRespDTO dept = deptApi.getDept(iotDeviceRespVO.getDeptId());
             iotDeviceRespVO.setDeviceName(Objects.nonNull(dept)?dept.getName()+" "+iotDeviceRespVO.getDeviceName():iotDeviceRespVO.getDeviceName());
+            list.stream().filter(e -> e.getSerialNumber().equals(iotDeviceRespVO.getDeviceCode())).findFirst().ifPresent(e ->{
+                iotDeviceRespVO.setMqttUrl("/"+e.getProductId()+"/"+iotDeviceRespVO.getDeviceCode()+"/property/post");
+            });
         }
 
         return success(result);

+ 3 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/qhse/measure/vo/IotMeasureDetectRespVO.java

@@ -54,4 +54,7 @@ public class IotMeasureDetectRespVO {
     private String measureName;
     private String measureCode;
     private String deptName;
+
+    @Schema(description = "检测附件")
+    private String file;
 }

+ 4 - 3
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/qhse/measure/vo/IotMeasureDetectSaveReqVO.java

@@ -1,9 +1,7 @@
 package cn.iocoder.yudao.module.pms.controller.admin.qhse.measure.vo;
 
 import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.*;
-import java.util.*;
-import org.springframework.format.annotation.DateTimeFormat;
+import lombok.Data;
 
 import javax.validation.constraints.NotEmpty;
 import javax.validation.constraints.NotNull;
@@ -46,4 +44,7 @@ public class IotMeasureDetectSaveReqVO {
     @Schema(description = "检测/检验标准")
     @NotEmpty(message = "检测/检验标准不能为空")
     private String detectStandard;
+
+    @Schema(description = "检测附件")
+    private String file;
 }

+ 20 - 2
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/yanfan/sip/handler/req/RegisterReqHandler.java

@@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.pms.controller.admin.yanfan.sip.handler.req;
 
 import cn.iocoder.yudao.framework.tenant.core.util.TenantUtils;
 import cn.iocoder.yudao.module.pms.controller.admin.yanfan.sip.SipDate;
+import cn.iocoder.yudao.module.pms.controller.admin.yanfan.sip.handler.IReqHandler;
 import cn.iocoder.yudao.module.pms.controller.admin.yanfan.utils.DigestAuthUtil;
 import cn.iocoder.yudao.module.pms.dal.dataobject.yanfan.device.YfIotDeviceDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.yanfan.sip.config.IotSipConfigDO;
@@ -13,11 +14,13 @@ import cn.iocoder.yudao.module.pms.service.yanfan.config.SysSipConfig;
 import cn.iocoder.yudao.module.pms.service.yanfan.device.YfIotDeviceService;
 import cn.iocoder.yudao.module.pms.service.yanfan.sip.IGBListener;
 import cn.iocoder.yudao.module.pms.service.yanfan.sip.IMqttService;
-import cn.iocoder.yudao.module.pms.controller.admin.yanfan.sip.handler.IReqHandler;
 import cn.iocoder.yudao.module.pms.service.yanfan.sip.MessageInvoker;
 import cn.iocoder.yudao.module.pms.service.yanfan.sip.config.IotSipConfigService;
 import cn.iocoder.yudao.module.pms.service.yanfan.sip.device.YfSipDeviceService;
 import cn.iocoder.yudao.module.pms.service.yanfan.sip.device.channel.YfSipDeviceChannelService;
+import com.google.common.cache.Cache;
+import com.google.common.cache.CacheBuilder;
+import com.google.common.util.concurrent.RateLimiter;
 import gov.nist.javax.sip.address.AddressImpl;
 import gov.nist.javax.sip.address.SipUri;
 import gov.nist.javax.sip.header.Expires;
@@ -41,6 +44,8 @@ import java.time.LocalDateTime;
 import java.util.Calendar;
 import java.util.List;
 import java.util.Locale;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.TimeUnit;
 
 @Slf4j
 @Component
@@ -74,6 +79,12 @@ public class RegisterReqHandler extends ReqAbstractHandler implements Initializi
     @Autowired
     private YfSipDeviceChannelMapper yfSipDeviceChannelMapper;
 
+    // 类内定义本地缓存,记录sipId的401请求次数和限流器
+    private Cache<String, RateLimiter> sipIdRateLimiterCache = CacheBuilder.newBuilder()
+            .expireAfterWrite(5, TimeUnit.MINUTES) // 5分钟过期
+            .maximumSize(1000) // 最多缓存1000个设备
+            .build();
+
     @Override
     public void processMsg(RequestEvent evt) {
         TenantUtils.executeIgnore(() -> {
@@ -93,7 +104,12 @@ public class RegisterReqHandler extends ReqAbstractHandler implements Initializi
                     AuthorizationHeader authorhead = (AuthorizationHeader) request.getHeader(AuthorizationHeader.NAME);
                     // 校验密码是否正确
                     if (authorhead == null && !ObjectUtils.isEmpty(sipConfig.getPassword())) {
-                        log.info("未携带授权头 回复401,sipId:"+ sipId);
+                        // 获取该sipId的限流器(每秒最多打印1条日志,避免刷屏)
+                        RateLimiter limiter = sipIdRateLimiterCache.get(sipId, () -> RateLimiter.create(1.0));
+                        if (limiter.tryAcquire()) { // 限流控制:每秒仅1次打印日志
+                            log.info("未携带授权头 回复401,sipId:"+ sipId);
+                        }
+                        // 401响应逻辑不变
                         response = getMessageFactory().createResponse(Response.UNAUTHORIZED, request);
                         new DigestAuthUtil().generateChallenge(getHeaderFactory(), response, sipConfig.getDomain());
                         getServerTransaction(evt).sendResponse(response);
@@ -191,6 +207,8 @@ public class RegisterReqHandler extends ReqAbstractHandler implements Initializi
                 }
             } catch (SipException | InvalidArgumentException | NoSuchAlgorithmException | ParseException e) {
                 e.printStackTrace();
+            } catch (ExecutionException e) {
+                throw new RuntimeException(e);
             }
         });
     }

+ 7 - 5
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/dataobject/qhse/measure/IotMeasureDetectDO.java

@@ -1,12 +1,12 @@
 package cn.iocoder.yudao.module.pms.dal.dataobject.qhse.measure;
 
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+import com.baomidou.mybatisplus.annotation.KeySequence;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
 import lombok.*;
-import java.util.*;
-import java.time.LocalDateTime;
-import java.time.LocalDateTime;
+
 import java.time.LocalDateTime;
-import com.baomidou.mybatisplus.annotation.*;
-import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
 
 /**
  * 计量器具-检测校准明细 DO
@@ -64,4 +64,6 @@ public class IotMeasureDetectDO extends BaseDO {
      * 证书编码
      */
     private String measureCertNo;
+
+    private String file;
 }