Jelajahi Sumber

测试 场站数据对象

weiyigulu 3 tahun lalu
induk
melakukan
9e9a48f094

+ 1 - 1
ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/repository/OverhaulPlanRepository.java

@@ -23,7 +23,7 @@ public interface OverhaulPlanRepository extends BaseRepository<OverhaulPlan, Int
 
     List<OverhaulPlan> findByEndTimeGreaterThanEqualAndStartTimeLessThanEqualAndStatusAndStationCode(Long stTime, Long eTime, Integer status, String stationCode);
 
-    List<OverhaulPlan> findByStartTimeLessThanAndEndTimeGreaterThanAndStatus(Long startTime, Long endTime, Integer status);
+    List<OverhaulPlan> findByStartTimeLessThanAndEndTimeGreaterThanAndStatusAndStationCode(Long startTime, Long endTime, Integer status,String stationCode);
 
     List<OverhaulPlan> findByEndTimeAfterAndStatus(Long time, Integer status);
 

+ 1 - 0
ipfcst-console/src/main/java/com/jiayue/ipfcst/ConsoleApplication.java

@@ -51,6 +51,7 @@ public class ConsoleApplication {
       ResourceLeakDetector.setLevel(ResourceLeakDetector.Level.ADVANCED);
         //变更配置文件读取位置启动
         new SpringApplicationBuilder(ConsoleApplication.class).run(args);
+
     }
 
     /**

+ 12 - 0
ipfcst-console/src/main/java/com/jiayue/ipfcst/console/service/OverHaulPlanService.java

@@ -10,6 +10,7 @@ import org.springframework.data.domain.*;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.math.BigDecimal;
 import java.util.ArrayList;
 import java.util.Calendar;
 import java.util.Date;
@@ -102,6 +103,17 @@ public class OverHaulPlanService {
 
   }
 
+
+  public BigDecimal getOverhaulCapacityByStationCode(String stationCode){
+      BigDecimal overhaulCapacity = new BigDecimal(0);
+      long time = System.currentTimeMillis();
+      List<OverhaulPlan> overhaulPlans = overhaulPlanRepository.findByStartTimeLessThanAndEndTimeGreaterThanAndStatusAndStationCode(time, time, 1,stationCode);
+      if(overhaulPlans.size()>0){
+        overhaulCapacity = overhaulPlans.get(0).getOverhaulCapactity();
+      }
+      return overhaulCapacity;
+  }
+
   /**
    * 查询检修计划信息
    */

+ 84 - 147
ipfcst-console/src/main/java/com/jiayue/ipfcst/console/service/PowerStationDataPacker.java

@@ -10,7 +10,6 @@ import com.jiayue.ipfcst.common.core.util.SunRiseSet;
 import com.jiayue.ipfcst.common.data.abst.equipmentstatus.AbstractEquipmentStatusData;
 import com.jiayue.ipfcst.common.data.constant.enums.ElectricFieldTypeEnum;
 import com.jiayue.ipfcst.common.data.entity.*;
-import com.jiayue.ipfcst.common.data.repository.PowerLimitPlanSignRepository;
 import com.jiayue.ipfcst.console.service.powerofreference.BasePowerOfReferenceCalculator;
 import com.jiayue.ipfcst.console.service.powerofreference.iml.PowerOfReferenceCalculator1;
 import com.jiayue.ipfcst.console.service.powerofreference.iml.PowerOfReferenceCalculator2;
@@ -22,7 +21,6 @@ import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang.StringUtils;
 import org.joda.time.DateTime;
 import org.joda.time.LocalTime;
-import org.springframework.beans.factory.annotation.Autowired;
 
 import java.lang.reflect.Field;
 import java.math.BigDecimal;
@@ -85,15 +83,11 @@ public class PowerStationDataPacker {
    */
   private static final String YBJSF = "ybjsf";
 
-  /**
-   * 是否对实际功率进行考核验证   0  不验证   1  验证
-   */
-  private static final String AUDITREALPOWER = "auditRealPower";
 
   /**
    * 理论功率公式
    */
-  private static final String LLGLGS ="kyglgs";
+  private static final String LLGLGS = "kyglgs";
 
 
   /**
@@ -117,7 +111,7 @@ public class PowerStationDataPacker {
   /**
    * 场站信息
    */
-  private ElectricField electricField;
+  private final ElectricField electricField;
   /**
    * 测风/光法 的公式计算器
    */
@@ -126,17 +120,7 @@ public class PowerStationDataPacker {
   /**
    * 实际功率是否需要审核的标志 默认不审核
    */
-  private Boolean auditRealPower = false;
-
-  /**
-   * 人工控制限电的标识
-   * 0  以系统判断结果为准
-   * 1 限电
-   * 2 不限电
-   * 现在由于页面展示的原因  仅开放两种状态   是否限电 1.限电 0.不限电
-   * 没有以系统判断结果为准 在不限电的时候默认系统判断结果进行干预
-   */
-  private Integer rationingByManualControl = 0;
+  private static final Boolean AUDIT_REAL_POWER = false;
 
 
   /**
@@ -151,74 +135,29 @@ public class PowerStationDataPacker {
   /**
    * 系统配置变量获取类
    */
-  SysParameterService sysParameterService= SpringContextHolder.getBean(SysParameterService.class);
-  /**
-   * 用于从数据库内获取限电状态
-   */
-  PowerLimitPlanSignRepository powerLimitPlanSignRepository= SpringContextHolder.getBean(PowerLimitPlanSignRepository.class);
+  SysParameterService sysParameterService = SpringContextHolder.getBean(SysParameterService.class);
 
   /**
    * 查询检修信息
    */
-  OverHaulPlanService overHaulPlanService= SpringContextHolder.getBean(OverHaulPlanService.class);
-  /**
-   * 查询场站的具体信息
-   */
-  ElectricFieldService electricFieldService= SpringContextHolder.getBean(ElectricFieldService.class);
+  OverHaulPlanService overHaulPlanService = SpringContextHolder.getBean(OverHaulPlanService.class);
 
   /**
    * 获取短期
    */
-  ForecastPowerShortTermService forecastPowerShortTermService=SpringContextHolder.getBean(ForecastPowerShortTermService.class);
+  ForecastPowerShortTermService forecastPowerShortTermService = SpringContextHolder.getBean(ForecastPowerShortTermService.class);
   /**
    * 获取超短期
    */
 
-  ForecastPowerUltraShortTermService forecastPowerUltraShortTermService=SpringContextHolder.getBean(ForecastPowerUltraShortTermService.class);
-  /**
-   * 风机信息的查询 方便推算样板机数据
-   */
-  protected WindTurbineInfoService windTurbineInfoService=SpringContextHolder.getBean(WindTurbineInfoService.class);
+  ForecastPowerUltraShortTermService forecastPowerUltraShortTermService = SpringContextHolder.getBean(ForecastPowerUltraShortTermService.class);
 
-  /**
-   * 逆变器信息查询
-   */
-  protected InverterInfoService inverterInfoService=SpringContextHolder.getBean(InverterInfoService.class);
 
   /**
    * redis 工具
    */
-  private RedisUtils redisUtils=SpringContextHolder.getBean(RedisUtils.class);;
+  private final RedisUtils redisUtils = SpringContextHolder.getBean(RedisUtils.class);
 
-  /**
-   * 根据数据库的限电状态记录加载初始的
-   * 当数据库里面没有记录时默认 0  不限电
-   */
-  public Integer getRationingByManualControl() {
-    List<PowerLimitPlanSign> list = powerLimitPlanSignRepository.findAllByStationCode(electricField.getStationCode());
-    if (list.size() > 0) {
-      this.rationingByManualControl = list.get(list.size() - 1).getSign();
-    } else {
-      this.rationingByManualControl = 0;
-    }
-    return this.rationingByManualControl;
-  }
-
-  /**
-   * 对DashboardService 开放的手动控制限电的状态修改方法
-   * 用于页面上修改后进行通知
-   *
-   * @param powerLimitPlanSign
-   */
-  public void setRationingByManualControl(PowerLimitPlanSign powerLimitPlanSign) {
-    if (powerLimitPlanSign != null) {
-      this.rationingByManualControl = powerLimitPlanSign.getSign();
-    }
-  }
-
-  public void setRationingByManualControl(Integer sign) {
-    this.rationingByManualControl = sign;
-  }
 
   /**
    * 对实际功率合理性进行审核 查看实际功率的合理性
@@ -228,7 +167,7 @@ public class PowerStationDataPacker {
    */
   public BigDecimal realPowerRationalityAuditor(BigDecimal power) {
     DateTime time = DateTime.now();
-    if (electricField != null && electricField.getCapacity() != null && power.compareTo(electricField.getCapacity()) == 1) {
+    if (electricField != null && electricField.getCapacity() != null && power.compareTo(electricField.getCapacity()) > 0) {
       //当实际功率超过场站的容量时  返回容量
       power = electricField.getCapacity();
       if (power.compareTo(BigDecimal.ZERO) < 0) {
@@ -286,7 +225,7 @@ public class PowerStationDataPacker {
     if (realPower == null) {
       return BigDecimal.valueOf(-99D);
     }
-    if (this.auditRealPower) {
+    if (AUDIT_REAL_POWER) {
       return realPowerRationalityAuditor(realPower);
     } else {
       BigDecimal power = realPower;
@@ -333,9 +272,9 @@ public class PowerStationDataPacker {
    */
   private void initReferenceCalculator() {
     if ("1".equals(sysParameterService.getSysParameter(YBJSF, "1", electricField.getStationCode()))) {
-      this.powerOfReferenceCalculatorBySample = new PowerOfReferenceCalculator1(windTurbineInfoService, inverterInfoService, electricFieldService.getOne(electricField.getStationCode())).init();
+      this.powerOfReferenceCalculatorBySample = new PowerOfReferenceCalculator1(electricField).init();
     } else {
-      this.powerOfReferenceCalculatorBySample = new PowerOfReferenceCalculator2(windTurbineInfoService, inverterInfoService, electricFieldService.getOne(electricField.getStationCode())).init();
+      this.powerOfReferenceCalculatorBySample = new PowerOfReferenceCalculator2(electricField).init();
     }
   }
 
@@ -351,12 +290,12 @@ public class PowerStationDataPacker {
     BigDecimal baseLinePower = electricField.getCapacity().multiply(new BigDecimal(sysParameterService.getSysParameter(SFPDXD, "1", electricField.getStationCode())));
     BigDecimal coefficient = new BigDecimal(sysParameterService.getSysParameter(XDXS, "0.2", electricField.getStationCode())).add(BigDecimal.valueOf(1));
     BigDecimal referencePower = this.getPowerOfReference(powerStationStatusData);
-    if (powerStationStatusData.getRealValue().compareTo(baseLinePower) == -1) {
+    if (powerStationStatusData.getRealValue().compareTo(baseLinePower) < 0) {
       //实际功率 小于容量的 n%  不统计是否限电  全部视为不限电
       return false;
     } else {
       //参照功率 - 实际功率 > 实际功率 * 限电系数  ??  大于就限电 小于就不限电
-      return referencePower.compareTo(powerStationStatusData.getRealValue().multiply(coefficient)) == 1;
+      return referencePower.compareTo(powerStationStatusData.getRealValue().multiply(coefficient)) > 0;
     }
   }
 
@@ -409,50 +348,49 @@ public class PowerStationDataPacker {
       //设定并网设备数
       powerStationStatusData.setOnGridNum(electricField.getGridCE());
       //设定开机容量为装机容量
-      powerStationStatusData.setOpenCapacity(electricField.getCapacity().subtract(overHaulPlanService.getOverhaulCapacity()));
+      powerStationStatusData.setOpenCapacity(electricField.getCapacity().subtract(overHaulPlanService.getOverhaulCapacityByStationCode(electricField.getStationCode())));
       //设定场站状态
       powerStationStatusData.setStatus(electricField.getElectricFieldTypeEnum().getCode());
       //设定实际功率
       powerStationStatusData.setRealValue(getRealPowerVal(realPower));
       //设定 样板机参照功率
       powerStationStatusData.setReferencePowerBySample(powerOfReferenceCalculatorBySample.getEstimatePower());
-      if (powerStationStatusData.getReferencePowerBySample() == null || powerStationStatusData.getReferencePowerBySample().compareTo(powerStationStatusData.getRealValue()) == -1) {
+      if (powerStationStatusData.getReferencePowerBySample() == null || powerStationStatusData.getReferencePowerBySample().compareTo(powerStationStatusData.getRealValue()) < 0) {
         log.warn("样板机法计算值小于实际功率异常,值为:" + powerStationStatusData.getReferencePowerBySample());
         powerStationStatusData.setAbnormalOfSample(powerStationStatusData.getReferencePowerBySample());
-        powerStationStatusData.setReferencePowerBySample(((electricField.getCapacity().subtract(powerStationStatusData.getRealValue())).multiply(BigDecimal.valueOf(random.nextFloat())).multiply(BigDecimal.valueOf(0.001))).add(powerStationStatusData.getRealValue()).setScale(2, BigDecimal.ROUND_HALF_UP));
-      } else if (powerStationStatusData.getReferencePowerBySample().compareTo(powerStationStatusData.getCapacity()) == 1) {
+        powerStationStatusData.setReferencePowerBySample(((electricField.getCapacity().subtract(powerStationStatusData.getRealValue())).multiply(BigDecimal.valueOf(random.nextFloat())).multiply(BigDecimal.valueOf(0.001))).add(powerStationStatusData.getRealValue()).setScale(2, RoundingMode.HALF_UP));
+      } else if (powerStationStatusData.getReferencePowerBySample().compareTo(powerStationStatusData.getCapacity()) > 0) {
         log.warn("样板机法计算值超装机容量异常,值为:" + powerStationStatusData.getReferencePowerBySample());
         powerStationStatusData.setAbnormalOfSample(powerStationStatusData.getReferencePowerBySample());
         powerStationStatusData.setReferencePowerBySample(powerStationStatusData.getCapacity());
       }
-      powerStationStatusData.setAblePowerBySample(powerOfReferenceCalculatorBySample.getEstimatePower().multiply(getOpenRatio()).setScale(2, BigDecimal.ROUND_HALF_UP));
+      powerStationStatusData.setAblePowerBySample(powerOfReferenceCalculatorBySample.getEstimatePower().multiply(getOpenRatio()).setScale(2, RoundingMode.HALF_UP));
       if (powerStationStatusData.getAblePowerBySample().compareTo(powerStationStatusData.getRealValue()) < 0) {
         powerStationStatusData.setAblePowerBySample(powerStationStatusData.getReferencePowerBySample());
       }
       //设定 测风光法参照功率
       if (this.calculatorOfMeasuring != null) {
-        powerStationStatusData.setReferencePowerByMeasuring(this.calculatorOfMeasuring.getData().setScale(2, BigDecimal.ROUND_HALF_UP));
+        powerStationStatusData.setReferencePowerByMeasuring(this.calculatorOfMeasuring.getData().setScale(2, RoundingMode.HALF_UP));
       }
-      if (powerStationStatusData.getReferencePowerByMeasuring() == null || powerStationStatusData.getReferencePowerByMeasuring().compareTo(powerStationStatusData.getRealValue()) == -1) {
+      if (powerStationStatusData.getReferencePowerByMeasuring() == null || powerStationStatusData.getReferencePowerByMeasuring().compareTo(powerStationStatusData.getRealValue()) < 0) {
         log.warn("测风光法计算值小于实际功率异常,值为:" + powerStationStatusData.getReferencePowerByMeasuring());
         powerStationStatusData.setAbnormalOfMeasuring(powerStationStatusData.getReferencePowerByMeasuring());
-        powerStationStatusData.setReferencePowerByMeasuring(((electricField.getCapacity().subtract(powerStationStatusData.getRealValue())).multiply(BigDecimal.valueOf(random.nextFloat())).multiply(BigDecimal.valueOf(0.001))).add(powerStationStatusData.getRealValue()).setScale(2, BigDecimal.ROUND_HALF_UP));
-      } else if (powerStationStatusData.getReferencePowerByMeasuring().compareTo(powerStationStatusData.getCapacity()) == 1) {
+        powerStationStatusData.setReferencePowerByMeasuring(((electricField.getCapacity().subtract(powerStationStatusData.getRealValue())).multiply(BigDecimal.valueOf(random.nextFloat())).multiply(BigDecimal.valueOf(0.001))).add(powerStationStatusData.getRealValue()).setScale(2, RoundingMode.HALF_UP));
+      } else if (powerStationStatusData.getReferencePowerByMeasuring().compareTo(powerStationStatusData.getCapacity()) > 0) {
         log.warn("测风光法计算值超装机容量异常,值为:" + powerStationStatusData.getReferencePowerByMeasuring());
         powerStationStatusData.setAbnormalOfMeasuring(powerStationStatusData.getReferencePowerByMeasuring());
         powerStationStatusData.setReferencePowerByMeasuring(powerStationStatusData.getCapacity());
       }
-      powerStationStatusData.setAblePowerByMeasuring(powerStationStatusData.getReferencePowerByMeasuring().multiply(getOpenRatio()).setScale(2, BigDecimal.ROUND_HALF_UP));
+      powerStationStatusData.setAblePowerByMeasuring(powerStationStatusData.getReferencePowerByMeasuring().multiply(getOpenRatio()).setScale(2, RoundingMode.HALF_UP));
       if (powerStationStatusData.getAblePowerByMeasuring().compareTo(powerStationStatusData.getRealValue()) < 0) {
         powerStationStatusData.setAblePowerByMeasuring(powerStationStatusData.getReferencePowerByMeasuring());
       }
       boolean isRationing = judgeIsRationing(powerStationStatusData);
       //设定是否限电
       powerStationStatusData.setIsRationingByAutoControl(isRationing);
-      //设定手动限电的状态
-      powerStationStatusData.setIsRationingByManualControl(getRationingByManualControl());
+
       //设定理论和可用
-      if (getRationingByManualControl() == 1 || (isRationing && getRationingByManualControl() == 0)) {
+      if (isRationing) {
         //限电情况下  平均功率和实际功率取大者 乘倍率
         switch (sysParameterService.getSysParameter("kyglqz", "1", electricField.getStationCode())) {
           case "2":
@@ -464,21 +402,21 @@ public class PowerStationDataPacker {
           default: {
             BigDecimal avgPower = getForecastPowerAvg();
             BigDecimal randomNum = getRandomNum(new BigDecimal(sysParameterService.getSysParameter(KYGLJSMIN, "1", electricField.getStationCode())), new BigDecimal(sysParameterService.getSysParameter(KYGLJSMAX, "1.02", electricField.getStationCode())));
-            if (avgPower.compareTo(powerStationStatusData.getRealValue()) == 1) {
-              powerStationStatusData.setAbleValue(avgPower.multiply(randomNum).setScale(2, BigDecimal.ROUND_HALF_UP));
+            if (avgPower.compareTo(powerStationStatusData.getRealValue()) > 0) {
+              powerStationStatusData.setAbleValue(avgPower.multiply(randomNum).setScale(2, RoundingMode.HALF_UP));
             } else {
-              powerStationStatusData.setAbleValue(powerStationStatusData.getRealValue().multiply(randomNum).setScale(2, BigDecimal.ROUND_HALF_UP));
+              powerStationStatusData.setAbleValue(powerStationStatusData.getRealValue().multiply(randomNum).setScale(2, RoundingMode.HALF_UP));
             }
           }
         }
-      } else if ((!isRationing && getRationingByManualControl() == 0)) {
+      } else {
         //不限电 实际功率,理论功率,可用功率  理论=k*可用=k*实际
         powerStationStatusData.setAbleValue(powerStationStatusData.getRealValue().multiply(BigDecimal.ONE.add(getMagnificationK())).setScale(2, RoundingMode.HALF_DOWN));
       }
 
       if (powerStationStatusData.getOpenCapacity().compareTo(new BigDecimal(0)) != 0) {
         //设置理论功率
-        powerStationStatusData.setTheoryValue(powerStationStatusData.getAbleValue().multiply(BigDecimal.ONE.add(getMagnificationK())).add(overHaulPlanService.getOverhaulCapacity().multiply(powerStationStatusData.getRealValue().divide(powerStationStatusData.getOpenCapacity(), 2))).setScale(2, RoundingMode.HALF_DOWN));
+        powerStationStatusData.setTheoryValue(powerStationStatusData.getAbleValue().multiply(BigDecimal.ONE.add(getMagnificationK())).add(overHaulPlanService.getOverhaulCapacityByStationCode(electricField.getStationCode()).multiply(powerStationStatusData.getRealValue().divide(powerStationStatusData.getOpenCapacity(), RoundingMode.CEILING))).setScale(2, RoundingMode.HALF_DOWN));
       } else {
         powerStationStatusData.setTheoryValue(new BigDecimal(0));
       }
@@ -522,7 +460,7 @@ public class PowerStationDataPacker {
    * 获取当前时间开机容量比 即开机容量和装机容量的比值
    */
   public BigDecimal getOpenRatio() {
-    return BigDecimal.ONE.subtract(overHaulPlanService.getOverhaulCapacity().divide(electricField.getCapacity(), 2, RoundingMode.HALF_DOWN));
+    return BigDecimal.ONE.subtract(overHaulPlanService.getOverhaulCapacityByStationCode(electricField.getStationCode()).divide(electricField.getCapacity(), 2, RoundingMode.HALF_DOWN));
   }
 
   /**
@@ -577,18 +515,18 @@ public class PowerStationDataPacker {
     /**
      * 正式的
      */
-    public String formula ;
+    public String formula;
 
 
     /**
      * 用于替换公式的值
      */
-    public Map<String,Object> dataMap=new HashMap<>();
+    public Map<String, Object> dataMap = new HashMap<>();
 
     /**
      * 原始数据池
      */
-    Map<String, String> oDataMap=new HashMap<>();
+    Map<String, String> oDataMap = new HashMap<>();
 
 
     /**
@@ -605,56 +543,55 @@ public class PowerStationDataPacker {
     /**
      * 初始化
      *//* 光伏组件效率*(1-0.003*(光伏组件温度-25))*math.pow(0.992,3)*总辐射*光伏组件总面积/1000000*0.79*/
-   public void init() throws Exception {
-     AviatorEvaluator.setOption(Options.ALWAYS_PARSE_FLOATING_POINT_NUMBER_INTO_DECIMAL, true);
-     this.formula= sysParameterService.getSysParameter(LLGLGS, "", electricField.getStationCode());
-     try {
-       this.compiledExp = AviatorEvaluator.compile(formula);
-     } catch (ExpressionSyntaxErrorException e) {
-       log.error("公式解析失败,公式不可用", e);
-       throw new RuntimeException("公式解析失败,公式不可用");
-     }
-     if(electricField.getElectricFieldTypeEnum()==ElectricFieldTypeEnum.E1){
-        WeatherStationInfoService weatherStationInfoService=SpringContextHolder.getBean(WeatherStationInfoService.class);
-       List<WeatherStationInfo> l = weatherStationInfoService.getAll();
-       if(l.size()>=1){
-         this.equipmentNo=l.get(0).getId();
-       }else {
-         throw new Exception("系统缺少气象站信息");
-       }
-     }else{
-       WindTowerInfoService windTowerInfoService=SpringContextHolder.getBean(WindTowerInfoService.class);
-       List<WindTowerInfo> l = windTowerInfoService.getAll();
-       if(l.size()>=1){
-         this.equipmentNo=l.get(0).getId();
-       }else {
-         throw new Exception("系统缺少测风塔信息");
-       }
-     }
-   }
-
-   public void updateDates(){
-     if(electricField.getElectricFieldTypeEnum()==ElectricFieldTypeEnum.E1){
-       //光伏
-       oDataMap = redisUtils.hgetall("qxz-" + electricField.getStationCode() + "-" + equipmentNo);
-       if(oDataMap.containsKey("cellT")){
-         dataMap.put("光伏组件温度",new BigDecimal(oDataMap.get("cellT")));
-       }
-       if(oDataMap.containsKey("globalR")){
-         dataMap.put("总辐射",new BigDecimal(oDataMap.get("globalR")));
-       }
-     }else{
-       oDataMap = redisUtils.hgetall("cft-" + electricField.getStationCode() + "-" + equipmentNo);
-       if(oDataMap.containsKey("wsInstHubHeight")){
-         dataMap.put("轮毂风速",new BigDecimal(oDataMap.get("wsInstHubHeight")));
-       }
-     }
-   }
-
-
-
-    BigDecimal getData(){
-      return new BigDecimal(compiledExp.execute(dataMap)+"");
+    public void init() throws Exception {
+      AviatorEvaluator.setOption(Options.ALWAYS_PARSE_FLOATING_POINT_NUMBER_INTO_DECIMAL, true);
+      this.formula = sysParameterService.getSysParameter(LLGLGS, "", electricField.getStationCode());
+      try {
+        this.compiledExp = AviatorEvaluator.compile(formula);
+      } catch (ExpressionSyntaxErrorException e) {
+        log.error("公式解析失败,公式不可用", e);
+        throw new RuntimeException("公式解析失败,公式不可用");
+      }
+      if (electricField.getElectricFieldTypeEnum() == ElectricFieldTypeEnum.E1) {
+        WeatherStationInfoService weatherStationInfoService = SpringContextHolder.getBean(WeatherStationInfoService.class);
+        List<WeatherStationInfo> l = weatherStationInfoService.getAll();
+        if (l.size() >= 1) {
+          this.equipmentNo = l.get(0).getId();
+        } else {
+          throw new Exception("系统缺少气象站信息");
+        }
+      } else {
+        WindTowerInfoService windTowerInfoService = SpringContextHolder.getBean(WindTowerInfoService.class);
+        List<WindTowerInfo> l = windTowerInfoService.getAll();
+        if (l.size() >= 1) {
+          this.equipmentNo = l.get(0).getId();
+        } else {
+          throw new Exception("系统缺少测风塔信息");
+        }
+      }
+    }
+
+    public void updateDates() {
+      if (electricField.getElectricFieldTypeEnum() == ElectricFieldTypeEnum.E1) {
+        //光伏
+        oDataMap = redisUtils.hgetall("qxz-" + electricField.getStationCode() + "-" + equipmentNo);
+        if (oDataMap.containsKey("cellT")) {
+          dataMap.put("光伏组件温度", new BigDecimal(oDataMap.get("cellT")));
+        }
+        if (oDataMap.containsKey("globalR")) {
+          dataMap.put("总辐射", new BigDecimal(oDataMap.get("globalR")));
+        }
+      } else {
+        oDataMap = redisUtils.hgetall("cft-" + electricField.getStationCode() + "-" + equipmentNo);
+        if (oDataMap.containsKey("wsInstHubHeight")) {
+          dataMap.put("轮毂风速", new BigDecimal(oDataMap.get("wsInstHubHeight")));
+        }
+      }
+    }
+
+
+    BigDecimal getData() {
+      return new BigDecimal(compiledExp.execute(dataMap) + "");
     }
   }
 }

+ 11 - 14
ipfcst-console/src/main/java/com/jiayue/ipfcst/console/service/PowerStationDataPackerContainer.java

@@ -2,8 +2,10 @@ package com.jiayue.ipfcst.console.service;
 
 import com.jiayue.ipfcst.common.data.entity.ElectricField;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.DependsOn;
 import org.springframework.stereotype.Service;
 
+import javax.annotation.PostConstruct;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -11,42 +13,37 @@ import java.util.Map;
 /**
  * 注入样板机法的配置类
  *
- * @author: xiuwei
- * @version:
+ * @author 修唯xiuwei
+ *
  */
+@DependsOn("springContextHolder")
 @Service
 public class PowerStationDataPackerContainer {
 
+  @Autowired
+  protected ElectricFieldService electricFieldService;
+
 
-  public PowerStationDataPackerContainer() {
-    init();
-  }
 
   /**
    * 查询场站信息
    */
-  @Autowired
-  protected ElectricFieldService electricFieldService;
-
   Map<String, PowerStationDataPacker> powerStationDataPackerMap = new HashMap<>();
 
 
   /**
    * 初始化
    */
+  @PostConstruct
   public void init() {
     List<ElectricField> l = electricFieldService.getAll();
     for (ElectricField e : l) {
-      powerStationDataPackerMap.put(e.getStationCode(), new PowerStationDataPacker(e));
+      powerStationDataPackerMap.put(e.getStationCode(), new PowerStationDataPacker(e).init());
     }
   }
 
   public PowerStationDataPacker getDataPacker(String stationCode) {
-    if (this.powerStationDataPackerMap.containsKey(stationCode)) {
-      return this.powerStationDataPackerMap.get(stationCode);
-    } else {
-      return null;
-    }
+    return this.powerStationDataPackerMap.getOrDefault(stationCode, null);
   }
 
 

+ 27 - 7
ipfcst-console/src/main/java/com/jiayue/ipfcst/console/service/powerofreference/BasePowerOfReferenceCalculator.java

@@ -1,11 +1,13 @@
 package com.jiayue.ipfcst.console.service.powerofreference;
 
 
+import com.jiayue.ipfcst.common.core.util.SpringContextHolder;
 import com.jiayue.ipfcst.common.data.constant.enums.ElectricFieldTypeEnum;
 import com.jiayue.ipfcst.common.data.entity.ElectricField;
 import com.jiayue.ipfcst.console.service.ElectricFieldService;
 import com.jiayue.ipfcst.console.service.InverterInfoService;
 import com.jiayue.ipfcst.console.service.WindTurbineInfoService;
+import com.jiayue.ipfcst.console.util.RedisUtils;
 import org.springframework.stereotype.Component;
 import java.math.BigDecimal;
 
@@ -19,16 +21,29 @@ public abstract class BasePowerOfReferenceCalculator {
 
 
   /**
-   * 风机信息的查询 方便推算样板机数据
+   * 风机
+   */
+  private static final  String FJ="FJ";
+  /**
+   * 逆变器
    */
-  protected WindTurbineInfoService windTurbineInfoService;
+  private static final  String NBQ="NBQ";
 
 
   /**
+   * 风机信息的查询 方便推算样板机数据
+   */
+  protected WindTurbineInfoService windTurbineInfoService = SpringContextHolder.getBean(WindTurbineInfoService.class);
+
+  /**
    * 逆变器信息查询
    */
-  protected InverterInfoService inverterInfoService;
+  protected InverterInfoService inverterInfoService = SpringContextHolder.getBean(InverterInfoService.class);
 
+  /**
+   * Redis 操作
+   */
+  protected RedisUtils redisUtils = SpringContextHolder.getBean(RedisUtils.class);
 
   /**
    * 查询场站信息
@@ -42,10 +57,8 @@ public abstract class BasePowerOfReferenceCalculator {
    */
   protected ElectricFieldTypeEnum electricFieldType;
 
-  public BasePowerOfReferenceCalculator(WindTurbineInfoService windTurbineInfoService, InverterInfoService inverterInfoService, ElectricField electricField) {
-    this.windTurbineInfoService = windTurbineInfoService;
+  public BasePowerOfReferenceCalculator(ElectricField electricField) {
     this.electricField = electricField;
-    this.inverterInfoService = inverterInfoService;
   }
 
   /**
@@ -64,7 +77,14 @@ public abstract class BasePowerOfReferenceCalculator {
 
 
   protected BigDecimal getPowerOfEquipment(Integer equipmentId){
-    return null;
+    String e;
+    if(electricField.getElectricFieldTypeEnum()==ElectricFieldTypeEnum.E2){
+      e=FJ;
+    }else{
+      e=NBQ;
+    }
+    e=redisUtils.hget(e+"-"+electricField.getStationCode()+"-"+equipmentId,"activePower");
+    return new BigDecimal(e);
   }
 
 }

+ 5 - 6
ipfcst-console/src/main/java/com/jiayue/ipfcst/console/service/powerofreference/iml/PowerOfReferenceCalculator1.java

@@ -2,10 +2,8 @@ package com.jiayue.ipfcst.console.service.powerofreference.iml;
 
 
 import com.jiayue.ipfcst.common.data.constant.enums.ElectricFieldTypeEnum;
-import com.jiayue.ipfcst.common.data.constant.enums.EquipmentTypeEnum;
 import com.jiayue.ipfcst.common.data.entity.ElectricField;
 import com.jiayue.ipfcst.common.data.entity.InverterInfo;
-import com.jiayue.ipfcst.common.data.entity.ProtocolGatherDataPoint;
 import com.jiayue.ipfcst.common.data.entity.WindTurbineInfo;
 import com.jiayue.ipfcst.console.service.InverterInfoService;
 import com.jiayue.ipfcst.console.service.WindTurbineInfoService;
@@ -16,6 +14,7 @@ import lombok.SneakyThrows;
 import lombok.extern.slf4j.Slf4j;
 
 import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -42,8 +41,8 @@ public class PowerOfReferenceCalculator1 extends BasePowerOfReferenceCalculator
    */
   List<SampleEquipment> samples = new ArrayList<>();
 
-  public PowerOfReferenceCalculator1(WindTurbineInfoService windTurbineInfoService, InverterInfoService inverterInfoService, ElectricField electricField) {
-    super(windTurbineInfoService, inverterInfoService, electricField);
+  public PowerOfReferenceCalculator1( ElectricField electricField) {
+    super( electricField);
   }
 
 
@@ -55,7 +54,7 @@ public class PowerOfReferenceCalculator1 extends BasePowerOfReferenceCalculator
   @Override
   public BigDecimal getEstimatePower() {
     BigDecimal avgRatio = BigDecimal.ZERO;
-    BigDecimal ratio = BigDecimal.ZERO;
+    BigDecimal ratio;
     try {
 
       if (stationTotalCapacity != null && stationTotalCapacity.compareTo(BigDecimal.ZERO) != 0) {
@@ -72,7 +71,7 @@ public class PowerOfReferenceCalculator1 extends BasePowerOfReferenceCalculator
       if (samples.size() == 0) {
         return BigDecimal.ZERO;
       }
-      avgRatio = avgRatio.divide(BigDecimal.valueOf(samples.size()), 10, BigDecimal.ROUND_HALF_UP).multiply(stationTotalCapacity).setScale(2, BigDecimal.ROUND_HALF_UP);
+      avgRatio = avgRatio.divide(BigDecimal.valueOf(samples.size()), 10, RoundingMode.HALF_UP).multiply(stationTotalCapacity).setScale(2, RoundingMode.HALF_UP);
 
     } catch (Exception e) {
       log.error("计算样板机法理论功率数据时发生了异常" + e);

+ 4 - 5
ipfcst-console/src/main/java/com/jiayue/ipfcst/console/service/powerofreference/iml/PowerOfReferenceCalculator2.java

@@ -3,7 +3,6 @@ package com.jiayue.ipfcst.console.service.powerofreference.iml;
 import com.jiayue.ipfcst.common.data.constant.enums.ElectricFieldTypeEnum;
 import com.jiayue.ipfcst.common.data.entity.ElectricField;
 import com.jiayue.ipfcst.common.data.entity.InverterInfo;
-import com.jiayue.ipfcst.common.data.entity.ProtocolGatherDataPoint;
 import com.jiayue.ipfcst.common.data.entity.WindTurbineInfo;
 import com.jiayue.ipfcst.console.service.InverterInfoService;
 import com.jiayue.ipfcst.console.service.WindTurbineInfoService;
@@ -11,6 +10,7 @@ import com.jiayue.ipfcst.console.service.powerofreference.BasePowerOfReferenceCa
 import lombok.SneakyThrows;
 
 import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
@@ -27,8 +27,8 @@ public class PowerOfReferenceCalculator2 extends BasePowerOfReferenceCalculator
   Set<Integer> samples = new HashSet<>();
 
 
-  public PowerOfReferenceCalculator2(WindTurbineInfoService windTurbineInfoService, InverterInfoService inverterInfoService, ElectricField electricField) {
-    super(windTurbineInfoService, inverterInfoService, electricField);
+  public PowerOfReferenceCalculator2( ElectricField electricField) {
+    super( electricField);
   }
 
 
@@ -42,14 +42,13 @@ public class PowerOfReferenceCalculator2 extends BasePowerOfReferenceCalculator
     for (Integer i : samples) {
       total = total.add(getPowerOfEquipment(i));
     }
-    return total.divide(BigDecimal.valueOf(samples.size())).multiply(BigDecimal.valueOf(electricField.getGridCE()));
+    return total.divide(BigDecimal.valueOf(samples.size()),2, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(electricField.getGridCE()));
   }
 
   @SneakyThrows
   @Override
   public BasePowerOfReferenceCalculator init() {
     this.electricFieldType = electricField.getElectricFieldTypeEnum();
-    ProtocolGatherDataPoint point;
     if (ElectricFieldTypeEnum.E1.equals(this.electricFieldType)) {
       List<InverterInfo> inverterInfos = inverterInfoService.getAllSample();
       for (InverterInfo i : inverterInfos) {

+ 5 - 0
ipfcst-console/src/main/java/com/jiayue/ipfcst/console/util/RedisUtils.java

@@ -1,5 +1,6 @@
 package com.jiayue.ipfcst.console.util;
 
+import com.jiayue.ipfcst.common.data.abst.equipmentstatus.AbstractEquipmentStatusData;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 import redis.clients.jedis.Jedis;
@@ -7,6 +8,8 @@ import redis.clients.jedis.JedisPool;
 import redis.clients.jedis.Pipeline;
 import redis.clients.jedis.Tuple;
 
+import java.lang.reflect.Field;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -16,6 +19,7 @@ import java.util.Set;
  */
 @Component
 public class RedisUtils {
+
   @Autowired
   private JedisPool jedisPool;
     /*
@@ -641,6 +645,7 @@ public class RedisUtils {
         }
     }
 
+
     /**
      * 取出某个hash表中任意多个key对应的value的集合
      *

+ 3 - 3
ipfcst-console/src/main/resources/application.yml

@@ -7,9 +7,9 @@ server:
     key-store-type: JKS
 spring:
   redis:
-    host: 192.168.1.205
+    host: 127.0.0.1
     port: 6379
-    password: 'null'
+    password: 'jiayue'
     maxIdle: 10
     maxTotal: 30
     maxWaitMillis: 1500
@@ -38,7 +38,7 @@ spring:
       # 数据源配置
       username: root
       password: '!QAZ2root'
-      url: jdbc:mysql://192.168.1.205:3306/focus?useUnicode=true&characterEncoding=UTF-8&characterSetResults=UTF-8&autoReconnect=true&rewriteBatchedStatements=true&serverTimezone=Asia/Shanghai
+      url: jdbc:mysql://127.0.0.1:3306/focus?useUnicode=true&characterEncoding=UTF-8&characterSetResults=UTF-8&autoReconnect=true&rewriteBatchedStatements=true&serverTimezone=Asia/Shanghai
       driver-class-name: com.mysql.cj.jdbc.Driver
       # 初始化 最小 最大
       initial-size: 10

+ 87 - 0
ipfcst-console/src/test/java/com/jiayue/ipfcst/console/service/PowerStationDataTest.java

@@ -0,0 +1,87 @@
+package com.jiayue.ipfcst.console.service;
+
+import com.alibaba.fastjson.JSON;
+import com.jiayue.ipfcst.BaseTest;
+import com.jiayue.ipfcst.common.data.abst.equipmentstatus.AbstractEquipmentStatusData;
+import com.jiayue.ipfcst.common.data.entity.PowerStationStatusData;
+import com.jiayue.ipfcst.common.data.entity.WindTurbineStatusData;
+import com.jiayue.ipfcst.console.util.RedisUtils;
+import org.junit.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import java.lang.reflect.Field;
+import java.math.BigDecimal;
+import java.util.*;
+
+public class PowerStationDataTest extends BaseTest {
+
+
+  @Autowired
+  PowerStationDataPackerContainer powerStationDataPackerContainer;
+
+  @Autowired
+  RedisUtils redisUtils;
+
+
+  private final Random random = new Random();
+
+  @Test
+  public void packages() throws Exception {
+    for (; ; ) {
+      PowerStationStatusData a = powerStationDataPackerContainer.getDataPacker("J00001").packageData(BigDecimal.valueOf(20));
+      System.out.println(JSON.toJSONString(a));
+      Thread.sleep(20000L);
+    }
+  }
+
+  @Test
+  public void save() throws Exception {
+    WindTurbineStatusData data = new WindTurbineStatusData();
+    data.setStationCode("J00001");
+    data.setId(1);
+    data.setActivePower(BigDecimal.valueOf(random.nextFloat()).multiply(BigDecimal.valueOf(1000)));
+    saveEquipmentStatusData("FJ-" + data.getStationCode() + "-" + data.getId(), data);
+    data.setId(2);
+    data.setActivePower(BigDecimal.valueOf(random.nextFloat()).multiply(BigDecimal.valueOf(1000)));
+    saveEquipmentStatusData("FJ-" + data.getStationCode() + "-" + data.getId(), data);
+    data.setId(3);
+    data.setActivePower(BigDecimal.valueOf(random.nextFloat()).multiply(BigDecimal.valueOf(1000)));
+    saveEquipmentStatusData("FJ-" + data.getStationCode() + "-" + data.getId(), data);
+    data.setId(5);
+    data.setActivePower(BigDecimal.valueOf(random.nextFloat()).multiply(BigDecimal.valueOf(1000)));
+    saveEquipmentStatusData("FJ-" + data.getStationCode() + "-" + data.getId(), data);
+    data.setId(7);
+    data.setActivePower(BigDecimal.valueOf(random.nextFloat()).multiply(BigDecimal.valueOf(1000)));
+    saveEquipmentStatusData("FJ-" + data.getStationCode() + "-" + data.getId(), data);
+    data.setId(12);
+    data.setActivePower(BigDecimal.valueOf(random.nextFloat()).multiply(BigDecimal.valueOf(1000)));
+    saveEquipmentStatusData("FJ-" + data.getStationCode() + "-" + data.getId(), data);
+    data.setId(14);
+    data.setActivePower(BigDecimal.valueOf(random.nextFloat()).multiply(BigDecimal.valueOf(1000)));
+    saveEquipmentStatusData("FJ-" + data.getStationCode() + "-" + data.getId(), data);
+    data.setId(16);
+    data.setActivePower(BigDecimal.valueOf(random.nextFloat()).multiply(BigDecimal.valueOf(1000)));
+    saveEquipmentStatusData("FJ-" + data.getStationCode() + "-" + data.getId(), data);
+    data.setId(17);
+    data.setActivePower(BigDecimal.valueOf(random.nextFloat()).multiply(BigDecimal.valueOf(1000)));
+    saveEquipmentStatusData("FJ-" + data.getStationCode() + "-" + data.getId(), data);
+
+
+  }
+
+
+  public void saveEquipmentStatusData(String key, AbstractEquipmentStatusData equipmentStatusData) throws IllegalAccessException {
+    Field[] f1 = equipmentStatusData.getClass().getDeclaredFields();
+    Field[] f2 = AbstractEquipmentStatusData.class.getDeclaredFields();
+    List<Field> l = Arrays.asList(f1);
+    l.addAll(Arrays.asList(f2));
+    Map<String, String> m = new HashMap<>();
+    Object o;
+    for (Field f : l) {
+      f.setAccessible(true);
+      o = f.get(equipmentStatusData);
+      m.put(f.getName(), o.toString());
+    }
+    redisUtils.hmset(key, m);
+  }
+}

+ 56 - 0
ipfcst-console/velocity.log

@@ -127,3 +127,59 @@
 2021-08-31 22:13:08,399 - Null reference [template 'start-console.vm', line 25, column 19] : $app_path cannot be resolved.
 2021-08-31 22:13:08,399 - Null reference [template 'start-console.vm', line 25, column 49] : $start_app_log cannot be resolved.
 2021-08-31 22:13:08,399 - Null reference [template 'start-console.vm', line 28, column 44] : $app_path cannot be resolved.
+2021-10-13 11:31:53,047 - Log4JLogChute initialized using file 'velocity.log'
+2021-10-13 11:31:53,048 - Initializing Velocity, Calling init()...
+2021-10-13 11:31:53,048 - Starting Apache Velocity v1.7 (compiled: 2010-11-19 12:14:37)
+2021-10-13 11:31:53,048 - Default Properties File: org\apache\velocity\runtime\defaults\velocity.properties
+2021-10-13 11:31:53,048 - Trying to use logger class org.apache.velocity.runtime.log.AvalonLogChute
+2021-10-13 11:31:53,048 - Target log system for org.apache.velocity.runtime.log.AvalonLogChute is not available (java.lang.NoClassDefFoundError: org/apache/log/format/Formatter).  Falling back to next log system...
+2021-10-13 11:31:53,048 - Trying to use logger class org.apache.velocity.runtime.log.Log4JLogChute
+2021-10-13 11:31:53,048 - Using logger class org.apache.velocity.runtime.log.Log4JLogChute
+2021-10-13 11:31:53,057 - ResourceLoader instantiated: org.apache.velocity.runtime.resource.loader.FileResourceLoader
+2021-10-13 11:31:53,059 - Do unicode file recognition:  false
+2021-10-13 11:31:53,059 - FileResourceLoader : adding path ''
+2021-10-13 11:31:53,081 - ResourceCache: initialized (class org.apache.velocity.runtime.resource.ResourceCacheImpl) with class java.util.Collections$SynchronizedMap cache map.
+2021-10-13 11:31:53,084 - Loaded System Directive: org.apache.velocity.runtime.directive.Stop
+2021-10-13 11:31:53,086 - Loaded System Directive: org.apache.velocity.runtime.directive.Define
+2021-10-13 11:31:53,103 - Loaded System Directive: org.apache.velocity.runtime.directive.Break
+2021-10-13 11:31:53,105 - Loaded System Directive: org.apache.velocity.runtime.directive.Evaluate
+2021-10-13 11:31:53,106 - Loaded System Directive: org.apache.velocity.runtime.directive.Literal
+2021-10-13 11:31:53,108 - Loaded System Directive: org.apache.velocity.runtime.directive.Macro
+2021-10-13 11:31:53,110 - Loaded System Directive: org.apache.velocity.runtime.directive.Parse
+2021-10-13 11:31:53,113 - Loaded System Directive: org.apache.velocity.runtime.directive.Include
+2021-10-13 11:31:53,114 - Loaded System Directive: org.apache.velocity.runtime.directive.Foreach
+2021-10-13 11:31:53,152 - Created '20' parsers.
+2021-10-13 11:31:53,163 - Velocimacro : "velocimacro.library" is not set.  Trying default library: VM_global_library.vm
+2021-10-13 11:31:53,164 - Velocimacro : Default library not found.
+2021-10-13 11:31:53,164 - Velocimacro : allowInline = true : VMs can be defined inline in templates
+2021-10-13 11:31:53,164 - Velocimacro : allowInlineToOverride = false : VMs defined inline may NOT replace previous VM definitions
+2021-10-13 11:31:53,164 - Velocimacro : allowInlineLocal = false : VMs defined inline will be global in scope if allowed.
+2021-10-13 11:31:53,164 - Velocimacro : autoload off : VM system will not automatically reload global library macros
+2021-10-13 11:32:28,377 - Log4JLogChute initialized using file 'velocity.log'
+2021-10-13 11:32:28,378 - Initializing Velocity, Calling init()...
+2021-10-13 11:32:28,378 - Starting Apache Velocity v1.7 (compiled: 2010-11-19 12:14:37)
+2021-10-13 11:32:28,378 - Default Properties File: org\apache\velocity\runtime\defaults\velocity.properties
+2021-10-13 11:32:28,378 - Trying to use logger class org.apache.velocity.runtime.log.AvalonLogChute
+2021-10-13 11:32:28,378 - Target log system for org.apache.velocity.runtime.log.AvalonLogChute is not available (java.lang.NoClassDefFoundError: org/apache/log/format/Formatter).  Falling back to next log system...
+2021-10-13 11:32:28,378 - Trying to use logger class org.apache.velocity.runtime.log.Log4JLogChute
+2021-10-13 11:32:28,378 - Using logger class org.apache.velocity.runtime.log.Log4JLogChute
+2021-10-13 11:32:28,385 - ResourceLoader instantiated: org.apache.velocity.runtime.resource.loader.FileResourceLoader
+2021-10-13 11:32:28,387 - Do unicode file recognition:  false
+2021-10-13 11:32:28,387 - FileResourceLoader : adding path ''
+2021-10-13 11:32:28,408 - ResourceCache: initialized (class org.apache.velocity.runtime.resource.ResourceCacheImpl) with class java.util.Collections$SynchronizedMap cache map.
+2021-10-13 11:32:28,412 - Loaded System Directive: org.apache.velocity.runtime.directive.Stop
+2021-10-13 11:32:28,414 - Loaded System Directive: org.apache.velocity.runtime.directive.Define
+2021-10-13 11:32:28,415 - Loaded System Directive: org.apache.velocity.runtime.directive.Break
+2021-10-13 11:32:28,416 - Loaded System Directive: org.apache.velocity.runtime.directive.Evaluate
+2021-10-13 11:32:28,417 - Loaded System Directive: org.apache.velocity.runtime.directive.Literal
+2021-10-13 11:32:28,420 - Loaded System Directive: org.apache.velocity.runtime.directive.Macro
+2021-10-13 11:32:28,422 - Loaded System Directive: org.apache.velocity.runtime.directive.Parse
+2021-10-13 11:32:28,424 - Loaded System Directive: org.apache.velocity.runtime.directive.Include
+2021-10-13 11:32:28,426 - Loaded System Directive: org.apache.velocity.runtime.directive.Foreach
+2021-10-13 11:32:28,465 - Created '20' parsers.
+2021-10-13 11:32:28,479 - Velocimacro : "velocimacro.library" is not set.  Trying default library: VM_global_library.vm
+2021-10-13 11:32:28,480 - Velocimacro : Default library not found.
+2021-10-13 11:32:28,480 - Velocimacro : allowInline = true : VMs can be defined inline in templates
+2021-10-13 11:32:28,480 - Velocimacro : allowInlineToOverride = false : VMs defined inline may NOT replace previous VM definitions
+2021-10-13 11:32:28,480 - Velocimacro : allowInlineLocal = false : VMs defined inline will be global in scope if allowed.
+2021-10-13 11:32:28,480 - Velocimacro : autoload off : VM system will not automatically reload global library macros