Forráskód Böngészése

changed 通知模板改为集群配置

18339543638 3 éve
szülő
commit
482f7ebaef

+ 9 - 6
jetlinks-components/network-component/network-core/src/main/java/org/jetlinks/community/netpump/DataUtils.java

@@ -1,11 +1,8 @@
 package org.jetlinks.community.netpump;
 
+import cn.hutool.core.util.HexUtil;
 import cn.hutool.core.util.StrUtil;
-import com.alibaba.fastjson.JSON;
-import com.alibaba.fastjson.JSONObject;
-
 import java.util.*;
-import java.util.concurrent.atomic.DoubleAccumulator;
 
 /**
  * 数据处理与判断
@@ -50,10 +47,11 @@ public class DataUtils {
 
     // 设置 长包 接收数据
     public static String getLongContent(String content,Map<String, Object> propertiesMap ,Map<String, Object> eventsMap,String deviceId){
-        // 泵号   [2-9]字节
+
+        //数字编码 0-1
         String dataNum = getContent(content,0,4);
         propertiesMap.put("dataNum",dataNum);
-
+        // 泵号   [2-9]字节
 //        String pumpCode = getContent(content,4,20);
         String pumpCode=deviceId;
         propertiesMap.put("pumpCode",pumpCode);
@@ -156,4 +154,9 @@ public class DataUtils {
         return pumpCode;
     }
 
+    public static void main(String[] args) {
+        String s = "00F0";
+        System.out.println(Long.parseUnsignedLong(s, 16));
+        System.out.println(HexUtil.encodeHexStr("240"));
+    }
 }

+ 3 - 0
jetlinks-components/notify-component/notify-core/src/main/java/org/jetlinks/community/notify/DefaultNotifierManager.java

@@ -1,9 +1,12 @@
 package org.jetlinks.community.notify;
 
 import lombok.extern.slf4j.Slf4j;
+import org.jetlinks.core.config.ConfigStorageManager;
 import org.jetlinks.core.event.EventBus;
 import org.springframework.beans.BeansException;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.config.BeanPostProcessor;
+import org.springframework.cache.CacheManager;
 import org.springframework.stereotype.Component;
 import reactor.core.publisher.Mono;
 

+ 43 - 16
jetlinks-components/notify-component/notify-core/src/main/java/org/jetlinks/community/notify/template/AbstractTemplateManager.java

@@ -1,9 +1,14 @@
 package org.jetlinks.community.notify.template;
 
+import lombok.Getter;
 import org.jetlinks.community.notify.NotifyType;
+import org.jetlinks.core.config.ConfigStorage;
+import org.jetlinks.core.config.ConfigStorageManager;
+import org.springframework.beans.factory.annotation.Autowired;
 import reactor.core.publisher.Mono;
 
 import javax.annotation.Nonnull;
+import javax.annotation.PostConstruct;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 
@@ -11,42 +16,64 @@ public abstract class AbstractTemplateManager implements TemplateManager {
 
     protected Map<String, Map<String, TemplateProvider>> providers = new ConcurrentHashMap<>();
 
-    protected Map<String, Template> templates = new ConcurrentHashMap<>();
+//    protected Map<String, Template> templates = new ConcurrentHashMap<>();
+
+    @Autowired
+    private ConfigStorageManager configStorageManager;
+
+    @Getter
+    public Mono<ConfigStorage> configStorage;
 
     protected abstract Mono<TemplateProperties> getProperties(NotifyType type, String id);
 
     protected void register(TemplateProvider provider) {
         providers.computeIfAbsent(provider.getType().getId(), ignore -> new ConcurrentHashMap<>())
-                 .put(provider.getProvider().getId(), provider);
+            .put(provider.getProvider().getId(), provider);
     }
 
+    @PostConstruct
+    public void init(){
+      configStorage = configStorageManager.getStorage("template");
+    }
     @Override
     @Nonnull
     public Mono<? extends Template> createTemplate(@Nonnull NotifyType type, @Nonnull TemplateProperties prop) {
         return Mono.justOrEmpty(providers.get(type.getId()))
-                   .switchIfEmpty(Mono.error(() -> new UnsupportedOperationException("不支持的通知类型:" + prop.getType())))
-                   .flatMap(map -> Mono.justOrEmpty(map.get(prop.getProvider()))
-                                       .switchIfEmpty(Mono.error(() -> new UnsupportedOperationException("不支持的服务商:" + prop
-                                           .getProvider())))
-                                       .flatMap(provider -> provider.createTemplate(prop)));
+            .switchIfEmpty(Mono.error(() -> new UnsupportedOperationException("不支持的通知类型:" + prop.getType())))
+            .flatMap(map -> Mono.justOrEmpty(map.get(prop.getProvider()))
+                .switchIfEmpty(Mono.error(() -> new UnsupportedOperationException("不支持的服务商:" + prop
+                    .getProvider())))
+                .flatMap(provider -> provider.createTemplate(prop)));
     }
 
     @Nonnull
     @Override
     public Mono<? extends Template> getTemplate(@Nonnull NotifyType type, @Nonnull String id) {
-        return Mono.justOrEmpty(templates.get(id))
-                   .switchIfEmpty(Mono.defer(() -> this
-                       .getProperties(type, id)
-                       .flatMap(prop -> this.createTemplate(type, prop))
-                       .doOnNext(temp -> templates.put(id, temp))
-                       .switchIfEmpty(Mono.error(() -> new UnsupportedOperationException("通知类型不支持:" + type
-                           .getId())))
-                   ));
+        return  configStorage.flatMap(storage->storage.getConfig(id))
+            .flatMap(value -> Mono.just(value.as(Template.class)))
+            .switchIfEmpty(Mono.defer(() -> this
+                    .getProperties(type, id)
+                    .flatMap(prop -> this.createTemplate(type, prop))
+                    .zipWith(configStorage)
+                    .flatMap(tp2-> tp2.getT2().setConfig(id,tp2.getT1()).thenReturn(tp2.getT1()))
+//                .doOnNext(temp -> templates.put(id, temp))
+                    .switchIfEmpty(Mono.error(() -> new UnsupportedOperationException("通知类型不支持:" + type
+                        .getId())))
+            ));
+//        return Mono.justOrEmpty(templates.get(id))
+//                   .switchIfEmpty(Mono.defer(() -> this
+//                       .getProperties(type, id)
+//                       .flatMap(prop -> this.createTemplate(type, prop))
+//                       .doOnNext(temp -> templates.put(id, temp))
+//                       .switchIfEmpty(Mono.error(() -> new UnsupportedOperationException("通知类型不支持:" + type
+//                           .getId())))
+//                   ));
     }
 
     @Override
     @Nonnull
     public Mono<Void> reload(String templateId) {
-        return Mono.fromRunnable(() -> templates.remove(templateId));
+        return configStorage.flatMap(storage->storage.remove(templateId)).then();
+//        return Mono.fromRunnable(() -> templates.remove(templateId));
     }
 }

+ 2 - 1
jetlinks-components/notify-component/notify-webhook/src/main/java/org/jetlinks/community/notify/webhook/WebHookNotifier.java

@@ -2,6 +2,7 @@ package org.jetlinks.community.notify.webhook;
 
 import cn.hutool.http.HttpRequest;
 import cn.hutool.http.HttpResponse;
+import cn.hutool.http.HttpStatus;
 import cn.hutool.http.HttpUtil;
 import cn.hutool.json.JSONUtil;
 import lombok.Getter;
@@ -101,7 +102,7 @@ public class WebHookNotifier extends AbstractNotifier<WebHookTemplate> {
                     request.setReadTimeout(Long.valueOf(TimeUnit.SECONDS.toMillis(template.getReadTimeout())).intValue());
                     request.setConnectionTimeout(Long.valueOf(TimeUnit.SECONDS.toMillis(template.getConnectionTimeout())).intValue());
                     HttpResponse response = request.execute();
-                    if (200!=response.getStatus()) {
+                    if (HttpStatus.HTTP_OK !=response.getStatus()) {
                         return Mono.error(new BusinessException(response.body()));
                     }
                 }catch (Exception e){

+ 37 - 11
jetlinks-manager/notify-manager/src/main/java/org/jetlinks/community/notify/manager/web/NotifierTemplateController.java

@@ -2,22 +2,22 @@ package org.jetlinks.community.notify.manager.web;
 
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;
-import org.hswebframework.web.authorization.annotation.Authorize;
-import org.hswebframework.web.authorization.annotation.QueryAction;
-import org.hswebframework.web.authorization.annotation.Resource;
+import org.hswebframework.ezorm.rdb.mapping.defaults.SaveResult;
+import org.hswebframework.web.authorization.Authentication;
+import org.hswebframework.web.authorization.annotation.*;
 import org.hswebframework.web.crud.service.ReactiveCrudService;
 import org.hswebframework.web.crud.web.reactive.ReactiveServiceCrudController;
 import org.jetlinks.community.notify.manager.entity.NotifyTemplateEntity;
 import org.jetlinks.community.notify.manager.service.NotifyTemplateService;
+import org.jetlinks.community.notify.template.AbstractTemplateManager;
 import org.jetlinks.community.notify.template.TemplateProvider;
 import org.jetlinks.core.metadata.ConfigMetadata;
-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 org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
 import reactor.core.publisher.Flux;
 import reactor.core.publisher.Mono;
 
+import java.time.Duration;
 import java.util.List;
 
 /**
@@ -36,10 +36,35 @@ public class NotifierTemplateController implements ReactiveServiceCrudController
 
     private final List<TemplateProvider> providers;
 
+    private final AbstractTemplateManager templateManager;
 
-    public NotifierTemplateController(NotifyTemplateService templateService, List<TemplateProvider> providers) {
+    public NotifierTemplateController(NotifyTemplateService templateService, List<TemplateProvider> providers,
+                                      AbstractTemplateManager templateManager) {
         this.templateService = templateService;
         this.providers = providers;
+        this.templateManager=templateManager;
+    }
+
+    @PatchMapping("/save")
+    @SaveAction
+    @Operation(summary = "修改模板信息")
+    public Mono<SaveResult> updateOrSave(@RequestBody Flux<NotifyTemplateEntity> payload) {
+        return this.templateService
+            .save(payload)
+            .flatMap(result->
+                payload.flatMap(entity->templateManager.reload(entity.getId()))
+                    .then(Mono.just(result))
+            );
+    }
+
+    @DeleteMapping("/delete/{id}")
+    @DeleteAction
+    @Operation(summary = "删除模板信息")
+    public Mono<Void> deleteById(@PathVariable("id") String id) {
+        return templateManager.reload(id)
+            .flatMap(ignore->templateService.deleteById(id).then())
+            .mergeWith(Mono.fromRunnable(()->Mono.delay(Duration.ofSeconds(1)).flatMap(__->templateManager.reload(id)).subscribe()))
+            .then();
     }
 
     @Override
@@ -49,15 +74,16 @@ public class NotifierTemplateController implements ReactiveServiceCrudController
 
 
 
+
     @GetMapping("/{type}/{provider}/config/metadata")
     @QueryAction
     @Operation(summary = "获取指定类型和服务商所需模版配置定义")
     public Mono<ConfigMetadata> getAllTypes(@PathVariable String type,
                                             @PathVariable String provider) {
         return Flux.fromIterable(providers)
-                .filter(prov -> prov.getType().getId().equalsIgnoreCase(type) && prov.getProvider().getId().equalsIgnoreCase(provider))
-                .flatMap(prov -> Mono.justOrEmpty(prov.getTemplateConfigMetadata()))
-                .next();
+            .filter(prov -> prov.getType().getId().equalsIgnoreCase(type) && prov.getProvider().getId().equalsIgnoreCase(provider))
+            .flatMap(prov -> Mono.justOrEmpty(prov.getTemplateConfigMetadata()))
+            .next();
     }
 
 }