Browse Source

样本库系统融合将预警的代码迁移合并

chenminghua 2 years ago
parent
commit
582b5bf08f
48 changed files with 3647 additions and 0 deletions
  1. 9 0
      gyee-sample-impala/src/main/java/com/gyee/impala/common/config/GyeeConfig.java
  2. 110 0
      gyee-sample-impala/src/main/java/com/gyee/impala/common/spring/SpringContextUtil.java
  3. 20 0
      gyee-sample-impala/src/main/java/com/gyee/impala/controller/sample/warning/Alertrule2Controller.java
  4. 53 0
      gyee-sample-impala/src/main/java/com/gyee/impala/mapper/slave/Alertrule2Mapper.java
  5. 121 0
      gyee-sample-impala/src/main/java/com/gyee/impala/model/slave/Alertrule2.java
  6. 23 0
      gyee-sample-impala/src/main/java/com/gyee/impala/model/slave/Datadictionary.java
  7. 36 0
      gyee-sample-impala/src/main/java/com/gyee/impala/model/slave/Equipmentmodel.java
  8. 68 0
      gyee-sample-impala/src/main/java/com/gyee/impala/model/slave/WindPowerStation.java
  9. 229 0
      gyee-sample-impala/src/main/java/com/gyee/impala/service/impl/slave/Alertrule2Service.java
  10. 2 0
      gyee-sample-impala/src/main/resources/application.yaml
  11. 278 0
      gyee-sample-impala/src/main/resources/mapper/slave/Alertrule2Mapper.xml
  12. 1 0
      pom.xml
  13. 108 0
      power-fetting/pom.xml
  14. 26 0
      power-fetting/src/main/java/com/gyee/power/fetting/BootApplication.java
  15. 205 0
      power-fetting/src/main/java/com/gyee/power/fetting/MapperGenerator.java
  16. 102 0
      power-fetting/src/main/java/com/gyee/power/fetting/common/base/ExcludeQueryWrapper.java
  17. 22 0
      power-fetting/src/main/java/com/gyee/power/fetting/common/config/CorsConfig.java
  18. 16 0
      power-fetting/src/main/java/com/gyee/power/fetting/common/config/GyeeConfig.java
  19. 29 0
      power-fetting/src/main/java/com/gyee/power/fetting/common/config/datasource/DataSourceConfig.java
  20. 58 0
      power-fetting/src/main/java/com/gyee/power/fetting/common/exception/AdviceException.java
  21. 23 0
      power-fetting/src/main/java/com/gyee/power/fetting/common/exception/CustomException.java
  22. 24 0
      power-fetting/src/main/java/com/gyee/power/fetting/common/feign/IAdapterService.java
  23. 31 0
      power-fetting/src/main/java/com/gyee/power/fetting/common/feign/RemoteServiceBuilder.java
  24. 67 0
      power-fetting/src/main/java/com/gyee/power/fetting/common/result/JsonResult.java
  25. 88 0
      power-fetting/src/main/java/com/gyee/power/fetting/common/result/ResultCode.java
  26. 19 0
      power-fetting/src/main/java/com/gyee/power/fetting/common/spring/ExitDisposable.java
  27. 152 0
      power-fetting/src/main/java/com/gyee/power/fetting/common/spring/InitialRunner.java
  28. 110 0
      power-fetting/src/main/java/com/gyee/power/fetting/common/spring/SpringContextUtil.java
  29. 124 0
      power-fetting/src/main/java/com/gyee/power/fetting/common/util/Base64Util.java
  30. 14 0
      power-fetting/src/main/java/com/gyee/power/fetting/common/util/CollectUtil.java
  31. 509 0
      power-fetting/src/main/java/com/gyee/power/fetting/common/util/DateUtil.java
  32. 152 0
      power-fetting/src/main/java/com/gyee/power/fetting/common/util/FileUtil.java
  33. 26 0
      power-fetting/src/main/java/com/gyee/power/fetting/common/util/JudeSystem.java
  34. 90 0
      power-fetting/src/main/java/com/gyee/power/fetting/common/util/NumberUtil.java
  35. 162 0
      power-fetting/src/main/java/com/gyee/power/fetting/common/util/SnowFlakeUtil.java
  36. 45 0
      power-fetting/src/main/java/com/gyee/power/fetting/common/util/TokenGenerator.java
  37. 19 0
      power-fetting/src/main/java/com/gyee/power/fetting/mapper/WindpowerstationMapper.java
  38. 19 0
      power-fetting/src/main/java/com/gyee/power/fetting/mapper/WindturbineMapper.java
  39. 96 0
      power-fetting/src/main/java/com/gyee/power/fetting/model/Windpowerstation.java
  40. 72 0
      power-fetting/src/main/java/com/gyee/power/fetting/model/Windturbine.java
  41. 34 0
      power-fetting/src/main/java/com/gyee/power/fetting/model/custom/TsDoubleData.java
  42. 25 0
      power-fetting/src/main/java/com/gyee/power/fetting/service/WindpowerstationService.java
  43. 24 0
      power-fetting/src/main/java/com/gyee/power/fetting/service/WindturbineService.java
  44. 40 0
      power-fetting/src/main/java/com/gyee/power/fetting/service/impl/WindpowerstationServiceImpl.java
  45. 40 0
      power-fetting/src/main/java/com/gyee/power/fetting/service/impl/WindturbineServiceImpl.java
  46. 64 0
      power-fetting/src/main/resources/application.yaml
  47. 35 0
      power-fetting/src/main/resources/mapper/WindpowerstationMapper.xml
  48. 27 0
      power-fetting/src/main/resources/mapper/WindturbineMapper.xml

+ 9 - 0
gyee-sample-impala/src/main/java/com/gyee/impala/common/config/GyeeConfig.java

@@ -2,6 +2,7 @@ package com.gyee.impala.common.config;
 
 import com.gyee.impala.common.util.JudeSystem;
 import lombok.Data;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.boot.context.properties.ConfigurationProperties;
 import org.springframework.stereotype.Component;
 
@@ -43,6 +44,10 @@ public class GyeeConfig {
     /***故障诊断数据存储路径  linux*/
     private String diagnoseFileLinux;
 
+    /*** 报警规则是否加密 */
+    private boolean ruleEncryption;
+
+
 
 
     private String templatePath;
@@ -104,4 +109,8 @@ public class GyeeConfig {
     public void setDiagnoseFile(String diagnoseFile) {
         this.diagnoseFile = diagnoseFile;
     }
+
+    public boolean getRuleEncryption(){
+        return ruleEncryption;
+    }
 }

+ 110 - 0
gyee-sample-impala/src/main/java/com/gyee/impala/common/spring/SpringContextUtil.java

@@ -0,0 +1,110 @@
+package com.gyee.impala.common.spring;
+
+import org.springframework.beans.BeansException;
+import org.springframework.beans.factory.DisposableBean;
+import org.springframework.beans.factory.NoSuchBeanDefinitionException;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.ApplicationContextAware;
+import org.springframework.stereotype.Component;
+
+@Component
+public class SpringContextUtil implements ApplicationContextAware, DisposableBean {
+
+    private static ApplicationContext applicationContext = null;
+
+    /***
+     * 当继承了ApplicationContextAware类之后,那么程序在调用 getBean(String)的时候会自动调用该方法, 不用自己操作
+     */
+    @Override
+    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
+        SpringContextUtil.applicationContext = applicationContext;
+    }
+
+    /**
+     * 实现DisposableBean接口, 在Context关闭时清理静态变量.
+     */
+    @Override
+    public void destroy() throws Exception {
+        SpringContextUtil.clearHolder();
+    }
+
+    /**
+     * 取得存储在静态变量中的ApplicationContext.
+     */
+    public static ApplicationContext getApplicationContext() {
+        return applicationContext;
+    }
+
+    /***
+     * 根据一个bean的id获取配置文件中相应的bean
+     *
+     * @param name
+     * @return
+     * @throws BeansException
+     */
+    @SuppressWarnings("unchecked")
+    public static <T> T getBean(String name) throws BeansException {
+        return (T) applicationContext.getBean(name);
+    }
+
+    /***
+     * 类似于getBean(String name)只是在参数中提供了需要返回到的类型。
+     *
+     * @param name
+     * @param requiredType
+     * @return
+     * @throws BeansException
+     */
+    public static <T> T getBean(Class<T> requiredType) throws BeansException {
+        return applicationContext.getBean(requiredType);
+    }
+
+    /**
+     * 如果BeanFactory包含一个与所给名称匹配的bean定义,则返回true
+     *
+     * @param name
+     * @return boolean
+     */
+    public static boolean containsBean(String name) {
+        return applicationContext.containsBean(name);
+    }
+
+    /**
+     * 判断以给定名字注册的bean定义是一个singleton还是一个prototype。
+     * 如果与给定名字相应的bean定义没有被找到,将会抛出一个异常(NoSuchBeanDefinitionException)
+     *
+     * @param name
+     * @return boolean
+     * @throws NoSuchBeanDefinitionException
+     */
+    public static boolean isSingleton(String name) throws NoSuchBeanDefinitionException {
+        return applicationContext.isSingleton(name);
+    }
+
+    /**
+     * @param name
+     * @return Class 注册对象的类型
+     * @throws NoSuchBeanDefinitionException
+     */
+    public static Class<?> getType(String name) throws NoSuchBeanDefinitionException {
+        return applicationContext.getType(name);
+    }
+
+    /**
+     * 如果给定的bean名字在bean定义中有别名,则返回这些别名
+     *
+     * @param name
+     * @return
+     * @throws NoSuchBeanDefinitionException
+     */
+    public static String[] getAliases(String name) throws NoSuchBeanDefinitionException {
+        return applicationContext.getAliases(name);
+    }
+
+    /**
+     * 清除SpringContextHolder中的ApplicationContext为Null.
+     */
+    public static void clearHolder() {
+        applicationContext = null;
+    }
+}

+ 20 - 0
gyee-sample-impala/src/main/java/com/gyee/impala/controller/sample/warning/Alertrule2Controller.java

@@ -0,0 +1,20 @@
+package com.gyee.impala.controller.sample.warning;
+
+import lombok.extern.slf4j.Slf4j;
+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.RestController;
+
+/**
+ * 自定义规则接口
+ */
+@Slf4j
+@RestController
+@RequestMapping("/alertrule2")
+@CrossOrigin
+public class Alertrule2Controller {
+
+//    @Autowired
+//    private Alertrule2Service alertrule2Service;
+}

+ 53 - 0
gyee-sample-impala/src/main/java/com/gyee/impala/mapper/slave/Alertrule2Mapper.java

@@ -0,0 +1,53 @@
+package com.gyee.impala.mapper.slave;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.gyee.impala.model.slave.Alertrule2;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+@Mapper
+public interface Alertrule2Mapper extends BaseMapper<Alertrule2> {
+
+    IPage<Alertrule2> pageQueryAll(Page page,
+                                   @Param("name") String name,
+                                   @Param("station") String station,
+                                   @Param("modelId")String modelId,
+                                   @Param("rank")String rank,
+                                   @Param("category")String category,
+                                   @Param("enabled") String enabled,
+                                   @Param("relatedparts")String relatedparts);
+
+    Integer getMaxEdnaValue();
+
+    List<Alertrule2> getAllByStationIdAndModelId(@Param("idString") String idString);
+
+    List<Alertrule2> getAllByStationIdAndModelId2(
+            @Param("station") String station,
+            @Param("modelid") String modelId
+    );
+
+
+    List<Alertrule2> getById(@Param("idString") String idString);
+
+    List<Alertrule2> queryTree();
+
+    List<Map<String, Alertrule2>> quertByrelatedParts(String relatedParts);
+
+    List<Alertrule2> queryMap();
+
+    int updateByAlertrule2Id(Alertrule2 alertrule2);
+
+    Alertrule2 selectByAlertrule2Id(String id);
+
+
+    int insertAlerture2(Alertrule2 alertrule2);
+
+//    List<Alertrule2> selectByExample(Alertrule2Example example);
+
+}
+

+ 121 - 0
gyee-sample-impala/src/main/java/com/gyee/impala/model/slave/Alertrule2.java

@@ -0,0 +1,121 @@
+package com.gyee.impala.model.slave;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.gyee.impala.common.config.GyeeConfig;
+import com.gyee.impala.common.spring.SpringContextUtil;
+import lombok.AccessLevel;
+import lombok.Data;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+@TableName("ALERTRULE2")
+public class Alertrule2 implements Serializable {
+
+    @TableId("id")
+    private String id;
+   
+    @TableField("Name")
+    private String name;
+    @JSONField(serialize=false,deserialize = false) //不序列化
+    @TableField("description")
+    private String description;
+    @JSONField(serialize=false,deserialize = false)//不序列化
+    //("表达式")
+    @TableField("expression")
+    private String expression;
+    //("标签")
+    @TableField("tag")
+    private String tag;
+    //("报警级别")
+    @TableField("rank")
+    private String rank;
+    //("是否启用")
+    @TableField("enabled")
+    private int enabled;
+    //("风机类型")
+    @TableField("modelId")
+    private String modelId;
+    //("ednavlue")
+    @TableField("ednaValue")
+    private int ednaValue;
+    //("类别")
+    @TableField("category")
+    private String category;
+    //("range范围")
+    @TableField("range")
+    private String range;
+    //("场站")
+    @TableField("station")
+    private String station;
+    //("风机")
+    @TableField("windturbine")
+    private String windturbine;
+    //("线路")
+    @TableField("line")
+    private String line;
+    //("项目")
+    @TableField("project")
+    private String project;
+    //("电气")
+    @TableField("electrical")
+    private String electrical;
+    //("任务开始事件")
+    @TableField("taskstart")
+    private String taskstart;
+    @TableField("relatedParts")
+    //("关联部件")
+    private String relatedParts;//关联部件
+    @TableField(exist = false)
+    private String userName;//操作人
+    //("操作时间")
+    @TableField("createtime")
+    private Date createtime;//操作时间
+    //前端显示字段 防止报警规则泄漏
+    @TableField(exist = false)
+    @Setter(AccessLevel.NONE)
+    @Getter(AccessLevel.NONE)
+    private String descriptionShow;
+    //前端显示字段 防止报警规则泄漏
+    @TableField(exist = false)
+    @Setter(AccessLevel.NONE)
+    @Getter(AccessLevel.NONE)
+    private String expressionShow;
+
+    private WindPowerStation windPowerStation;
+    private Datadictionary datadictionary;
+
+    public  String getDescriptionShow(){
+        GyeeConfig bean = SpringContextUtil.getBean(GyeeConfig.class);
+        boolean ruleEncryption = bean.getRuleEncryption();
+        if(ruleEncryption&&"1".equals(this.range))
+            return "***********";
+        else
+            return this.description;
+
+    }
+    public String getExpressionShow(){
+        GyeeConfig bean = SpringContextUtil.getBean(GyeeConfig.class);
+        boolean ruleEncryption = bean.getRuleEncryption();
+        if(ruleEncryption&&"1".equals(this.range))
+            return "***********";
+        else
+            return this.expression;
+    }
+
+    public void setDescriptionShow(String descriptionShow){
+        this.description=descriptionShow;
+        this.descriptionShow=descriptionShow;
+    }
+
+    public void setExpressionShow(String expression){
+        this.expression=expression;
+        this.expressionShow=expression;
+    }
+}

+ 23 - 0
gyee-sample-impala/src/main/java/com/gyee/impala/model/slave/Datadictionary.java

@@ -0,0 +1,23 @@
+package com.gyee.impala.model.slave;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+@Data
+@TableName("DATADICTIONARY")
+public class Datadictionary {
+    @TableId("ID")
+    private int id;
+    @TableField("CATEGORY")
+    private String category;
+    @TableField("CODE")
+    private String code;
+    @TableField("NAME")
+    private String name;
+    @TableField("ORDERNO")
+    private int orderno;
+    @TableField("ENABLED")
+    private int enabled;
+}

+ 36 - 0
gyee-sample-impala/src/main/java/com/gyee/impala/model/slave/Equipmentmodel.java

@@ -0,0 +1,36 @@
+package com.gyee.impala.model.slave;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+@Data
+@TableName("EQUIPMENTMODEL")
+public class Equipmentmodel {
+    @TableId("ID")
+    private String id;
+    @TableId("CODE")
+    private String code;
+    @TableId("NAME")
+    private String name;
+    @TableId("DESCRIPTION")
+    private String desciripition;
+    @TableId("POWERPRODUCTION")
+    private long powerproduction;
+    @TableId("CUTINWINDSPEED")
+    private long cutinwindspeed;
+    @TableId("RATEDWINDSPEED")
+    private long ratedwindspeed;
+    @TableId("CUTOUTWINDSPEED")
+    private String cutoutwindspeed;
+    @TableId("WINDTURBINEMANUFACTURERID")
+    private String windturbinemanufacturerid;
+    @TableId("PHOTO")
+    private String photo;
+    @TableId("UNIT")
+    private String unit;
+    @TableId("SWEPTAREA")
+    private long sweptarea;
+    @TableId("EQUIPMENTCATEGORY")
+    private long equipmentcategory;
+}

+ 68 - 0
gyee-sample-impala/src/main/java/com/gyee/impala/model/slave/WindPowerStation.java

@@ -0,0 +1,68 @@
+package com.gyee.impala.model.slave;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+
+import java.io.Serializable;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * 场站实体类
+ */
+public class WindPowerStation implements Serializable {
+
+    @TableId("ID")
+    private String id;
+
+    @TableField("NAME")
+    private String name;
+
+    @TableField("MODEL")
+    private String model;
+
+    private List<Equipmentmodel> Equipmentmodel;
+
+    private List<String> modelList;
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getModel() {
+        return model;
+    }
+
+    public void setModel(String model) {
+        this.model = model;
+        this.modelList = Arrays.asList(model.split("/"));
+    }
+
+    public List<String> getModelList() {
+        return modelList;
+    }
+
+    public void setModelList(List<String> modelList) {
+        this.modelList = modelList;
+    }
+
+    public List<Equipmentmodel> getEquipmentmodel() {
+        return Equipmentmodel;
+    }
+
+    public void setEquipmentmodel(List<Equipmentmodel> equipmentmodel) {
+        Equipmentmodel = equipmentmodel;
+    }
+}

+ 229 - 0
gyee-sample-impala/src/main/java/com/gyee/impala/service/impl/slave/Alertrule2Service.java

@@ -0,0 +1,229 @@
+package com.gyee.impala.service.impl.slave;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.gyee.impala.mapper.slave.Alertrule2Mapper;
+import com.gyee.impala.model.slave.Alertrule2;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+@Service
+@Slf4j
+public class Alertrule2Service extends ServiceImpl<Alertrule2Mapper, Alertrule2> {
+    Logger logger = LogManager.getLogger();
+
+    @Autowired
+    private Alertrule2Mapper alertrule2Mapper;
+
+//    @Autowired
+//    private LogService logService;
+//
+//    @Autowired
+//    private RuleUpdateEventService eventService;
+
+
+
+//    public int saveAndUpdateAlertrule2(Alertrule2 alertrule2,String userName) {
+//
+//        int result = 0;
+//        Alertrule2 oldRule2=null;
+//        if (StringUtils.isBlank(alertrule2.getId())) {
+//            //生成id,生成规则为HD+自增数
+////            String station = StringUtils.substringBefore(alertrule2.getStation(), "_");
+//            Integer maxEdnaValue = alertrule2Mapper.getMaxEdnaValue();
+//            int max = maxEdnaValue + 1;
+//            String first="";
+//            String[] s = alertrule2.getStation().split("_");
+//            if(s.length>1)
+//                first=s[0];
+//            String newId = first+"_"+ max;
+//            //验证生成的id是否已存在
+//            List<Alertrule2> selectList = alertrule2Mapper.getById(newId);
+//            if (selectList.size() > 0) {
+//                return -999;
+//            }
+//
+//            if (maxEdnaValue == 0) {
+//                logger.error("获取最大EdnaValue失败");
+//                return 0;
+//            } else {
+//                Integer nextEdnaValue = maxEdnaValue + 1;
+//                alertrule2.setId(newId);
+//
+//                alertrule2.setEdnaValue(nextEdnaValue);
+//                alertrule2.setCreatetime(DateUtils.getNowDate());
+//                result = alertrule2Mapper.insertAlerture2(alertrule2);
+//                if (result > 0) {
+//                    logService.alertRuleAddLog(alertrule2, alertrule2.getUserName());
+//                }
+//            }
+//
+//        } else {
+//            oldRule2 = alertrule2Mapper.selectByAlertrule2Id(alertrule2.getId());
+//            if (oldRule2 != null) {
+//                result = alertrule2Mapper.updateByAlertrule2Id(alertrule2);
+//                if (result > 0) {
+//                    logService.alertRuleUpdateLog(oldRule2, alertrule2, alertrule2.getUserName());
+//                }
+//            }
+//        }
+//        if(result>0) {
+//            int i = eventService.saveEventAlertRule(alertrule2, oldRule2,userName);
+//        }
+//        return result;
+//    }
+//
+//    public int deleteAlertrule2(Alertrule2 alertrule2) {
+//        return alertrule2Mapper.deleteById(alertrule2.getId());
+//    }
+//
+//    public IPage<Alertrule2> pageQueryAll(Page page, String name, String station, String modelId, String rank, String category, String enabled, String relatedparts) {
+//        return alertrule2Mapper.pageQueryAll(page, name,station,modelId,rank,category,enabled,relatedparts);
+//    }
+//
+//    //根据场站风机型号生成最新自定义报警规则ID
+//    public String createNextId(String station, String model) {
+//        String nextId = "";
+//        String idString = station + model;
+//        //获取同一个风场同一个型号的所有规则列表
+//        List<Alertrule2> lst = alertrule2Mapper.getAllByStationIdAndModelId(idString);
+//
+//        String maxId = Collections.max(lst.stream().map(Alertrule2::getId).collect(Collectors.toList()));
+//
+//        int maxNum = Integer.parseInt(maxId.substring(2, 5));
+//        int incrementId = 0;
+//        incrementId = maxNum + 1;
+//        if (incrementId < 100) {
+//            nextId = "ZX" + "0" + incrementId + station + model;
+//
+//        } else {
+//            nextId = "ZX" + incrementId + station + model;
+//
+//        }
+//
+//        return nextId;
+//    }
+//
+//
+//
+//    public List<Alertrule2> queryTree() {
+//        List<Alertrule2> dsList = alertrule2Mapper.queryTree();
+//        return dsList;
+//    }
+//
+//    //首页风机部件查询
+//    public Map<String,Integer> queryList(String station, String modelId) {
+//        Map<String,Integer> map2 = new HashMap<>();
+//        map2.put("CLX",0);
+//        map2.put("YP",0);
+//        map2.put("YY",0);
+//        map2.put("BJXT",0);
+//        map2.put("PHXT",0);
+//        map2.put("BPXT",0);
+//        map2.put("CFXT",0);
+//        map2.put("ZZ",0);
+//        map2.put("FDJ",0);
+//        map2.put("QT",0);
+//
+//        List<Alertrule2> dslist = alertrule2Mapper.getAllByStationIdAndModelId2(station,modelId);
+//        map2.put("SUM",dslist.size());
+//        for(Alertrule2 ar : dslist) {
+//            int cnt= 0;
+//            switch (ar.getRelatedParts()) {
+//                case "CLX":
+//                    cnt = map2.get("CLX").intValue();
+//                    map2.put("CLX", ++cnt);
+//                    break;
+//                case "YP":
+//                    cnt = map2.get("YP").intValue();
+//                    map2.put("YP", ++cnt);
+//                    break;
+//                case "YY":
+//                    cnt = map2.get("YY").intValue();
+//                    map2.put("YY", ++cnt);
+//                    break;
+//                case "BJXT":
+//                    cnt = map2.get("BJXT").intValue();
+//                    map2.put("BJXT", ++cnt);
+//                    break;
+//                case "PHXT":
+//                    cnt = map2.get("PHXT").intValue();
+//                    map2.put("PHXT", ++cnt);
+//                    break;
+//                case "BPXT":
+//                    cnt = map2.get("BPXT").intValue();
+//                    map2.put("BPXT",++cnt);
+//                    break;
+//                case "CFXT":
+//                    cnt = map2.get("CFXT").intValue();
+//                    map2.put("CFXT", ++cnt);
+//                    break;
+//                case "ZZ":
+//                    cnt = map2.get("ZZ").intValue();
+//                    map2.put("ZZ", ++cnt);
+//                    break;
+//                case "FDJ":
+//                    cnt = map2.get("FDJ").intValue();
+//                    map2.put("FDJ",++cnt);
+//                    break;
+//                default:
+//                    cnt = map2.get("QT").intValue();
+//                    map2.put("QT", ++cnt);
+//                    break;
+//            }
+//        }
+//        return map2;
+//    }
+//
+//
+//    public List<Map<String, Alertrule2>> queryTree2(String relatedParts) {
+//        List<Map<String, Alertrule2>> dsList = alertrule2Mapper.quertByrelatedParts(relatedParts);
+//        return dsList;
+//    }
+//
+//    public List<Map<String, Alertrule2>> queryMap() {
+//        List<Map<String, Alertrule2>> alertrule2Map = new ArrayList<>();
+//        List<Alertrule2> alertrule = alertrule2Mapper.queryMap();
+//        if (alertrule != null && alertrule.size() > 0) {
+//            List<Map<String, Alertrule2>> alertrule2Map2 = new ArrayList<>();
+//            for (Alertrule2 alertrule2 : alertrule) {
+//                alertrule2.getRelatedParts();
+//                alertrule2.getName();
+//                alertrule2Map2 = queryTree2(alertrule2.getRelatedParts());
+//                alertrule2Map.addAll(alertrule2Map2);
+//            }
+//        }
+//        return alertrule2Map;
+//    }
+//
+//    public List<String> getUniformCodeByNameAndStation(String name, String station, String modelid){
+//        Alertrule2Example example = new Alertrule2Example();
+//        example.createCriteria().andNameEqualTo(name)
+//                .andStationEqualTo(station)
+//                .andModelidEqualTo(modelid);
+////               .andWindturbineLike("%" + wtId + "%");
+//
+//        List<Alertrule2> rules = alertrule2Mapper.selectByExample(example);
+//        if (rules == null || rules.size() == 0)
+//            return null;
+//
+//        Alertrule2 rule = rules.get(0);
+//        String expression = "(([A][I])|([D][I]))([0-9]+)";
+//        List<String> list = StringUtil.pattern(rule.getExpression(), expression);
+//
+//        return list;
+//    }
+//
+//    public Alertrule2 selectByAlertrule2Id(String id) {
+//        return alertrule2Mapper.selectByAlertrule2Id(id);
+//    }
+}
+

+ 2 - 0
gyee-sample-impala/src/main/resources/application.yaml

@@ -18,6 +18,8 @@ gyee:
   # 故障诊断保存数据文件的位置
   diagnose-file-window: D://test//
   diagnose-file-linux: /home/gyee/fault_digonsis/data/
+  # 报警规则是否加密
+  rule-encryption: false
 
 server:
   port: 9002

+ 278 - 0
gyee-sample-impala/src/main/resources/mapper/slave/Alertrule2Mapper.xml

@@ -0,0 +1,278 @@
+<?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.gyee.impala.mapper.slave.Alertrule2Mapper">
+    <resultMap id="BaseResultMap" type="com.gyee.impala.model.slave.Alertrule2">
+        <!--
+          WARNING - @mbg.generated
+          This element is automatically generated by MyBatis Generator, do not modify.
+        -->
+        <id column="id" property="id"/>
+        <result column="name" property="name"/>
+        <result column="description" property="description"/>
+        <result column="expression" property="expression"/>
+        <result column="rank" property="rank"/>
+        <result column="rank" property="rank"/>
+        <result column="enabled" property="enabled"/>
+        <result column="modelId" property="modelId"/>
+        <result column="ednaValue" property="ednaValue"/>
+        <result column="category" property="category"/>
+        <result column="range" property="range"/>
+        <result column="station" property="station"/>
+        <result column="windturbine" property="windturbine"/>
+        <result column="line" property="line"/>
+        <result column="project" property="project"/>
+        <result column="electrical" property="electrical"/>
+        <result column="taskstart" property="taskstart"/>
+        <result column="relatedParts" property="relatedParts"/>
+    </resultMap>
+    <resultMap type="Alertrule2" id="Alertrule2Result">
+        <result property="id" column="id"/>
+        <result property="name" column="name"/>
+        <result property="station" column="station"/>
+        <result property="relatedParts" column="relatedParts"/>
+        <association property="windPowerStation" column="station" javaType="WindPowerStation"
+                     select="com.gyee.wisdom.alarm.sharding.mapper.WindPowerStationMapper.selectByid"/>
+        <association property="datadictionary" column="relatedParts" javaType="Datadictionary"
+                     select="com.gyee.wisdom.alarm.sharding.mapper.DatadictionaryMapper.selectBycode"/>
+    </resultMap>
+    <select id="pageQueryAll" parameterType="java.util.Map" resultMap="Alertrule2Result">
+        select a.* from ALERTRULE2 a
+        left join windpowerstation w on w.id = a.station
+        <where>
+            1=1
+
+            <if test="name !=null and name !=''">
+                and a.name like '%${name}%'
+            </if>
+            <if test="station !=null and station !=''">
+                and a.station like '%${station}%'
+            </if>
+            <if test="modelId !=null and modelId !=''">
+                and a.modelid like '%${modelId}%'
+            </if>
+            <if test="rank !=null and rank !=''">
+                and a.rank = #{rank}
+            </if>
+            <if test="category !=null and category !=''">
+                and a.category = #{category}
+            </if>
+            <if test="enabled !=null and enabled !=''">
+                and a.enabled = #{enabled}
+            </if>
+            <if test="relatedparts !=null and relatedparts !=''">
+                and a.relatedparts = #{relatedparts}
+            </if>
+            <!--            and a.range = 0-->
+        </where>
+
+    </select>
+    <select id="getAllByStationIdAndModelId2" parameterType="java.util.Map"
+            resultMap="Alertrule2Result">
+        select * from ALERTRULE2 a
+        <where>
+            1=1
+            <if test="station !=null and station !=''">
+                and a.station = #{station}
+            </if>
+            <if test="modelid !=null and modelid !=''">
+                and a.modelid = #{modelid}
+            </if>
+            and a.enabled = 1
+        </where>
+    </select>
+    <select id="getMaxEdnaValue" parameterType="java.util.Map" resultType="java.lang.Integer">
+        select max(a.ednavalue) from  ALERTRULE2 a
+    </select>
+    <select id="getAllByStationIdAndModelId" parameterType="java.util.Map"
+            resultType="com.gyee.wisdom.alarm.sharding.entity.Alertrule2">
+        select * from ALERTRULE2 a
+        <where>
+            1=1
+            <if test="idString !=null and idString !=''">
+                and a.id like '%${idString}%'
+            </if>
+        </where>
+    </select>
+    <select id="getById" parameterType="java.util.Map" resultType="com.gyee.wisdom.alarm.sharding.entity.Alertrule2">
+        select * from ALERTRULE2 a
+        <where>
+            1=1
+            <if test="idString !=null and idString !=''">
+                and a.id = #{idString}
+            </if>
+        </where>
+    </select>
+
+    <select id="quertByrelatedParts" resultType="java.util.HashMap">
+        select a.name from  ALERTRULE2 a
+        where a.relatedparts = #{relatedParts}
+        group by a.name
+    </select>
+
+    <select id="queryTree" resultMap="Alertrule2Result">
+        select distinct a.relatedparts,a.name,d.name from alertrule2 a
+        left join DATADICTIONARY d
+        on d.code = a.relatedparts
+        where
+        relatedparts is not null
+    </select>
+
+    <select id="queryMap" resultType="com.gyee.wisdom.alarm.sharding.entity.Alertrule2">
+        select t.relatedparts,d.name from
+            (select a.relatedparts from alertrule2 a
+             where relatedparts  is not null
+             group by a.relatedparts) t
+        left join DATADICTIONARY d
+        on d.code = t.relatedparts
+    </select>
+
+    <update id="updateByAlertrule2Id" parameterType="com.gyee.wisdom.alarm.sharding.entity.Alertrule2">
+        update alertrule2 a
+        <set>
+            <if test="name != null">a.name = #{name},</if>
+            <if test="description != null">a.description = #{description},</if>
+            <if test="expression != null">a.expression = #{expression},</if>
+            <if test="tag != null">a.tag = #{tag},</if>
+            <if test="rank != null">a.rank = #{rank},</if>
+            <if test="enabled != null">a.enabled = #{enabled},</if>
+            <if test="modelId != null">a.modelId = #{modelId},</if>
+            <if test="ednaValue != null and ednaValue!=0">a.ednaValue = #{ednaValue},</if>
+            <if test="category != null">a.category = #{category},</if>
+            <if test="range != null">a.range = #{range},</if>
+            <if test="station != null">a.station = #{station},</if>
+            <if test="windturbine != null">a.windturbine = #{windturbine},</if>
+            <if test="line != null">a.line = #{line},</if>
+            <if test="project != null">a.project = #{project},</if>
+            <if test="electrical != null">a.electrical = #{electrical},</if>
+            <if test="taskstart != null">a.taskstart = #{taskstart},</if>
+            <if test="relatedParts != null">a.relatedParts = #{relatedParts},</if>
+            <if test="createtime != null">a.createtime = #{createtime}</if>
+        </set>
+        where a.id = #{id}
+    </update>
+
+    <insert id="insertAlerture2" parameterType="com.gyee.wisdom.alarm.sharding.entity.Alertrule2"
+            useGeneratedKeys="true" keyProperty="id">
+        insert into alertrule2
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="id != null">id,</if>
+            <if test="name != null">Name,</if>
+            <if test="description != null">description,</if>
+            <if test="expression != null">expression,</if>
+            <if test="tag != null">tag,</if>
+            <if test="rank != null">rank,</if>
+            <if test="enabled != null">enabled,</if>
+            <if test="modelId != null">modelId,</if>
+            <if test="ednaValue != null">ednaValue,</if>
+            <if test="category != null">category,</if>
+            <if test="range != null">range,</if>
+            <if test="station != null">station,</if>
+            <if test="windturbine != null">windturbine,</if>
+            <if test="line != null">line,</if>
+            <if test="project != null">project,</if>
+            <if test="electrical != null">electrical,</if>
+            <if test="taskstart != null">taskstart,</if>
+            <if test="relatedParts != null">relatedParts,</if>
+            <if test="createtime != null">createtime</if>
+        </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="id != null">#{id},</if>
+            <if test="name != null">#{name},</if>
+            <if test="description != null">#{description},</if>
+            <if test="expression != null">#{expression},</if>
+            <if test="tag != null">#{tag},</if>
+            <if test="rank != null">#{rank},</if>
+            <if test="enabled != null">#{enabled},</if>
+            <if test="modelId != null">#{modelId},</if>
+            <if test="ednaValue != null">#{ednaValue},</if>
+            <if test="category != null">#{category},</if>
+            <if test="range != null">#{range},</if>
+            <if test="station != null">#{station},</if>
+            <if test="windturbine != null">#{windturbine},</if>
+            <if test="line != null">#{line},</if>
+            <if test="project != null">#{project},</if>
+            <if test="electrical != null">#{electrical},</if>
+            <if test="taskstart != null">#{taskstart},</if>
+            <if test="relatedParts != null">#{relatedParts},</if>
+            <if test="createtime != null">#{createtime}</if>
+        </trim>
+    </insert>
+
+    <!--    <insert id="insertAlerture2" parameterType="com.gyee.wisdom.alarm.sharding.entity.Alertrule2">-->
+    <!--        insert into alertrule2 a(a.id, a.Name, a.description, a.expression, a.tag, a.rank,-->
+    <!--                               a.enabled,a.modelId,a.ednaValue,a.category,a.range,a.station,a.windturbine,a.line,a.project,a.electrical,-->
+    <!--                               a.taskstart,a.relatedParts,a.createtime)-->
+    <!--        values (#{id}, #{Name}, #{description},#{expression},-->
+    <!--                #{tag}, #{rank}, #{enabled},#{modelId}, #{ednaValue}, #{category},#{range},#{station}, #{windturbine}, #{line},-->
+    <!--                #{project}, #{electrical}, #{taskstart},#{relatedParts},#{createtime})-->
+    <!--    </insert>-->
+
+    <select id="selectByAlertrule2Id" resultType="com.gyee.wisdom.alarm.sharding.entity.Alertrule2">
+        select * from  alertrule2 a where a.id=#{id}
+    </select>
+
+    <select id="selectByExample" parameterType="com.gyee.wisdom.alarm.sharding.model.Alertrule2Example"
+            resultMap="BaseResultMap">
+        <!--
+          WARNING - @mbg.generated
+          This element is automatically generated by MyBatis Generator, do not modify.
+        -->
+        select
+        <if test="distinct">
+            distinct
+        </if>
+        *
+        <!--        <include refid="Base_Column_List" />-->
+        from ALERTRULE2
+        <if test="_parameter != null">
+            <include refid="Example_Where_Clause"/>
+        </if>
+        <if test="orderByClause != null">
+            order by ${orderByClause}
+        </if>
+    </select>
+
+    <sql id="Base_Column_List">
+        <!--
+          WARNING - @mbg.generated
+          This element is automatically generated by MyBatis Generator, do not modify.
+        -->
+        id, name, description, expression, tag, rank, enabled, modelid, ednavalue, category,
+        range, station, windturbine, line, project, electrical, taskstart, relatedparts
+    </sql>
+
+    <sql id="Example_Where_Clause">
+        <!--
+          WARNING - @mbg.generated
+          This element is automatically generated by MyBatis Generator, do not modify.
+        -->
+        <where>
+            <foreach collection="oredCriteria" item="criteria" separator="or">
+                <if test="criteria.valid">
+                    <trim prefix="(" prefixOverrides="and" suffix=")">
+                        <foreach collection="criteria.criteria" item="criterion">
+                            <choose>
+                                <when test="criterion.noValue">
+                                    and ${criterion.condition}
+                                </when>
+                                <when test="criterion.singleValue">
+                                    and ${criterion.condition} #{criterion.value}
+                                </when>
+                                <when test="criterion.betweenValue">
+                                    and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
+                                </when>
+                                <when test="criterion.listValue">
+                                    and ${criterion.condition}
+                                    <foreach close=")" collection="criterion.value" item="listItem" open="("
+                                             separator=",">
+                                        #{listItem}
+                                    </foreach>
+                                </when>
+                            </choose>
+                        </foreach>
+                    </trim>
+                </if>
+            </foreach>
+        </where>
+    </sql>
+</mapper>

+ 1 - 0
pom.xml

@@ -23,6 +23,7 @@
         <module>benchmarking-impala</module>
         <module>consumer</module>
         <module>gyee-sample-impala</module>
+        <module>power-fetting</module>
     </modules>
 
 

+ 108 - 0
power-fetting/pom.xml

@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>sis-background</artifactId>
+        <groupId>com.gyee</groupId>
+        <version>0.0.1-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>power-fetting</artifactId>
+
+    <properties>
+        <maven.compiler.source>8</maven.compiler.source>
+        <maven.compiler.target>8</maven.compiler.target>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+
+        <!-- 模板引擎 -->
+        <dependency>
+            <groupId>org.apache.velocity</groupId>
+            <artifactId>velocity-engine-core</artifactId>
+            <version>2.0</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>druid-spring-boot-starter</artifactId>
+            <version>1.2.11</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.oracle</groupId>
+            <artifactId>ojdbc6</artifactId>
+            <version>11.2.0.3</version>
+        </dependency>
+
+        <!--mybatis依赖-->
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-boot-starter</artifactId>
+            <version>3.2.0</version>
+        </dependency>
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-generator</artifactId>
+            <version>3.3.2</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+            <version>1.2.17</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <optional>true</optional>
+        </dependency>
+
+
+        <!--http请求-->
+        <dependency>
+            <groupId>com.netflix.feign</groupId>
+            <artifactId>feign-core</artifactId>
+            <version>8.18.0</version>
+        </dependency>
+        <dependency>
+            <groupId>com.netflix.feign</groupId>
+            <artifactId>feign-jackson</artifactId>
+            <version>8.18.0</version>
+        </dependency>
+        <!--http请求-->
+
+        <!--常用工具类 -->
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-lang3</artifactId>
+        </dependency>
+
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <configuration>
+                    <includeSystemScope>true</includeSystemScope>
+                    <excludes>
+                        <exclude>
+                            <groupId>org.projectlombok</groupId>
+                            <artifactId>lombok</artifactId>
+                        </exclude>
+                    </excludes>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>

+ 26 - 0
power-fetting/src/main/java/com/gyee/power/fetting/BootApplication.java

@@ -0,0 +1,26 @@
+package com.gyee.power.fetting;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
+import org.springframework.cache.annotation.EnableCaching;
+import org.springframework.scheduling.annotation.EnableAsync;
+import org.springframework.scheduling.annotation.EnableScheduling;
+
+
+/**
+ * 使用exclude = {DataSourceAutoConfiguration.class}
+ * 禁用springboot默认加载的application.properties单数据源配置
+ * 关闭springBoot关于mybatisPlus的一些自动注入
+ */
+@EnableAsync
+@EnableCaching
+@EnableScheduling
+@SpringBootApplication
+public class BootApplication {
+
+    public static void main(String[] args) {
+        SpringApplication.run(BootApplication.class, args);
+    }
+
+}

+ 205 - 0
power-fetting/src/main/java/com/gyee/power/fetting/MapperGenerator.java

@@ -0,0 +1,205 @@
+package com.gyee.power.fetting;
+
+import com.baomidou.mybatisplus.annotation.DbType;
+import com.baomidou.mybatisplus.generator.AutoGenerator;
+import com.baomidou.mybatisplus.generator.InjectionConfig;
+import com.baomidou.mybatisplus.generator.config.*;
+import com.baomidou.mybatisplus.generator.config.converts.MySqlTypeConvert;
+import com.baomidou.mybatisplus.generator.config.po.TableInfo;
+import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 代码生成器
+ */
+public class MapperGenerator {
+    //项目路径
+    private static String canonicalPath = "";
+
+    //基本包名
+    private static String basePackage = "com.gyee.impala";
+    //作者
+    private static String authorName = "chenmh";
+    //要生成的表名
+    private static String[] tables = {"",};
+    //table前缀
+    private static String prefix = "";
+
+    //数据库类型
+    private static DbType dbType = DbType.ORACLE;
+    //数据库配置四要素
+//    private static String driverName = "com.mysql.cj.jdbc.Driver";
+//    private static String url = "jdbc:mysql://localhost:3306/gyee_sample_kudu?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=UTC";
+//    private static String username = "root";
+//    private static String password = "";
+
+    private static String driverName = "oracle.jdbc.driver.OracleDriver";
+//    private static String url = "jdbc:oracle:thin:@192.168.1.10:1521:ORCL";
+//    private static String username = "mis";
+//    private static String password = "GDnxXNY_2020#!";
+
+    private static String url = "jdbc:oracle:thin:@192.168.1.105:1521:gdnxfd";
+    private static String username = "nxfdprod";
+    private static String password = "gdnxfd123";
+
+
+    public static void main(String[] args) {
+        AutoGenerator gen = new AutoGenerator();
+
+        /**
+         * 获取项目路径
+         */
+        try {
+            canonicalPath = new File("").getCanonicalPath();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+
+        /**
+         * 数据库配置
+         */
+        gen.setDataSource(new DataSourceConfig()
+                .setDbType(dbType)
+                .setDriverName(driverName)
+                .setUrl(url)
+                .setUsername(username)
+                .setPassword(password)
+                .setTypeConvert(new MySqlTypeConvert() {
+                    // 自定义数据库表字段类型转换【可选】
+                    //@Override
+                    //public DbColumnType processTypeConvert(String fieldType) {
+                    //System.out.println("转换类型:" + fieldType);
+                    // if ( fieldType.toLowerCase().contains( "tinyint" ) ) {
+                    //    return DbColumnType.BOOLEAN;
+                    // }
+                    //return super.processTypeConvert(fieldType);
+                    //}
+                }));
+
+        /**
+         * 全局配置
+         */
+        gen.setGlobalConfig(new GlobalConfig()
+                .setOutputDir( canonicalPath + "/src/main/java")//输出目录
+                .setFileOverride(true)// 是否覆盖文件
+                .setActiveRecord(true)// 开启 activeRecord 模式
+                .setEnableCache(false)// XML 二级缓存
+                .setBaseResultMap(true)// XML ResultMap
+                .setBaseColumnList(true)// XML columList
+                .setOpen(false)//生成后打开文件夹
+                .setAuthor(authorName)
+                // 自定义文件命名,注意 %s 会自动填充表实体属性!
+                .setMapperName("%sMapper")
+                .setXmlName("%sMapper")
+                .setServiceName("%sService")
+                .setServiceImplName("%sServiceImpl")
+                .setControllerName("%sController")
+        );
+
+        /**
+         * 策略配置
+         */
+        gen.setStrategy(new StrategyConfig()
+                        // .setCapitalMode(true)// 全局大写命名
+                        //.setDbColumnUnderline(true)//全局下划线命名
+                        .setTablePrefix(new String[]{prefix})// 此处可以修改为您的表前缀
+                        .setNaming(NamingStrategy.underline_to_camel)// 表名生成策略
+                        .setInclude(tables) // 需要生成的表
+                        .setRestControllerStyle(true)
+                        //.setExclude(new String[]{"test"}) // 排除生成的表
+                        // 自定义实体父类
+                        // .setSuperEntityClass("com.baomidou.demo.TestEntity")
+                        // 自定义实体,公共字段
+                        //.setSuperEntityColumns(new String[]{"test_id"})
+                        //.setTableFillList(tableFillList)
+                        // 自定义 mapper 父类 默认BaseMapper
+                        //.setSuperMapperClass("com.baomidou.mybatisplus.mapper.BaseMapper")
+                        // 自定义 service 父类 默认IService
+                        // .setSuperServiceClass("com.baomidou.demo.TestService")
+                        // 自定义 service 实现类父类 默认ServiceImpl
+                        // .setSuperServiceImplClass("com.baomidou.demo.TestServiceImpl")
+                        // 自定义 controller 父类
+                        //.setSuperControllerClass("com.kichun."+packageName+".controller.AbstractController")
+                        // 【实体】是否生成字段常量(默认 false)
+                        // public static final String ID = "test_id";
+                        // .setEntityColumnConstant(true)
+                        // 【实体】是否为构建者模型(默认 false)
+                        // public User setName(String name) {this.name = name; return this;}
+                        // .setEntityBuilderModel(true)
+                        // 【实体】是否为lombok模型(默认 false)<a href="https://projectlombok.org/">document</a>
+                        .setEntityLombokModel(true)
+                // Boolean类型字段是否移除is前缀处理
+                // .setEntityBooleanColumnRemoveIsPrefix(true)
+                // .setRestControllerStyle(true)
+                // .setControllerMappingHyphenStyle(true)
+        );
+
+        /**
+         * 包配置
+         */
+        gen.setPackageInfo(new PackageConfig()
+                //.setModuleName("User")
+                .setParent(basePackage)// 自定义包路径
+                .setController("controller")// 这里是控制器包名,默认 web
+                .setEntity("model") // 设置Entity包名,默认entity
+                .setMapper("mapper") // 设置Mapper包名,默认mapper
+                .setService("service") // 设置Service包名,默认service
+                .setServiceImpl("service.impl") // 设置Service Impl包名,默认service.impl
+                .setXml("mapper") // 设置Mapper XML包名,默认mapper.xml
+        );
+
+        /**
+         * 注入自定义配置
+         */
+        // 注入自定义配置,可以在 VM 中使用 cfg.abc 设置的值
+        InjectionConfig abc = new InjectionConfig() {
+            @Override
+            public void initMap() {
+                Map<String, Object> map = new HashMap<String, Object>();
+                map.put("abc", this.getConfig().getGlobalConfig().getAuthor() + "-mp");
+                this.setMap(map);
+            }
+        };
+        //自定义文件输出位置(非必须)
+        List<FileOutConfig> fileOutList = new ArrayList<FileOutConfig>();
+        fileOutList.add(new FileOutConfig("/templates/mapper.xml.vm") {
+            @Override
+            public String outputFile(TableInfo tableInfo) {
+                return canonicalPath + "/src/main/resources/mapper/" + tableInfo.getEntityName() + "Mapper.xml";
+            }
+        });
+        abc.setFileOutConfigList(fileOutList);
+        gen.setCfg(abc);
+
+        /**
+         * 指定模板引擎 默认是VelocityTemplateEngine ,需要引入相关引擎依赖
+         */
+        //gen.setTemplateEngine(new FreemarkerTemplateEngine());
+
+        /**
+         * 模板配置
+         */
+        gen.setTemplate(
+                // 关闭默认 xml 生成,调整生成 至 根目录
+                new TemplateConfig().setXml(null)
+                // 自定义模板配置,模板可以参考源码 /mybatis-plus/src/main/resources/template 使用 copy
+                // 至您项目 src/main/resources/template 目录下,模板名称也可自定义如下配置:
+                // .setController("...");
+                // .setEntity("...");
+                // .setMapper("...");
+                // .setXml("...");
+                // .setService("...");
+                // .setServiceImpl("...");
+        );
+
+        // 执行生成
+        gen.execute();
+
+    }
+}

+ 102 - 0
power-fetting/src/main/java/com/gyee/power/fetting/common/base/ExcludeQueryWrapper.java

@@ -0,0 +1,102 @@
+package com.gyee.power.fetting.common.base;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+
+import java.util.Collection;
+
+public class ExcludeQueryWrapper<T> extends QueryWrapper<T> {
+
+    @Override
+    public QueryWrapper<T> eq(boolean condition, String column, Object val) {
+        condition = !ObjectUtils.isEmpty(val);
+        return super.eq(condition, column, val);
+    }
+
+    @Override
+    public QueryWrapper<T> in(boolean condition, String column, Collection<?> val) {
+        condition = !(null == val || val.size() <= 0);
+//        condition = !ObjectUtils.isEmpty(val);
+        return super.in(condition, column, val);
+    }
+
+    @Override
+    public QueryWrapper<T> ne(boolean condition, String column, Object val) {
+        condition = !ObjectUtils.isEmpty(val);
+        return super.ne(condition, column, val);
+    }
+
+    @Override
+    public QueryWrapper<T> gt(boolean condition, String column, Object val) {
+        condition = !ObjectUtils.isEmpty(val);
+        return super.gt(condition, column, val);
+    }
+
+    @Override
+    public QueryWrapper<T> ge(boolean condition, String column, Object val) {
+        condition = !ObjectUtils.isEmpty(val);
+        return super.ge(condition, column, val);
+    }
+
+    @Override
+    public QueryWrapper<T> lt(boolean condition, String column, Object val) {
+        condition = !ObjectUtils.isEmpty(val);
+        return super.lt(condition, column, val);
+    }
+
+    @Override
+    public QueryWrapper<T> le(boolean condition, String column, Object val) {
+        condition = !ObjectUtils.isEmpty(val);
+        return super.le(condition, column, val);
+    }
+
+    @Override
+    public QueryWrapper<T> like(boolean condition, String column, Object val) {
+        condition = !ObjectUtils.isEmpty(val);
+        return super.like(condition, column, val);
+    }
+
+    @Override
+    public QueryWrapper<T> notLike(boolean condition, String column, Object val) {
+        condition = !ObjectUtils.isEmpty(val);
+        return super.notLike(condition, column, val);
+    }
+
+    @Override
+    public QueryWrapper<T> likeLeft(boolean condition, String column, Object val) {
+        condition = !ObjectUtils.isEmpty(val);
+        return super.likeLeft(condition, column, val);
+    }
+
+    @Override
+    public QueryWrapper<T> likeRight(boolean condition, String column, Object val) {
+        condition = !ObjectUtils.isEmpty(val);
+        return super.likeRight(condition, column, val);
+    }
+
+    @Override
+    public QueryWrapper<T> between(boolean condition, String column, Object val1, Object val2) {
+        if (ObjectUtils.isEmpty(val1) && ObjectUtils.isEmpty(val2)) {
+            condition = false;
+        } else if (ObjectUtils.isEmpty(val1)) {
+            return super.lt(true, column, val2);
+        } else if (ObjectUtils.isEmpty(val2)) {
+            return super.ge(true, column, val1);
+        }
+        return super.between(condition, column, val1, val2);
+    }
+
+    @Override
+    public QueryWrapper<T> notBetween(boolean condition, String column, Object val1, Object val2) {
+        if (ObjectUtils.isEmpty(val1) && ObjectUtils.isEmpty(val2)) {
+            condition = false;
+        } else if (ObjectUtils.isEmpty(val1)) {
+            return super.lt(true, column, val2);
+        } else if (ObjectUtils.isEmpty(val2)) {
+            return super.ge(true, column, val1);
+        }
+        return super.notBetween(condition, column, val1, val2);
+    }
+
+
+}

+ 22 - 0
power-fetting/src/main/java/com/gyee/power/fetting/common/config/CorsConfig.java

@@ -0,0 +1,22 @@
+package com.gyee.power.fetting.common.config;
+
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.config.annotation.CorsRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+/**
+ */
+@Configuration
+public class CorsConfig implements WebMvcConfigurer {
+
+    static final String[] ORIGINS = new String[]{"GET", "POST", "PUT", "DELETE"};  //请求方式
+
+    @Override
+    public void addCorsMappings(CorsRegistry registry) {
+        registry.addMapping("/**") //所有的当前站点的请求地址,都支持跨域访问
+                .allowedOrigins("*")// 所有的外部域都可跨域访问,这里注意2.4.0以后是allowedOriginPatterns,以前是allowedOrigins
+                .allowCredentials(true)  //是否支持跨域用户凭证
+                .allowedMethods(ORIGINS) //当前站点支持的跨域请求类型是什么
+                .maxAge(3600);  //超是时长,单位为秒。
+    }
+}

+ 16 - 0
power-fetting/src/main/java/com/gyee/power/fetting/common/config/GyeeConfig.java

@@ -0,0 +1,16 @@
+package com.gyee.power.fetting.common.config;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+@Data
+@Component
+@ConfigurationProperties(prefix = "gyee")
+public class GyeeConfig {
+
+    /**数据适配器网址 **/
+    private String adapterUrl;
+
+
+}

+ 29 - 0
power-fetting/src/main/java/com/gyee/power/fetting/common/config/datasource/DataSourceConfig.java

@@ -0,0 +1,29 @@
+package com.gyee.power.fetting.common.config.datasource;
+
+import com.alibaba.druid.pool.DruidDataSource;
+import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
+import org.apache.ibatis.session.SqlSessionFactory;
+import org.mybatis.spring.SqlSessionTemplate;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.boot.jdbc.DataSourceBuilder;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
+
+import javax.sql.DataSource;
+
+/**
+ * 三区oracle数据源
+ */
+@Configuration
+public class DataSourceConfig {
+
+    @Bean
+    @ConfigurationProperties(prefix = "spring.datasource")
+    public DataSource druidDataSource() {
+        DruidDataSource druidDataSource = new DruidDataSource();
+        return druidDataSource;
+    }
+}

+ 58 - 0
power-fetting/src/main/java/com/gyee/power/fetting/common/exception/AdviceException.java

@@ -0,0 +1,58 @@
+package com.gyee.power.fetting.common.exception;
+
+import com.alibaba.fastjson.JSONObject;
+import com.gyee.power.fetting.common.result.JsonResult;
+import com.gyee.power.fetting.common.result.ResultCode;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.RestControllerAdvice;
+
+@Slf4j
+@RestControllerAdvice
+public class AdviceException {
+
+    /**
+     * 拦截未知的运行时异常
+     */
+    @ExceptionHandler(Exception.class)
+    public JSONObject runException(Exception e)
+    {
+        log.error(e.getMessage());
+        return JsonResult.error(ResultCode.ERROR);
+    }
+
+
+    /**
+     * 拦截未知的运行时异常
+     */
+    @ExceptionHandler(NullPointerException.class)
+    public JSONObject nullPointerException(NullPointerException e)
+    {
+        log.error(e.getMessage());
+        return JsonResult.error(ResultCode.ERROR);
+    }
+
+
+    /**
+     * 拦截自定义异常
+     */
+    @ExceptionHandler(RuntimeException.class)
+    public JSONObject runException(RuntimeException e)
+    {
+        log.error(e.getMessage());
+        return JsonResult.error(ResultCode.ERROR);
+    }
+
+
+
+    /**
+     * 拦截自定义异常
+     */
+    @ExceptionHandler(CustomException.class)
+    public JSONObject customException(CustomException e)
+    {
+        log.error(e.getMessage());
+        return JsonResult.error(e.getCode(), e.getMessage());
+    }
+
+}

+ 23 - 0
power-fetting/src/main/java/com/gyee/power/fetting/common/exception/CustomException.java

@@ -0,0 +1,23 @@
+package com.gyee.power.fetting.common.exception;
+
+import com.gyee.power.fetting.common.result.ResultCode;
+import lombok.Data;
+
+@Data
+public class CustomException extends RuntimeException {
+
+    private Integer code;
+    private String message;
+
+    public CustomException(){}
+
+    public CustomException(ResultCode result){
+        super();
+        this.code = result.getCode();
+        this.message = result.getMessage();
+    }
+
+    public CustomException(Exception e){
+        super();
+    }
+}

+ 24 - 0
power-fetting/src/main/java/com/gyee/power/fetting/common/feign/IAdapterService.java

@@ -0,0 +1,24 @@
+package com.gyee.power.fetting.common.feign;
+
+import com.alibaba.fastjson.JSONObject;
+import com.gyee.power.fetting.model.custom.TsDoubleData;
+import feign.Headers;
+import feign.Param;
+import feign.RequestLine;
+
+import java.util.List;
+
+
+public interface IAdapterService {
+
+
+    @Headers({"Content-Type: application/json", "Accept: application/json"})
+    @RequestLine("GET /ts/latest?keys={points}")
+    JSONObject getLatest(@Param(value = "points") String points);
+
+
+    @Headers({"Content-Type: application/json", "Accept: application/json"})
+    @RequestLine("GET /ts/history/snap?tagName={tagName}&startTs={startTs}&endTs={endTs}&interval={interval}")
+    List<TsDoubleData> getHistorySnapAI(@Param(value = "tagName") String tagName, @Param(value = "startTs") long startTs,
+                                        @Param(value = "endTs") long endTs, @Param(value = "interval") Integer interval);
+}

+ 31 - 0
power-fetting/src/main/java/com/gyee/power/fetting/common/feign/RemoteServiceBuilder.java

@@ -0,0 +1,31 @@
+package com.gyee.power.fetting.common.feign;
+
+import com.gyee.power.fetting.common.config.GyeeConfig;
+import feign.Feign;
+import feign.Request;
+import feign.Retryer;
+import feign.jackson.JacksonDecoder;
+import feign.jackson.JacksonEncoder;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.stereotype.Component;
+
+
+@Slf4j
+@Component
+public class RemoteServiceBuilder {
+
+    @Autowired
+    private GyeeConfig config;
+
+    @Bean
+    public IAdapterService adapter() {
+        return Feign.builder()
+                .encoder(new JacksonEncoder())
+                .decoder(new JacksonDecoder())
+                .options(new Request.Options(5000, 600000))
+                .retryer(new Retryer.Default(10000, 10000, 3))
+                .target(IAdapterService.class, config.getAdapterUrl());
+    }
+}

+ 67 - 0
power-fetting/src/main/java/com/gyee/power/fetting/common/result/JsonResult.java

@@ -0,0 +1,67 @@
+package com.gyee.power.fetting.common.result;
+
+import com.alibaba.fastjson.JSONObject;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.HashMap;
+
+@Data
+public class JsonResult extends HashMap<String, Object> implements Serializable {
+
+    private Integer code;
+    private String message;
+    private Object data;
+    private ResultCode resultCode;
+
+    public static JSONObject error(){
+        JSONObject json = new JSONObject();
+        json.put("code", ResultCode.SUCCESS.getCode());
+        json.put("msg", ResultCode.SUCCESS.getMessage());
+        return json;
+    }
+
+    public static JSONObject error(ResultCode resultCode){
+        JSONObject json = new JSONObject();
+        json.put("code", resultCode.getCode());
+        json.put("msg", resultCode.getMessage());
+        return json;
+    }
+
+    public static JSONObject error(int code, String message){
+        JSONObject json = new JSONObject();
+        json.put("code", code);
+        json.put("msg", message);
+        return json;
+    }
+
+    public static JSONObject success(){
+        JSONObject json = new JSONObject();
+        json.put("code", ResultCode.SUCCESS.getCode());
+        json.put("msg", ResultCode.SUCCESS.getMessage());
+        return json;
+    }
+
+    public static JSONObject seccess(int code, String message){
+        JSONObject json = new JSONObject();
+        json.put("code", code);
+        json.put("msg", message);
+        return json;
+    }
+
+    public static JSONObject success(ResultCode resultCode){
+        JSONObject json = new JSONObject();
+        json.put("code", resultCode.getCode());
+        json.put("msg", resultCode.getMessage());
+        return json;
+    }
+
+    public static JSONObject successData(ResultCode code, Object data){
+        JSONObject json = new JSONObject();
+        json.put("code", code.getCode());
+        json.put("msg", code.getMessage());
+        json.put("data", data != null ? data : null);
+        return json;
+    }
+
+}

+ 88 - 0
power-fetting/src/main/java/com/gyee/power/fetting/common/result/ResultCode.java

@@ -0,0 +1,88 @@
+package com.gyee.power.fetting.common.result;
+
+/*
+ * #1001~1999 区间表示参数错误
+ * #2001~2999 区间表示用户错误
+ * #3001~3999 区间表示权限异常
+ */
+
+public enum ResultCode {
+    /* 成功 */
+    SUCCESS(200, "成功"),
+
+    /* 默认失败 */
+    ERROR(4000, "失败"),
+    ERROR_FILE_NO(4001, "文件未找到"),
+    ERROR_FILE_TYPE(4002, "文件类型不正确"),
+    ERROR_FILE_DATA(4003, "数据为空"),
+    ERROR_DATA_TYPE(4004, "数据格式不正确"),
+    ERROR_CONNECT(4005, "数据库连接异常"),
+    ERROR_DATA(4006, "数据库操作失败"),
+    ERROR_DATA_REPEAT(4007, "数据已存在"),
+    ERROR_SQL(4008, "sql语法不正确"),
+    ERROR_MODEL(4006, "同场站不同机型至少启用一个模型"),
+
+
+    /* 参数错误:1000~1999 */
+    PARAM_NOT_VALID(1001, "参数无效"),
+    PARAM_IS_BLANK(1002, "参数为空"),
+    PARAM_TYPE_ERROR(1003, "参数类型错误"),
+    PARAM_NOT_COMPLETE(1004, "参数缺失"),
+    ERROR_DATA_DIR(1005, "目录创建失败"),
+    ERROR_DATA_FILE(1006, "文件上传失败"),
+
+    /* 用户错误 */
+    USER_NOT_LOGIN(2001, "用户未登录"),
+    USER_ACCOUNT_ERROR(2002, "账号或密码错误"),
+    USER_FAIL_LOGIN(2003, "登录失败"),
+    USER_OUT_LOGIN(2004, "登出成功"),
+    USER_ERROR_TOKEN(2005, "登录已过期,请重新登录"),
+
+    /* 业务错误 */
+    NO_PERMISSION(3001, "没有权限"),
+    ERROR_ENABLE(3002, "模型为启用状态,不允许删除"),
+    ERROR_TASK(3003, "有正在进行的任务,请稍后在试");
+
+    private Integer code;
+    private String message;
+
+    ResultCode(Integer code) {
+        this.code = code;
+    }
+
+    ResultCode(Integer code, String message) {
+        this.code = code;
+        this.message = message;
+    }
+
+    public Integer getCode() {
+        return code;
+    }
+
+    public void setCode(Integer code) {
+        this.code = code;
+    }
+
+    public String getMessage() {
+        return message;
+    }
+
+    public void setMessage(String message) {
+        this.message = message;
+    }
+
+    /**
+     * 根据code获取message
+     *
+     * @param code
+     * @return
+     */
+    public static String getMessageByCode(Integer code) {
+        for (ResultCode ele : values()) {
+            if (ele.getCode().equals(code)) {
+                return ele.getMessage();
+            }
+        }
+        return null;
+    }
+}

+ 19 - 0
power-fetting/src/main/java/com/gyee/power/fetting/common/spring/ExitDisposable.java

@@ -0,0 +1,19 @@
+package com.gyee.power.fetting.common.spring;
+
+import org.springframework.beans.factory.DisposableBean;
+import org.springframework.boot.ExitCodeGenerator;
+import org.springframework.stereotype.Component;
+
+@Component
+public class ExitDisposable implements DisposableBean, ExitCodeGenerator {
+
+
+    @Override
+    public void destroy() throws Exception {
+    }
+
+    @Override
+    public int getExitCode() {
+        return 0;
+    }
+}

+ 152 - 0
power-fetting/src/main/java/com/gyee/power/fetting/common/spring/InitialRunner.java

@@ -0,0 +1,152 @@
+package com.gyee.power.fetting.common.spring;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.CommandLineRunner;
+import org.springframework.core.annotation.Order;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * 服务启动前执行,进行全局变量初始化
+ */
+@Component
+@Order(2)
+public class InitialRunner implements CommandLineRunner {
+
+//    @Resource
+//    private WindturbineService windturbineService;
+//    @Resource
+//    private WindpowerstationService windpowerstationService;
+//    @Autowired
+//    private KnowcategoryService faulttypeService;
+//    @Autowired
+//    private EquipmentmodelService modelService;
+//    @Autowired
+//    private DiagnosepointService diagnosepointService;
+//    @Autowired
+//    private DiagnosetrainhistoryService diagnosetrainhistoryService;
+//
+//    /**场站所有信息**/
+//    public static List<Windpowerstation> wpList = new ArrayList<>();
+//    /**场站的风机**/
+//    public static Map<String, List<Windturbine>> wpMap = new HashMap<>();
+//    /** <MHS_FDC, 麻黄山风电场> **/
+//    public static Map<String, String> stationMap = new HashMap<>();
+//    /** <麻黄山风电场, MHS_FDC> **/
+//    public static Map<String, String> stationenMap = new HashMap<>();
+//    /**所有的风机**/
+//    public static List<Windturbine> wtList = new ArrayList<>();
+//    /** <NG01_01, Windturbine> **/
+//    public static Map<String, Windturbine> wtMap = new HashMap<>();
+//    /**功率曲线预处理数据表格数据 key:time+wtId  value:当前风机的总条数 **/
+//    public static Map<String, Integer> scatterMap = new HashMap<>();
+//    /***故障  <FDJ,发电机故障>  类型*/
+//    public static Map<String, String> faultTypeMap = new HashMap<>();
+//    public static List<Knowcategory> faultTypeList = new ArrayList<>();
+//    /***scada预警  <FDJ,发电机>  类型*/
+//    public static Map<String, String> scadaWarnMap = new HashMap<>();
+//    public static List<Knowcategory> scadaWarnList = new ArrayList<>();
+//    /***自定义预警  <FDJ,发电机>  类型*/
+//    public static Map<String, String> customWarnMap = new HashMap<>();
+//    public static List<Knowcategory> customWarnList = new ArrayList<>();
+//    /** 设备型号配置 <UP82, Equipmentmodel> **/
+//    public static Map<String, Equipmentmodel> modelMap = new HashMap<>();
+//    /** 故障诊断 训练需要的测点 <NSS_FDC, UP82, Diagnosepoint></> **/
+//    public static Map<String, Map<String, List<Diagnosepoint>>> mapPoint = new HashMap<>();
+//
+//    /*** 故障训练历史模型 */
+//    public static Map<String, List<Diagnosetrainhistory>> historyModelMap = new HashMap<>();
+//    public static List<Diagnosetrainhistory> historyList = new ArrayList<>();
+
+
+
+    @Override
+    public void run(String... args){
+        System.out.println(">>>>>>>>>>>>>>>服务启动,正在缓存数据<<<<<<<<<<<<<<");
+
+//        cacheStation();
+//        cacheKnowCategory();
+//        cacheEquipmentModel();
+//        cacheDiagnosePoint();
+//        cacheHistory();
+
+        System.out.println(">>>>>>>>>>>>>>>数据缓存完成<<<<<<<<<<<<<<");
+    }
+
+    /**
+     * 缓存场站数据
+     * 数据新增或删除后需要更新,故每次清空
+     */
+//    public void cacheStation(){
+//        wpList.clear();
+//        wtList.clear();
+//        stationMap.clear();
+//        stationenMap.clear();
+//        wpMap.clear();
+//        wtMap.clear();
+//
+//        List<Windpowerstation> stations = windpowerstationService.getAll();
+//        wpList = stations;
+//        stations.stream().forEach(obj -> {
+//            List<Windturbine> wts = windturbineService.getWindTurbineId(obj.getId());
+//            stationMap.put(obj.getId(), obj.getName());
+//            stationenMap.put(obj.getName(), obj.getId());
+//            wpMap.put(obj.getId(), wts);
+//            wtList.addAll(wts);
+//            wts.stream().forEach(o -> wtMap.put(o.getId(), o));
+//        });
+//    }
+//
+//    /**
+//     * 缓存故障知识数据
+//     */
+//    public void cacheKnowCategory() {
+//        faultTypeList.clear();
+//        scadaWarnList.clear();
+//        customWarnList.clear();
+//        faultTypeMap.clear();
+//        scadaWarnMap.clear();
+//        customWarnMap.clear();
+//
+//        List<Knowcategory> faultType = faulttypeService.getAll();
+//        faultType.stream().forEach(obj -> {
+//            if (obj.getCategory().equals("GZ")) {
+//                faultTypeList.add(obj);
+//                faultTypeMap.put(obj.getCode().toUpperCase(), obj.getName());
+//            }
+//            else if (obj.getCategory().equals("SCADABJ")) {
+//                scadaWarnList.add(obj);
+//                scadaWarnMap.put(obj.getCode().toUpperCase(), obj.getName());
+//            }
+//            else if (obj.getCategory().equals("CUSTOMBJ")) {
+//                customWarnList.add(obj);
+//                customWarnMap.put(obj.getCode().toUpperCase(), obj.getName());
+//            }
+//        });
+//    }
+//
+//    public void cacheEquipmentModel() {
+//        modelMap.clear();
+//        List<Equipmentmodel> models = modelService.getAll();
+//        models.stream().forEach(obj -> modelMap.put(obj.getId(), obj));
+//    }
+//
+//    public void cacheDiagnosePoint(){
+//        mapPoint.clear();
+//        List<Diagnosepoint> points = diagnosepointService.getDiagnosepointList();
+//        mapPoint = points.stream().collect(Collectors.groupingBy(Diagnosepoint::getStationen, Collectors.groupingBy(Diagnosepoint::getModel)));
+//    }
+//
+//    public void cacheHistory(){
+//        historyModelMap.clear();
+//        historyList.clear();
+//        historyList = diagnosetrainhistoryService.getListAll();
+//        historyModelMap = historyList.stream().filter(h -> h.isEnable()).collect(Collectors.groupingBy(Diagnosetrainhistory::getModel));
+//    }
+}

+ 110 - 0
power-fetting/src/main/java/com/gyee/power/fetting/common/spring/SpringContextUtil.java

@@ -0,0 +1,110 @@
+package com.gyee.power.fetting.common.spring;
+
+import org.springframework.beans.BeansException;
+import org.springframework.beans.factory.DisposableBean;
+import org.springframework.beans.factory.NoSuchBeanDefinitionException;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.ApplicationContextAware;
+import org.springframework.stereotype.Component;
+
+@Component
+public class SpringContextUtil implements ApplicationContextAware, DisposableBean {
+
+    private static ApplicationContext applicationContext = null;
+
+    /***
+     * 当继承了ApplicationContextAware类之后,那么程序在调用 getBean(String)的时候会自动调用该方法, 不用自己操作
+     */
+    @Override
+    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
+        SpringContextUtil.applicationContext = applicationContext;
+    }
+
+    /**
+     * 实现DisposableBean接口, 在Context关闭时清理静态变量.
+     */
+    @Override
+    public void destroy() throws Exception {
+        SpringContextUtil.clearHolder();
+    }
+
+    /**
+     * 取得存储在静态变量中的ApplicationContext.
+     */
+    public static ApplicationContext getApplicationContext() {
+        return applicationContext;
+    }
+
+    /***
+     * 根据一个bean的id获取配置文件中相应的bean
+     *
+     * @param name
+     * @return
+     * @throws BeansException
+     */
+    @SuppressWarnings("unchecked")
+    public static <T> T getBean(String name) throws BeansException {
+        return (T) applicationContext.getBean(name);
+    }
+
+    /***
+     * 类似于getBean(String name)只是在参数中提供了需要返回到的类型。
+     *
+     * @param name
+     * @param requiredType
+     * @return
+     * @throws BeansException
+     */
+    public static <T> T getBean(Class<T> requiredType) throws BeansException {
+        return applicationContext.getBean(requiredType);
+    }
+
+    /**
+     * 如果BeanFactory包含一个与所给名称匹配的bean定义,则返回true
+     *
+     * @param name
+     * @return boolean
+     */
+    public static boolean containsBean(String name) {
+        return applicationContext.containsBean(name);
+    }
+
+    /**
+     * 判断以给定名字注册的bean定义是一个singleton还是一个prototype。
+     * 如果与给定名字相应的bean定义没有被找到,将会抛出一个异常(NoSuchBeanDefinitionException)
+     *
+     * @param name
+     * @return boolean
+     * @throws NoSuchBeanDefinitionException
+     */
+    public static boolean isSingleton(String name) throws NoSuchBeanDefinitionException {
+        return applicationContext.isSingleton(name);
+    }
+
+    /**
+     * @param name
+     * @return Class 注册对象的类型
+     * @throws NoSuchBeanDefinitionException
+     */
+    public static Class<?> getType(String name) throws NoSuchBeanDefinitionException {
+        return applicationContext.getType(name);
+    }
+
+    /**
+     * 如果给定的bean名字在bean定义中有别名,则返回这些别名
+     *
+     * @param name
+     * @return
+     * @throws NoSuchBeanDefinitionException
+     */
+    public static String[] getAliases(String name) throws NoSuchBeanDefinitionException {
+        return applicationContext.getAliases(name);
+    }
+
+    /**
+     * 清除SpringContextHolder中的ApplicationContext为Null.
+     */
+    public static void clearHolder() {
+        applicationContext = null;
+    }
+}

+ 124 - 0
power-fetting/src/main/java/com/gyee/power/fetting/common/util/Base64Util.java

@@ -0,0 +1,124 @@
+package com.gyee.power.fetting.common.util;
+
+import java.io.UnsupportedEncodingException;
+import java.util.Base64;
+
+public class Base64Util {
+
+    public static final String UTF_8 = "UTF-8";
+    public static Base64.Encoder encoder;
+    //即为安全的编码方式,替换“+” “/” “-”为“_”
+    public static Base64.Encoder urlEncoder;
+    public static Base64.Decoder decoder;
+    public static Base64.Decoder urlDecoder;
+
+    static {
+        encoder = Base64.getEncoder();
+        urlEncoder = Base64.getUrlEncoder();
+        decoder = Base64.getDecoder();
+        urlDecoder = Base64.getUrlDecoder();
+    }
+
+    //encode
+    public static byte[] encode(byte[] bytes) {
+        return encoder.encode(bytes);
+    }
+
+
+    public static String encode(String string) {
+        byte[] encode = encode(string.getBytes());
+        try {
+            return new String(encode, UTF_8);
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    public static String encode2String(byte[] bytes) {
+        return encoder.encodeToString(bytes);
+    }
+
+    public static byte[] encode2Byte(String string) {
+        return encode(string.getBytes());
+    }
+
+    //urlEncoder
+    public static byte[] urlEncode(byte[] bytes) {
+        return urlEncoder.encode(bytes);
+    }
+
+    public static String urlEncode(String string) {
+        byte[] encode = urlEncode(string.getBytes());
+        try {
+            return new String(encode, UTF_8);
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    public static String urlEncode2String(byte[] bytes) {
+        return urlEncoder.encodeToString(bytes);
+    }
+
+    public static byte[] urlEncode2Byte(String string) {
+        return urlEncode(string.getBytes());
+    }
+
+    //decode
+    public static byte[] decode(byte[] bytes) {
+        return decoder.decode(bytes);
+    }
+
+    public static byte[] decode2Byte(String string) {
+        return decoder.decode(string.getBytes());
+    }
+
+    public static String decode2String(byte[] bytes) {
+        try {
+            return new String(decoder.decode(bytes),UTF_8);
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    public static String decode(String string) {
+        byte[] decode = decode(string.getBytes());
+        try {
+            return new String(decode, UTF_8);
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    //urlDecode
+    public static byte[] urlDecode(byte[] bytes) {
+        return urlDecoder.decode(bytes);
+    }
+
+    public static byte[] urlDecode2Byte(String string) {
+        return urlDecode(string.getBytes());
+    }
+
+    public static String urlDecode2String(byte[] bytes) {
+        try {
+            return new String(urlDecode(bytes),UTF_8);
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    public static String urlDecode(String string) {
+        byte[] decode = urlDecode(string.getBytes());
+        try {
+            return new String(decode, UTF_8);
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+}

+ 14 - 0
power-fetting/src/main/java/com/gyee/power/fetting/common/util/CollectUtil.java

@@ -0,0 +1,14 @@
+package com.gyee.power.fetting.common.util;
+
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.function.Function;
+import java.util.function.Predicate;
+
+public class CollectUtil {
+
+    public static <T> Predicate<T> distinctByKey(Function<? super T, Object> keyExtractor) {
+        Map<Object, Boolean> seen = new ConcurrentHashMap<>();
+        return object -> seen.putIfAbsent(keyExtractor.apply(object), Boolean.TRUE) == null;
+    }
+}

+ 509 - 0
power-fetting/src/main/java/com/gyee/power/fetting/common/util/DateUtil.java

@@ -0,0 +1,509 @@
+package com.gyee.power.fetting.common.util;
+
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.time.DateFormatUtils;
+import org.apache.commons.lang3.time.DateUtils;
+
+import java.lang.management.ManagementFactory;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.TimeZone;
+
+@Slf4j
+public class DateUtil extends DateUtils {
+
+    /**
+     * 获取当前时间
+     *
+     * @return
+     */
+    public static String getCurrentDate() {
+        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
+        String date = df.format(new Date());
+        return date;
+    }
+
+    /**
+     * 获取前 N 小时的时间
+     *
+     * @param hour
+     * @return
+     */
+    public static String getPreviousDate(int hour) {
+        Calendar calendar = Calendar.getInstance();
+        calendar.set(Calendar.HOUR_OF_DAY, calendar.get(Calendar.HOUR_OF_DAY) - hour);
+        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        String date = df.format(calendar.getTime());
+        return date;
+    }
+
+    /**
+     * 获取当前时间后 N 小时的时间
+     *
+     * @param hour
+     * @return
+     */
+    public static String getNextDate(int hour) {
+        Calendar calendar = Calendar.getInstance();
+        calendar.set(Calendar.HOUR_OF_DAY, calendar.get(Calendar.HOUR_OF_DAY) + hour);
+        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        String date = df.format(calendar.getTime());
+        return date;
+    }
+
+    /**
+     * 获取当前时间后 N 小时的时间
+     *
+     * @param hour
+     * @return
+     */
+    public static Long getNextDateTimestamp(int hour) {
+        Calendar calendar = Calendar.getInstance();
+        calendar.set(Calendar.HOUR_OF_DAY, calendar.get(Calendar.HOUR_OF_DAY) + hour);
+        long time = calendar.getTime().getTime();
+        return time;
+    }
+
+
+    /**
+     * 字符串时间转时间戳
+     * @param time
+     * @return
+     */
+    public static Long covertDateTimestamp(String time){
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        long stamp = 0;
+        try {
+            stamp = sdf.parse(time).getTime();
+        } catch (ParseException e) {
+            e.printStackTrace();
+        }
+
+        return stamp;
+    }
+
+    /**
+     * 时间格式(yyyy-MM-dd)
+     */
+    public final static String DATE_PATTERN = "yyyy-MM-dd";
+    /**
+     * 时间格式(yyyy-MM-dd HH:mm:ss)
+     */
+    public final static String DATE_TIME_PATTERN = "yyyy-MM-dd HH:mm:ss";
+
+    public static String format(Date date) {
+        return format(date, DATE_PATTERN);
+    }
+
+    public static String formatDateTime(Date date) {
+        return format(date, DATE_TIME_PATTERN);
+    }
+    /**
+     * 时间转换
+     *
+     * @param date
+     * @param pattern
+     * @return
+     */
+    public static String format(Date date, String pattern) {
+        if (date != null) {
+            SimpleDateFormat df = new SimpleDateFormat(pattern);
+            return df.format(date);
+        }
+        return null;
+    }
+
+    /**
+     * 字符串格式化
+     * @param time
+     * @param pattern
+     * @return
+     */
+    public static String format(String time,String pattern) {
+        SimpleDateFormat sdf = new SimpleDateFormat(pattern);
+        Date dateTime = null;
+        try {
+            dateTime = sdf.parse(time);
+        } catch (ParseException e) {
+            e.printStackTrace();
+
+        }
+        return format(dateTime, pattern);
+    }
+
+    /**
+     * 时间转换
+     *
+     * @param time
+     * @param pattern
+     * @return
+     */
+    public static String format(Long time, String pattern) {
+        SimpleDateFormat sdf = new SimpleDateFormat(pattern);
+        Date date = new Date(time);
+        String format = sdf.format(date);
+        return format;
+    }
+
+
+    public static String YYYY = "yyyy";
+
+    public static String YYYY_MM = "yyyy-MM";
+
+    public static String YYYY_MM_DD = "yyyy-MM-dd";
+
+    public static String YYYYMMDDHHMMSS = "yyyyMMddHHmmss";
+
+    public static String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";
+
+    private static String[] parsePatterns = {
+            "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM",
+            "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM",
+            "yyyy.MM.dd", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm", "yyyy.MM"};
+
+    /**
+     * 获取当前Date型日期
+     *
+     * @return Date() 当前日期
+     */
+    public static Date getNowDate() {
+        return new Date();
+    }
+
+    /**
+     * 获取当前日期, 默认格式为yyyy-MM-dd
+     *
+     * @return String
+     */
+    public static String getDate() {
+        return dateTimeNow(YYYY_MM_DD);
+    }
+
+    public static final String getTime() {
+        return dateTimeNow(YYYY_MM_DD_HH_MM_SS);
+    }
+
+    public static final String dateTimeNow() {
+        return dateTimeNow(YYYYMMDDHHMMSS);
+    }
+
+    public static final String dateTimeNow(final String format) {
+        return parseDateToStr(format, new Date());
+    }
+
+    public static final String dateTime(final Date date) {
+        return parseDateToStr(YYYY_MM_DD, date);
+    }
+
+    public static final String parseDateToStr(final String format, final Date date) {
+        return new SimpleDateFormat(format).format(date);
+    }
+
+    public static final Date dateTime(final String format, final String ts) {
+        try {
+            return new SimpleDateFormat(format).parse(ts);
+        } catch (ParseException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    /**
+     * 日期路径 即年/月/日 如2018/08/08
+     */
+    public static final String datePath() {
+        Date now = new Date();
+        return DateFormatUtils.format(now, "yyyy/MM/dd");
+    }
+
+    /**
+     * 日期路径 即年/月/日 如20180808
+     */
+    public static final String dateTime() {
+        Date now = new Date();
+        return DateFormatUtils.format(now, "yyyyMMdd");
+    }
+
+    /**
+     * 日期型字符串转化为日期 格式
+     */
+    public static Date parseDate(Object str) {
+        if (str == null) {
+            return null;
+        }
+        try {
+            return parseDate(str.toString(), parsePatterns);
+        } catch (ParseException e) {
+            return null;
+        }
+    }
+
+    /**
+     * 获取服务器启动时间
+     */
+    public static Date getServerStartDate() {
+        long time = ManagementFactory.getRuntimeMXBean().getStartTime();
+        return new Date(time);
+    }
+
+    /**
+     * 计算两个时间差
+     */
+    public static String getDatePoor(Date endDate, Date nowDate) {
+        long nd = 1000 * 24 * 60 * 60;
+        long nh = 1000 * 60 * 60;
+        long nm = 1000 * 60;
+        // long ns = 1000;
+        // 获得两个时间的毫秒时间差异
+        long diff = endDate.getTime() - nowDate.getTime();
+        // 计算差多少天
+        long day = diff / nd;
+        // 计算差多少小时
+        long hour = diff % nd / nh;
+        // 计算差多少分钟
+        long min = diff % nd % nh / nm;
+        // 计算差多少秒//输出结果
+        // long sec = diff % nd % nh % nm / ns;
+        return day + "天" + hour + "小时" + min + "分钟";
+    }
+
+    /**
+     * 将时间的时分秒毫秒字段去掉
+     *
+     * @param date
+     * @return
+     */
+    public static Date truncate(Date date) {
+        Calendar cal = Calendar.getInstance();
+        cal.setTime(date);
+        cal.set(Calendar.HOUR_OF_DAY, 0);
+        cal.set(Calendar.MINUTE, 0);
+        cal.set(Calendar.SECOND, 0);
+        cal.set(Calendar.MILLISECOND, 0);
+        return cal.getTime();
+    }
+
+    /**
+     * 计算两个时间之间差的天数(取整后)
+     *
+     * @param d1
+     * @param d2
+     * @return
+     */
+    public static int daysDiff(Date d1, Date d2) {
+        return (int) Math.floor(Math.abs((d1.getTime() - d2.getTime())) / (60 * 60 * 24 * 1000));
+    }
+
+    /**
+     * 将字符串日期转换成日期类型
+     *
+     * @param time
+     * @return
+     */
+    public static Date parseStrtoDate(String time) {
+
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+        Date dateTime = null;
+        try {
+            dateTime = sdf.parse(time);
+        } catch (ParseException e) {
+            e.printStackTrace();
+
+        }
+        return dateTime;
+    }
+
+    public static Date parseStrtoDate(String time,String pattern) {
+
+        SimpleDateFormat sdf = new SimpleDateFormat(pattern);
+        Date dateTime = null;
+        try {
+            dateTime = sdf.parse(time);
+        } catch (ParseException e) {
+            e.printStackTrace();
+
+        }
+        return dateTime;
+    }
+
+    public static Date str2DateTime(String time,String pattern) {
+
+        SimpleDateFormat sdf = new SimpleDateFormat(pattern);
+        Date dateTime = null;
+        try {
+            dateTime = sdf.parse(time);
+        } catch (ParseException e) {
+            e.printStackTrace();
+
+        }
+        return dateTime;
+    }
+    public static Date str2DateTime(String time) {
+        return str2DateTime(time,DATE_TIME_PATTERN);
+    }
+
+    /**
+     * 加减年份
+     */
+    public static Date dateTimeAddYear(Date date,int k) {
+        Calendar instance = Calendar.getInstance();
+        instance.setTime(date);
+        instance.add(Calendar.YEAR,k);
+        return instance.getTime();
+    }
+
+    public static String datetime2Str(Date time,String pattern) {
+        SimpleDateFormat sdf = new SimpleDateFormat(pattern);
+        return sdf.format(time);
+    }
+    public static String datetime2Str(Date time) {
+        return datetime2Str(time,DATE_TIME_PATTERN);
+    }
+
+    public static double hoursDiff1(Date d1, Date d2) {
+        return Math.floor(Math.abs((d1.getTime() - d2.getTime())) / (double) (60 * 60 * 1000));
+    }
+
+    public static double hoursDiff2(Date d1, Date d2) {
+        return Math.abs((d1.getTime() - d2.getTime())) / (double) (60 * 60 * 1000);
+    }
+
+    /**
+     * 计算两个时间之间差的分钟数(取整后)
+     *
+     * @param d1
+     * @param d2
+     * @return
+     */
+    public static int minutesDiff(Date d1, Date d2) {
+        return (int) Math.floor(Math.abs((d1.getTime() - d2.getTime())) / (60 * 1000));
+    }
+
+    /**
+     * 计算两个时间之间差的分钟数(取整后)
+     *
+     * @param d1
+     * @param d2
+     * @return
+     */
+    public static double minutesDiff2(Date d1, Date d2) {
+        return Math.floor(Math.abs((d1.getTime() - d2.getTime())) / (60 * 1000));
+    }
+
+    /**
+     * 获取系统时间
+     *
+     * @return
+     */
+    public static Date now() {
+        return new Date();
+    }
+
+    /**
+     * 获取当前月的第一天
+     *
+     * @return
+     */
+    public static String getCurrtenFirstDay() {
+
+        Calendar c = Calendar.getInstance();
+        // c.add(Calendar.MONTH, 0);
+        c.set(Calendar.DAY_OF_MONTH, 1);
+        return new SimpleDateFormat("yyyy-MM-dd").format(c.getTime());
+    }
+
+    /**
+     * 获取当前月的最后一天
+     *
+     * @return
+     */
+    public static String getCurrtenLastDay() {
+
+        Calendar ca = Calendar.getInstance();
+        ca.set(Calendar.DAY_OF_MONTH, ca.getActualMaximum(Calendar.DAY_OF_MONTH));
+        return new SimpleDateFormat("yyyy-MM-dd").format(ca.getTime());
+    }
+    /**
+     * 计算两个时间之间差的小时数(取整后)
+     *
+     * @param d1
+     * @param d2
+     * @return
+     */
+    public static int hoursDiff(Date d1, Date d2) {
+        return (int) Math.floor(Math.abs((d1.getTime() - d2.getTime())) / (60 * 60 * 1000));
+    }
+
+    /**
+     * 获取当前整点数
+     *
+     * @return
+     */
+    public static Date getCurrHourTime(Date date) {
+        Calendar ca = Calendar.getInstance();
+        int minute = ca.get(Calendar.MINUTE);
+        if (minute < 30) {
+            ca.set(Calendar.MINUTE, 30);
+        } else {
+            ca.add(Calendar.HOUR, 1);
+            ca.set(Calendar.MINUTE, 0);
+        }
+
+        ca.set(Calendar.SECOND, 5);
+        date = ca.getTime();
+
+        return date;
+    }
+
+    //普通时间转为UTC
+    public static String localToUTC(String localTimeStr) {
+        try {
+            Date localDate = getLocalSDF().parse(localTimeStr);
+            return getUTCSDF().format(localDate);
+        } catch (ParseException e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+    //UTC转为普通时间
+    public static String utcToLocal(String utcTimeStr) {
+        try {
+            Date date = getUTCSDF().parse(utcTimeStr);
+            return getLocalSDF().format(date);
+
+        } catch (ParseException e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    private static SimpleDateFormat getLocalSDF() {
+        return new SimpleDateFormat(YYYY_MM_DD_HH_MM_SS);
+    }
+
+    private static SimpleDateFormat getUTCSDF() {
+        SimpleDateFormat utcSDF = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
+        utcSDF.setTimeZone(TimeZone.getTimeZone("UTC"));
+        return utcSDF;
+    }
+
+
+    public static void main(String[] args) {
+        System.out.println(getCurrentDate());
+        System.out.println(getPreviousDate(3 * 360 * 24));
+        System.out.println(covertDateTimestamp("2021-12-30 00:00:00"));
+    }
+
+    /**
+     * @return 当天零点
+     */
+    public static Date today0am() {
+        Calendar day = Calendar.getInstance();
+        day.set(Calendar.HOUR_OF_DAY, 0);
+        day.set(Calendar.MINUTE, 0);
+        day.set(Calendar.SECOND, 0);
+        day.set(Calendar.MILLISECOND, 0);
+        return day.getTime();
+    }
+}

+ 152 - 0
power-fetting/src/main/java/com/gyee/power/fetting/common/util/FileUtil.java

@@ -0,0 +1,152 @@
+package com.gyee.power.fetting.common.util;
+
+import com.gyee.power.fetting.common.exception.CustomException;
+import com.gyee.power.fetting.common.result.ResultCode;
+import lombok.extern.slf4j.Slf4j;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.*;
+import java.net.URLEncoder;
+import java.nio.charset.StandardCharsets;
+
+@Slf4j
+public class FileUtil {
+
+    /**
+     * 写入文件
+     *
+     * @param fileName
+     * @param content
+     */
+    public static void writeFile(String fileName, String content) {
+        BufferedWriter bw = null;
+
+        try {
+            File file = new File(fileName);
+            if (!file.exists())
+                file.createNewFile();
+
+            bw = new BufferedWriter(new FileWriter(file, true));
+
+            String[] list = content.split("\n");
+            for(int i = 0; i < list.length; i++){
+                bw.write(list[i]);
+                bw.write("\n");
+                if (i % 500 == 0)
+                    bw.flush();
+            }
+            bw.flush();
+        } catch (Exception e) {
+            log.error(e.getMessage());
+        } finally {
+            try {
+                bw.close();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+    }
+
+    /**
+     * 写入文件
+     *
+     * @param path
+     * @param fileName
+     * @param inputStream
+     */
+    public static void writeFile(String path, String fileName, InputStream inputStream) {
+        OutputStream os = null;
+        try {
+            byte[] bs = new byte[1024];
+            int len;
+
+            File file = new File(path);
+            if (!file.exists()) {
+                file.mkdirs();
+            }
+            os = new FileOutputStream(file.getPath() + File.separator + fileName);
+            // 开始读取
+            while ((len = inputStream.read(bs)) != -1) {
+                os.write(bs, 0, len);
+            }
+
+        } catch (IOException e) {
+            e.printStackTrace();
+            log.error(e.getMessage());
+        } catch (Exception e) {
+            e.printStackTrace();
+            log.error(e.getMessage());
+        } finally {
+            // 完毕,关闭所有链接
+            try {
+                os.close();
+                inputStream.close();
+            } catch (IOException e) {
+                e.printStackTrace();
+                log.error(e.getMessage());
+            }
+        }
+    }
+
+
+    // String -> InputStream
+    public static InputStream convertStringToInputStream(String content) {
+
+        InputStream result = new ByteArrayInputStream(content.getBytes(StandardCharsets.UTF_8));
+        return result;
+
+    }
+
+
+    /**
+     * 加载文件
+     *
+     * @param fileName
+     * @return
+     */
+    public static void download(String fileName, HttpServletResponse response) {
+        FileInputStream fis = null;
+        BufferedInputStream bis = null;
+        try {
+            // 获取文件
+            File file = new File(fileName);
+            // 清空缓冲区,状态码和响应头(headers)
+            response.reset();
+            // 设置ContentType,响应内容为二进制数据流,编码为utf-8,此处设定的编码是文件内容的编码
+            response.setContentType("application/octet-stream;charset=utf-8");
+            // 以(Content-Disposition: attachment; filename="filename.jpg")格式设定默认文件名,设定utf编码,此处的编码是文件名的编码,使能正确显示中文文件名
+            response.setHeader("Content-Disposition", "attachment;fileName=" + file.getName() + ";filename*=utf-8''" + URLEncoder.encode(file.getName(), "utf-8"));
+
+            // 实现文件下载
+            byte[] buffer = new byte[1024];
+            fis = new FileInputStream(file);
+            bis = new BufferedInputStream(fis);
+            // 获取字节流
+            OutputStream os = response.getOutputStream();
+            int i = bis.read(buffer);
+            while (i != -1) {
+                os.write(buffer, 0, i);
+                i = bis.read(buffer);
+            }
+        } catch (FileNotFoundException e) {
+            throw new CustomException(ResultCode.ERROR_FILE_NO);
+        } catch (Exception e) {
+            throw new CustomException(ResultCode.ERROR);
+        } finally {
+            if (bis != null) {
+                try {
+                    bis.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+            if (fis != null) {
+                try {
+                    fis.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+    }
+}

+ 26 - 0
power-fetting/src/main/java/com/gyee/power/fetting/common/util/JudeSystem.java

@@ -0,0 +1,26 @@
+package com.gyee.power.fetting.common.util;
+
+
+/**
+ * 判断当前系统
+ */
+public class JudeSystem {
+
+    public static boolean isLinux() {
+        return System.getProperty("os.name").toLowerCase().contains("linux");
+    }
+
+    public static boolean isWindows() {
+        return System.getProperty("os.name").toLowerCase().contains("windows");
+    }
+
+    public static String judgeSystem() {
+        if (isLinux()) {
+            return "linux";
+        } else if (isWindows()) {
+            return "windows";
+        } else {
+            return "other system";
+        }
+    }
+}

+ 90 - 0
power-fetting/src/main/java/com/gyee/power/fetting/common/util/NumberUtil.java

@@ -0,0 +1,90 @@
+package com.gyee.power.fetting.common.util;
+
+
+import java.math.BigDecimal;
+
+/**
+ * 数字转换中文
+ */
+public class NumberUtil {
+
+    private NumberUtil() { }
+
+    /**
+     * 中文数字
+     */
+    private static final String[] CN_NUM = {"零", "一", "二", "三", "四", "五", "六", "七", "八", "九"};
+    /**
+     * 中文数字单位
+     */
+    private static final String[] CN_UNIT = {"", "十", "百", "千", "万", "十", "百", "千", "亿", "十", "百", "千"};
+    /**
+     * 特殊字符:负
+     */
+    private static final String CN_NEGATIVE = "负";
+    /**
+     * 特殊字符:点
+     */
+    private static final String CN_POINT = "点";
+    /**
+     * int 转 中文数字
+     * 支持到int最大值
+     *
+     * @param intNum 要转换的整型数
+     * @return 中文数字
+     */
+    public static String int2chineseNum(int intNum) {
+        StringBuffer sb = new StringBuffer();
+        boolean isNegative = false;
+        if (intNum < 0) {
+            isNegative = true;
+            intNum *= -1;
+        }
+        int count = 0;
+        while(intNum > 0) {
+            sb.insert(0, CN_NUM[intNum % 10] + CN_UNIT[count]);
+            intNum = intNum / 10;
+            count++;
+        }
+        if (isNegative)
+            sb.insert(0, CN_NEGATIVE);
+        return sb.toString().replaceAll("零[千百十]", "零").replaceAll("零+万", "万")
+                .replaceAll("零+亿", "亿").replaceAll("亿万", "亿零")
+                .replaceAll("零+", "零").replaceAll("零$", "");
+    }
+    /**
+     * bigDecimal 转 中文数字
+     * 整数部分只支持到int的最大值
+     *
+     * @param bigDecimalNum 要转换的BigDecimal数
+     * @return 中文数字
+     */
+    public static String bigDecimal2chineseNum(BigDecimal bigDecimalNum) {
+        if (bigDecimalNum == null)
+            return CN_NUM[0];
+        StringBuffer sb = new StringBuffer();
+        //将小数点后面的零给去除
+        String numStr = bigDecimalNum.abs().stripTrailingZeros().toPlainString();
+        String[] split = numStr.split("\\.");
+        String integerStr = int2chineseNum(Integer.parseInt(split[0]));
+        sb.append(integerStr);
+        //如果传入的数有小数,则进行切割,将整数与小数部分分离
+        if (split.length == 2) {
+            //有小数部分
+            sb.append(CN_POINT);
+            String decimalStr = split[1];
+            char[] chars = decimalStr.toCharArray();
+            for (int i = 0; i < chars.length; i++) {
+                int index = Integer.parseInt(String.valueOf(chars[i]));
+                sb.append(CN_NUM[index]);
+            }
+        }
+        //判断传入数字为正数还是负数
+        int signum = bigDecimalNum.signum();
+        if (signum == -1) {
+            sb.insert(0, CN_NEGATIVE);
+        }
+        return sb.toString();
+    }
+
+}

+ 162 - 0
power-fetting/src/main/java/com/gyee/power/fetting/common/util/SnowFlakeUtil.java

@@ -0,0 +1,162 @@
+package com.gyee.power.fetting.common.util;
+
+
+/**
+ * Twitter_Snowflake<br>
+ * SnowFlake的结构如下(每部分用-分开):<br>
+ * 0 - 0000000000 0000000000 0000000000 0000000000 0 - 00000 - 00000 - 000000000000 <br>
+ * 1位标识,由于long基本类型在Java中是带符号的,最高位是符号位,正数是0,负数是1,所以id一般是正数,最高位是0<br>
+ * 41位时间截(毫秒级),注意,41位时间截不是存储当前时间的时间截,而是存储时间截的差值(当前时间截 - 开始时间截)
+ * 得到的值),这里的的开始时间截,一般是我们的id生成器开始使用的时间,由我们程序来指定的(如下下面程序IdWorker类的startTime属性)。41位的时间截,可以使用69年,年T = (1L << 41) / (1000L * 60 * 60 * 24 * 365) = 69<br>
+ * 10位的数据机器位,可以部署在1024个节点,包括5位datacenterId和5位workerId<br>
+ * 12位序列,毫秒内的计数,12位的计数顺序号支持每个节点每毫秒(同一机器,同一时间截)产生4096个ID序号<br>
+ * 加起来刚好64位,为一个Long型。<br>
+ * SnowFlake的优点是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由数据中心ID和机器ID作区分),并且效率较高,经测试,SnowFlake每秒能够产生26万ID左右。
+ */
+public class SnowFlakeUtil {
+
+    // ==============================Fields===========================================
+    /** 开始时间截 (2015-01-01) */
+    private final long twepoch = 1420041600000L;
+
+    /** 机器id所占的位数 */
+    private final long workerIdBits = 5L;
+
+    /** 数据标识id所占的位数 */
+    private final long datacenterIdBits = 5L;
+
+    /** 支持的最大机器id,结果是31 (这个移位算法可以很快的计算出几位二进制数所能表示的最大十进制数) */
+    private final long maxWorkerId = -1L ^ (-1L << workerIdBits);
+
+    /** 支持的最大数据标识id,结果是31 */
+    private final long maxDatacenterId = -1L ^ (-1L << datacenterIdBits);
+
+    /** 序列在id中占的位数 */
+    private final long sequenceBits = 12L;
+
+    /** 机器ID向左移12位 */
+    private final long workerIdShift = sequenceBits;
+
+    /** 数据标识id向左移17位(12+5) */
+    private final long datacenterIdShift = sequenceBits + workerIdBits;
+
+    /** 时间截向左移22位(5+5+12) */
+    private final long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits;
+
+    /** 生成序列的掩码,这里为4095 (0b111111111111=0xfff=4095) */
+    private final long sequenceMask = -1L ^ (-1L << sequenceBits);
+
+    /** 工作机器ID(0~31) */
+    private long workerId;
+
+    /** 数据中心ID(0~31) */
+    private long datacenterId;
+
+    /** 毫秒内序列(0~4095) */
+    private long sequence = 0L;
+
+    /** 上次生成ID的时间截 */
+    private long lastTimestamp = -1L;
+
+    //==============================Constructors=====================================
+    /**
+     * 构造函数
+     * @param workerId 工作ID (0~31)
+     * @param datacenterId 数据中心ID (0~31)
+     */
+    public SnowFlakeUtil(long workerId, long datacenterId) {
+        if (workerId > maxWorkerId || workerId < 0) {
+            throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId));
+        }
+        if (datacenterId > maxDatacenterId || datacenterId < 0) {
+            throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId));
+        }
+        this.workerId = workerId;
+        this.datacenterId = datacenterId;
+    }
+
+    // ==============================Methods==========================================
+    /**
+     * 获得下一个ID (该方法是线程安全的)
+     * @return SnowflakeId
+     */
+    public synchronized long nextId() {
+        long timestamp = timeGen();
+
+        //如果当前时间小于上一次ID生成的时间戳,说明系统时钟回退过这个时候应当抛出异常
+        if (timestamp < lastTimestamp) {
+            throw new RuntimeException(
+                    String.format("Clock moved backwards.  Refusing to generate id for %d milliseconds", lastTimestamp - timestamp));
+        }
+
+        //如果是同一时间生成的,则进行毫秒内序列
+        if (lastTimestamp == timestamp) {
+            sequence = (sequence + 1) & sequenceMask;
+            //毫秒内序列溢出
+            if (sequence == 0) {
+                //阻塞到下一个毫秒,获得新的时间戳
+                timestamp = tilNextMillis(lastTimestamp);
+            }
+        }
+        //时间戳改变,毫秒内序列重置
+        else {
+            sequence = 0L;
+        }
+
+        //上次生成ID的时间截
+        lastTimestamp = timestamp;
+
+        //移位并通过或运算拼到一起组成64位的ID
+        return ((timestamp - twepoch) << timestampLeftShift) //
+                | (datacenterId << datacenterIdShift) //
+                | (workerId << workerIdShift) //
+                | sequence;
+    }
+
+    /**
+     * 阻塞到下一个毫秒,直到获得新的时间戳
+     * @param lastTimestamp 上次生成ID的时间截
+     * @return 当前时间戳
+     */
+    protected long tilNextMillis(long lastTimestamp) {
+        long timestamp = timeGen();
+        while (timestamp <= lastTimestamp) {
+            timestamp = timeGen();
+        }
+        return timestamp;
+    }
+
+    /**
+     * 返回以毫秒为单位的当前时间
+     * @return 当前时间(毫秒)
+     */
+    protected long timeGen() {
+        return System.currentTimeMillis();
+    }
+
+
+    private static SnowFlakeUtil idWorker = null;
+
+    public static String generateId() {
+        if (idWorker == null)
+            idWorker = new SnowFlakeUtil(0, 0);
+
+        return String.valueOf(idWorker.nextId());
+//        for (int i = 0; i < 1000; i++) {
+//            long id = idWorker.nextId();
+//            System.out.println(Long.toBinaryString(id));
+//            System.out.println(id);
+//        }
+    }
+    public static Long generateIdL() {
+        if (idWorker == null)
+            idWorker = new SnowFlakeUtil(0, 0);
+
+        return idWorker.nextId();
+//        for (int i = 0; i < 1000; i++) {
+//            long id = idWorker.nextId();
+//            System.out.println(Long.toBinaryString(id));
+//            System.out.println(id);
+//        }
+    }
+}

+ 45 - 0
power-fetting/src/main/java/com/gyee/power/fetting/common/util/TokenGenerator.java

@@ -0,0 +1,45 @@
+package com.gyee.power.fetting.common.util;
+
+import java.security.MessageDigest;
+import java.util.UUID;
+
+public class TokenGenerator {
+
+    private TokenGenerator(){}
+
+    public static String generateValue() {
+        return generateValue(UUID.randomUUID().toString());
+    }
+
+    private static final char[] hexCode = "asdfghjkqwert4841632128".toCharArray();
+
+    private static String toHexString(byte[] data) {
+        if (data == null) {
+            return null;
+        }
+        StringBuilder r = new StringBuilder(data.length * 2);
+        for (byte b : data) {
+            r.append(hexCode[(b >> 4) & 0xF]);
+            r.append(hexCode[(b & 0xF)]);
+        }
+        return r.toString();
+    }
+
+    /**
+     * 生成Token
+     * @param param
+     * @return
+     */
+    private static String generateValue(String param) {
+        try {
+            MessageDigest algorithm = MessageDigest.getInstance("MD5");
+            algorithm.reset();
+            algorithm.update(param.getBytes());
+            byte[] messageDigest = algorithm.digest();
+            return toHexString(messageDigest);
+        } catch (Exception e) {
+            throw new RuntimeException("生成Token失败");
+        }
+    }
+
+}

+ 19 - 0
power-fetting/src/main/java/com/gyee/power/fetting/mapper/WindpowerstationMapper.java

@@ -0,0 +1,19 @@
+package com.gyee.power.fetting.mapper;
+
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.gyee.power.fetting.model.Windpowerstation;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author chenmh
+ * @since 2022-11-01
+ */
+@Mapper
+public interface WindpowerstationMapper extends BaseMapper<Windpowerstation> {
+
+}

+ 19 - 0
power-fetting/src/main/java/com/gyee/power/fetting/mapper/WindturbineMapper.java

@@ -0,0 +1,19 @@
+package com.gyee.power.fetting.mapper;
+
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.gyee.power.fetting.model.Windturbine;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author chenmh
+ * @since 2022-11-01
+ */
+@Mapper
+public interface WindturbineMapper extends BaseMapper<Windturbine> {
+
+}

+ 96 - 0
power-fetting/src/main/java/com/gyee/power/fetting/model/Windpowerstation.java

@@ -0,0 +1,96 @@
+package com.gyee.power.fetting.model;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import java.time.LocalDate;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableField;
+import java.io.Serializable;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author chenmh
+ * @since 2022-11-01
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@TableName("WINDPOWERSTATION")
+public class Windpowerstation extends Model<Windpowerstation> {
+
+    private static final long serialVersionUID=1L;
+
+      @TableId("ID")
+    private String id;
+
+    @TableField("CODE")
+    private String code;
+
+    @TableField("NAME")
+    private String name;
+
+    @TableField("ADDRESS")
+    private String address;
+
+    @TableField("TELEPHONE")
+    private String telephone;
+
+    @TableField("CAPACITY")
+    private String capacity;
+
+    @TableField("CAPACITYUNIT")
+    private String capacityunit;
+
+    @TableField("QUANTITY")
+    private String quantity;
+
+    @TableField("ANAME")
+    private String aname;
+
+    @TableField("LONGITUDE")
+    private String longitude;
+
+    @TableField("LATITUDE")
+    private String latitude;
+
+    @TableField("PHOTO")
+    private String photo;
+
+    @TableField("COMPANYID")
+    private String companyid;
+
+    @TableField("SYSTEMMANUFACT")
+    private String systemmanufact;
+
+    @TableField("HEADFARM")
+    private String headfarm;
+
+    @TableField("HEADFARMPHONE")
+    private String headfarmphone;
+
+    @TableField("MODEL")
+    private String model;
+
+    @TableField("ORDERNUM")
+    private String ordernum;
+
+    @TableField("ALTITUDE")
+    private String altitude;
+
+    @TableField("HEIGHT")
+    private String height;
+
+    @TableField("AQTS")
+    private LocalDate aqts;
+
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+}

+ 72 - 0
power-fetting/src/main/java/com/gyee/power/fetting/model/Windturbine.java

@@ -0,0 +1,72 @@
+package com.gyee.power.fetting.model;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import java.time.LocalDate;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableField;
+import java.io.Serializable;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author chenmh
+ * @since 2022-11-01
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@TableName("WINDTURBINE")
+public class Windturbine extends Model<Windturbine> {
+
+    private static final long serialVersionUID=1L;
+
+      @TableId("ID")
+    private String id;
+
+    @TableField("CODE")
+    private String code;
+
+    @TableField("WINDPOWERSTATIONID")
+    private String windpowerstationid;
+
+    @TableField("LONGITUDE")
+    private String longitude;
+
+    @TableField("LATITUDE")
+    private String latitude;
+
+    @TableField("MODELID")
+    private String modelid;
+
+    @TableField("STATUS")
+    private String status;
+
+    @TableField("PROJECTID")
+    private String projectid;
+
+    @TableField("LINEID")
+    private String lineid;
+
+    @TableField("FIRSTINTEGRATEDTIME")
+    private LocalDate firstintegratedtime;
+
+    @TableField("PHOTO")
+    private String photo;
+
+    @TableField("NAME")
+    private String name;
+
+    @TableField("STANDARDID")
+    private String standardid;
+
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+}

+ 34 - 0
power-fetting/src/main/java/com/gyee/power/fetting/model/custom/TsDoubleData.java

@@ -0,0 +1,34 @@
+package com.gyee.power.fetting.model.custom;
+
+public class TsDoubleData {
+
+    private long ts;
+    private int status;
+    private double doubleValue;
+
+    public long getTs() {
+        return ts;
+    }
+
+    public void setTs(long ts) {
+        this.ts = ts;
+    }
+
+    public int getStatus() {
+        return status;
+    }
+
+    public void setStatus(int status) {
+        this.status = status;
+    }
+
+    public double getDoubleValue() {
+//        BigDecimal bg = new BigDecimal(doubleValue);
+//        double v = bg.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
+        return doubleValue;
+    }
+
+    public void setDoubleValue(double doubleValue) {
+        this.doubleValue = doubleValue;
+    }
+}

+ 25 - 0
power-fetting/src/main/java/com/gyee/power/fetting/service/WindpowerstationService.java

@@ -0,0 +1,25 @@
+package com.gyee.power.fetting.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.gyee.power.fetting.model.Windpowerstation;
+
+import java.util.List;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author chenmh
+ * @since 2022-11-01
+ */
+public interface WindpowerstationService extends IService<Windpowerstation> {
+
+
+    /**
+     * 查询所有的场站
+     * @return
+     */
+    List<Windpowerstation> selectList();
+
+}

+ 24 - 0
power-fetting/src/main/java/com/gyee/power/fetting/service/WindturbineService.java

@@ -0,0 +1,24 @@
+package com.gyee.power.fetting.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.gyee.power.fetting.model.Windturbine;
+
+import java.util.List;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author chenmh
+ * @since 2022-11-01
+ */
+public interface WindturbineService extends IService<Windturbine> {
+
+    /**
+     * 查询所有的风机ID
+     * @return
+     */
+    List<Windturbine> selectList();
+
+}

+ 40 - 0
power-fetting/src/main/java/com/gyee/power/fetting/service/impl/WindpowerstationServiceImpl.java

@@ -0,0 +1,40 @@
+package com.gyee.power.fetting.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.gyee.power.fetting.common.base.ExcludeQueryWrapper;
+import com.gyee.power.fetting.mapper.WindpowerstationMapper;
+import com.gyee.power.fetting.model.Windpowerstation;
+import com.gyee.power.fetting.service.WindpowerstationService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author chenmh
+ * @since 2022-11-01
+ */
+@Slf4j
+@Service
+public class WindpowerstationServiceImpl extends ServiceImpl<WindpowerstationMapper, Windpowerstation> implements WindpowerstationService {
+
+    @Override
+    public List<Windpowerstation> selectList() {
+        List<Windpowerstation> list = new ArrayList();
+
+        ExcludeQueryWrapper wrapper = new ExcludeQueryWrapper();
+
+        try{
+            list = baseMapper.selectList(wrapper);
+        }catch (Exception e){
+            log.error("WindpowerstationServiceImpl", e.getMessage());
+        }
+
+        return list;
+    }
+}

+ 40 - 0
power-fetting/src/main/java/com/gyee/power/fetting/service/impl/WindturbineServiceImpl.java

@@ -0,0 +1,40 @@
+package com.gyee.power.fetting.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.gyee.power.fetting.common.base.ExcludeQueryWrapper;
+import com.gyee.power.fetting.mapper.WindturbineMapper;
+import com.gyee.power.fetting.model.Windturbine;
+import com.gyee.power.fetting.service.WindturbineService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author chenmh
+ * @since 2022-11-01
+ */
+@Slf4j
+@Service
+public class WindturbineServiceImpl extends ServiceImpl<WindturbineMapper, Windturbine> implements WindturbineService {
+
+    @Override
+    public List<Windturbine> selectList() {
+        List<Windturbine> list = new ArrayList();
+
+        ExcludeQueryWrapper wrapper = new ExcludeQueryWrapper();
+
+        try{
+            list = baseMapper.selectList(wrapper);
+        }catch (Exception e){
+            log.error("WindturbineServiceImpl", e.getMessage());
+        }
+
+        return list;
+    }
+}

+ 64 - 0
power-fetting/src/main/resources/application.yaml

@@ -0,0 +1,64 @@
+gyee:
+  # 实时适配器的url
+  adapter-url: http://10.155.32.4:8011
+  # 数据准备路径(原始数据)
+  file-path-prepare: /home/gyee/data/prepare
+  # 数据处理路径(处理完的数据)
+  file-path-process: /home/gyee/data/precess
+
+server:
+  port: 9002
+  servlet:
+    encoding:
+      charset: utf-8
+      force: true
+      enabled: true
+  max-http-header-size: 4048576
+
+spring:
+  servlet:
+    multipart:
+      max-file-size: 2048MB
+      max-request-size: 2048MB
+  main:
+    allow-bean-definition-overriding: false #当遇到同样名字的时候,是否允许覆盖注册
+  datasource:
+    type: com.alibaba.druid.pool.DruidDataSource
+    druid:
+      #kudu数据库
+      master:
+        driver-class-name: com.cloudera.impala.jdbc41.Driver
+        jdbc-url: jdbc:impala://192.168.1.62:21050/gyee_sample_kudu
+
+      # 初始化大小,最小,最大
+      initial-size: 1
+      min-idle: 1
+      max-active: 1
+      max-wait: 60000
+      # 每次使用连接时进行校验,会影响系统性能。默认为false
+      test-on-borrow: false
+      test-on-return: false
+      # 验证使用的SQL语句
+      validation-query: SELECT 1
+      # 指明连接是否被空闲连接回收器(如果有)进行检验.如果检测失败,则连接将被从池中去除
+      while: true
+      # 每30秒运行一次空闲连接回收器(默认-1)
+      time-between-eviction-runs-millis: 60000
+      # 池中的连接空闲30分钟后被回收(默认30分钟)
+      min-evictable-idle-time-millis: 1800000
+
+
+####################Mybatis Plus配置####################
+mybatis-plus:
+  configuration:
+    map-underscore-to-camel-case: true # 数据库下划线自动转驼峰标示关闭
+    # log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
+####################Mybatis Plus配置####################
+
+
+logging:
+  level:
+    root: info
+    com.example: debug
+  file:
+    path: ./logs

+ 35 - 0
power-fetting/src/main/resources/mapper/WindpowerstationMapper.xml

@@ -0,0 +1,35 @@
+<?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.gyee.power.fetting.mapper.WindpowerstationMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.gyee.power.fetting.model.Windpowerstation">
+        <id column="ID" property="id" />
+        <result column="CODE" property="code" />
+        <result column="NAME" property="name" />
+        <result column="ADDRESS" property="address" />
+        <result column="TELEPHONE" property="telephone" />
+        <result column="CAPACITY" property="capacity" />
+        <result column="CAPACITYUNIT" property="capacityunit" />
+        <result column="QUANTITY" property="quantity" />
+        <result column="ANAME" property="aname" />
+        <result column="LONGITUDE" property="longitude" />
+        <result column="LATITUDE" property="latitude" />
+        <result column="PHOTO" property="photo" />
+        <result column="COMPANYID" property="companyid" />
+        <result column="SYSTEMMANUFACT" property="systemmanufact" />
+        <result column="HEADFARM" property="headfarm" />
+        <result column="HEADFARMPHONE" property="headfarmphone" />
+        <result column="MODEL" property="model" />
+        <result column="ORDERNUM" property="ordernum" />
+        <result column="ALTITUDE" property="altitude" />
+        <result column="HEIGHT" property="height" />
+        <result column="AQTS" property="aqts" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        ID, CODE, NAME, ADDRESS, TELEPHONE, CAPACITY, CAPACITYUNIT, QUANTITY, ANAME, LONGITUDE, LATITUDE, PHOTO, COMPANYID, SYSTEMMANUFACT, HEADFARM, HEADFARMPHONE, MODEL, ORDERNUM, ALTITUDE, HEIGHT, AQTS
+    </sql>
+
+</mapper>

+ 27 - 0
power-fetting/src/main/resources/mapper/WindturbineMapper.xml

@@ -0,0 +1,27 @@
+<?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.gyee.power.fetting.mapper.WindturbineMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.gyee.power.fetting.model.Windturbine">
+        <id column="ID" property="id" />
+        <result column="CODE" property="code" />
+        <result column="WINDPOWERSTATIONID" property="windpowerstationid" />
+        <result column="LONGITUDE" property="longitude" />
+        <result column="LATITUDE" property="latitude" />
+        <result column="MODELID" property="modelid" />
+        <result column="STATUS" property="status" />
+        <result column="PROJECTID" property="projectid" />
+        <result column="LINEID" property="lineid" />
+        <result column="FIRSTINTEGRATEDTIME" property="firstintegratedtime" />
+        <result column="PHOTO" property="photo" />
+        <result column="NAME" property="name" />
+        <result column="STANDARDID" property="standardid" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        ID, CODE, WINDPOWERSTATIONID, LONGITUDE, LATITUDE, MODELID, STATUS, PROJECTID, LINEID, FIRSTINTEGRATEDTIME, PHOTO, NAME, STANDARDID
+    </sql>
+
+</mapper>