Selaa lähdekoodia

1.梳理计算

wangt 1 vuosi sitten
vanhempi
commit
693a88a963
100 muutettua tiedostoa jossa 3180 lisäystä ja 1940 poistoa
  1. 15 1
      .idea/compiler.xml
  2. 20 0
      .idea/jarRepositories.xml
  3. 1 0
      .idea/misc.xml
  4. 2 0
      .idea/modules.xml
  5. 0 10
      .idea/runConfigurations.xml
  6. 556 20
      .idea/workspace.xml
  7. 10 10
      TwoParameterWeibullProbabilityPlotOutput.txt
  8. 12 0
      neim-biz/pom.xml
  9. 51 2
      neim-biz/src/main/java/com/jiayue/biz/controller/DataRecalculationController.java
  10. 76 10
      neim-biz/src/main/java/com/jiayue/biz/controller/HomePageController.java
  11. 103 22
      neim-biz/src/main/java/com/jiayue/biz/controller/ProjectController.java
  12. 41 33
      neim-biz/src/main/java/com/jiayue/biz/controller/WindTowerCalculationDataController.java
  13. 92 0
      neim-biz/src/main/java/com/jiayue/biz/domain/ProjectProgressInfo.java
  14. 22 8
      neim-biz/src/main/java/com/jiayue/biz/domain/WindTowerCalculationData.java
  15. 22 122
      neim-biz/src/main/java/com/jiayue/biz/job/AirDensityJob.java
  16. 7 8
      neim-biz/src/main/java/com/jiayue/biz/job/FileAnalysisJob.java
  17. 10 12
      neim-biz/src/main/java/com/jiayue/biz/job/ModbusReciveJob.java
  18. 0 77
      neim-biz/src/main/java/com/jiayue/biz/job/WindTowerCalculationDataJob.java
  19. 7 0
      neim-biz/src/main/java/com/jiayue/biz/mapper/ProjectProgressInfoMapper.java
  20. 19 13
      neim-biz/src/main/java/com/jiayue/biz/service/HomePageService.java
  21. 9 0
      neim-biz/src/main/java/com/jiayue/biz/service/ProjectProgressInfoService.java
  22. 9 2
      neim-biz/src/main/java/com/jiayue/biz/service/ProjectService.java
  23. 68 0
      neim-biz/src/main/java/com/jiayue/biz/service/WindDataCalculationService.java
  24. 18 33
      neim-biz/src/main/java/com/jiayue/biz/service/WindTowerCalculationDataService.java
  25. 35 87
      neim-biz/src/main/java/com/jiayue/biz/service/impl/DataRecalculationImpl.java
  26. 40 12
      neim-biz/src/main/java/com/jiayue/biz/service/impl/HomePageServiceImpl.java
  27. 5 17
      neim-biz/src/main/java/com/jiayue/biz/service/impl/PdfServiceImpl.java
  28. 10 7
      neim-biz/src/main/java/com/jiayue/biz/service/impl/ProjectInfoServiceImpl.java
  29. 14 0
      neim-biz/src/main/java/com/jiayue/biz/service/impl/ProjectProgressInfoServiceImpl.java
  30. 14 10
      neim-biz/src/main/java/com/jiayue/biz/service/impl/ProjectServiceImpl.java
  31. 1670 0
      neim-biz/src/main/java/com/jiayue/biz/service/impl/WindDataCalculationServiceImpl.java
  32. 4 256
      neim-biz/src/main/java/com/jiayue/biz/service/impl/WindDirectionStatisticsDataServiceImpl.java
  33. 175 1103
      neim-biz/src/main/java/com/jiayue/biz/service/impl/WindTowerCalculationDataServiceImpl.java
  34. 14 7
      neim-biz/src/main/java/com/jiayue/biz/util/CalculationUtil.java
  35. 14 0
      neim-biz/src/main/java/com/jiayue/biz/util/CommonUtil.java
  36. 12 2
      neim-biz/src/main/java/com/jiayue/biz/util/DateTimeUtil.java
  37. 3 10
      neim-biz/src/main/resources/application-dev.yml
  38. 0 20
      neim-biz/src/main/resources/html/ie.html
  39. BIN
      neim-biz/src/main/resources/html/ie.html.gz
  40. BIN
      neim-biz/src/main/resources/img/bg.png
  41. BIN
      neim-biz/src/main/resources/img/fengche.png
  42. 0 0
      neim-biz/src/main/resources/static/css/app.60c5599b.css
  43. BIN
      neim-biz/src/main/resources/static/css/app.60c5599b.css.gz
  44. 0 1
      neim-biz/src/main/resources/static/css/chunk-1208fcbe.793cbdf1.css
  45. BIN
      neim-biz/src/main/resources/static/css/chunk-1208fcbe.793cbdf1.css.gz
  46. 0 1
      neim-biz/src/main/resources/static/css/chunk-171ca186.99047b9c.css
  47. BIN
      neim-biz/src/main/resources/static/css/chunk-171ca186.99047b9c.css.gz
  48. 0 1
      neim-biz/src/main/resources/static/css/chunk-24c54c5f.25ee122e.css
  49. BIN
      neim-biz/src/main/resources/static/css/chunk-24c54c5f.25ee122e.css.gz
  50. 0 1
      neim-biz/src/main/resources/static/css/chunk-28506e6c.1487a511.css
  51. 0 0
      neim-biz/src/main/resources/static/css/chunk-2af653b1.55d20a16.css
  52. BIN
      neim-biz/src/main/resources/static/css/chunk-2af653b1.55d20a16.css.gz
  53. 0 0
      neim-biz/src/main/resources/static/css/chunk-32ea1202.153aa359.css
  54. BIN
      neim-biz/src/main/resources/static/css/chunk-32ea1202.153aa359.css.gz
  55. 0 1
      neim-biz/src/main/resources/static/css/chunk-345dd7f2.bbc9fa95.css
  56. BIN
      neim-biz/src/main/resources/static/css/chunk-345dd7f2.bbc9fa95.css.gz
  57. 0 1
      neim-biz/src/main/resources/static/css/chunk-3724ee0c.c7a6b184.css
  58. BIN
      neim-biz/src/main/resources/static/css/chunk-3724ee0c.c7a6b184.css.gz
  59. 0 1
      neim-biz/src/main/resources/static/css/chunk-3ca6096f.9f7e2498.css
  60. BIN
      neim-biz/src/main/resources/static/css/chunk-3ca6096f.9f7e2498.css.gz
  61. 0 1
      neim-biz/src/main/resources/static/css/chunk-444dbb2e.3e10cd59.css
  62. BIN
      neim-biz/src/main/resources/static/css/chunk-444dbb2e.3e10cd59.css.gz
  63. 0 1
      neim-biz/src/main/resources/static/css/chunk-46876428.680532d0.css
  64. BIN
      neim-biz/src/main/resources/static/css/chunk-46876428.680532d0.css.gz
  65. 0 1
      neim-biz/src/main/resources/static/css/chunk-47fed2d0.f9e52dca.css
  66. BIN
      neim-biz/src/main/resources/static/css/chunk-47fed2d0.f9e52dca.css.gz
  67. 0 1
      neim-biz/src/main/resources/static/css/chunk-48223c1b.139f8fef.css
  68. BIN
      neim-biz/src/main/resources/static/css/chunk-48223c1b.139f8fef.css.gz
  69. 0 1
      neim-biz/src/main/resources/static/css/chunk-55d183ec.4e8637e7.css
  70. BIN
      neim-biz/src/main/resources/static/css/chunk-55d183ec.4e8637e7.css.gz
  71. 0 4
      neim-biz/src/main/resources/static/css/chunk-57c7bd1b.84f98409.css
  72. BIN
      neim-biz/src/main/resources/static/css/chunk-57c7bd1b.84f98409.css.gz
  73. 0 1
      neim-biz/src/main/resources/static/css/chunk-59e3a2aa.db9979c1.css
  74. BIN
      neim-biz/src/main/resources/static/css/chunk-59e3a2aa.db9979c1.css.gz
  75. 0 1
      neim-biz/src/main/resources/static/css/chunk-5a5e4b3e.95f72f1d.css
  76. BIN
      neim-biz/src/main/resources/static/css/chunk-5a5e4b3e.95f72f1d.css.gz
  77. 0 1
      neim-biz/src/main/resources/static/css/chunk-5b83c289.ce2a2394.css
  78. BIN
      neim-biz/src/main/resources/static/css/chunk-5b83c289.ce2a2394.css.gz
  79. 0 1
      neim-biz/src/main/resources/static/css/chunk-5bcac654.179c4f24.css
  80. BIN
      neim-biz/src/main/resources/static/css/chunk-5bcac654.179c4f24.css.gz
  81. 0 1
      neim-biz/src/main/resources/static/css/chunk-5e857f95.daa871e9.css
  82. BIN
      neim-biz/src/main/resources/static/css/chunk-5e857f95.daa871e9.css.gz
  83. 0 1
      neim-biz/src/main/resources/static/css/chunk-67417c65.43ccdbe8.css
  84. BIN
      neim-biz/src/main/resources/static/css/chunk-67417c65.43ccdbe8.css.gz
  85. 0 0
      neim-biz/src/main/resources/static/css/chunk-6a51e97f.5a402cd2.css
  86. BIN
      neim-biz/src/main/resources/static/css/chunk-6a51e97f.5a402cd2.css.gz
  87. 0 1
      neim-biz/src/main/resources/static/css/chunk-6ad04947.f9e52dca.css
  88. BIN
      neim-biz/src/main/resources/static/css/chunk-6ad04947.f9e52dca.css.gz
  89. 0 1
      neim-biz/src/main/resources/static/css/chunk-7c4ca7cb.b3dde55f.css
  90. BIN
      neim-biz/src/main/resources/static/css/chunk-7c4ca7cb.b3dde55f.css.gz
  91. 0 1
      neim-biz/src/main/resources/static/css/chunk-7ca6e6a6.2e9373c8.css
  92. BIN
      neim-biz/src/main/resources/static/css/chunk-7ca6e6a6.2e9373c8.css.gz
  93. 0 0
      neim-biz/src/main/resources/static/css/chunk-7d80f20e.4b262291.css
  94. BIN
      neim-biz/src/main/resources/static/css/chunk-7d80f20e.4b262291.css.gz
  95. 0 1
      neim-biz/src/main/resources/static/css/chunk-7d993ace.3a987f25.css
  96. BIN
      neim-biz/src/main/resources/static/css/chunk-7d993ace.3a987f25.css.gz
  97. 0 0
      neim-biz/src/main/resources/static/css/chunk-b8e2922c.26edb5dd.css
  98. BIN
      neim-biz/src/main/resources/static/css/chunk-b8e2922c.26edb5dd.css.gz
  99. 0 0
      neim-biz/src/main/resources/static/css/chunk-c28ad000.17fbdb6b.css
  100. BIN
      neim-biz/src/main/resources/static/css/chunk-c28ad000.17fbdb6b.css.gz

+ 15 - 1
.idea/compiler.xml

@@ -1,13 +1,27 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <project version="4">
   <component name="CompilerConfiguration">
+    <annotationProcessing>
+      <profile default="true" name="Default" enabled="true" />
+      <profile name="Maven default annotation processors profile" enabled="true">
+        <sourceOutputDir name="target/generated-sources/annotations" />
+        <sourceTestOutputDir name="target/generated-test-sources/test-annotations" />
+        <outputRelativeToContentRoot value="true" />
+        <module name="neim-biz" />
+        <module name="neim-system" />
+      </profile>
+    </annotationProcessing>
     <bytecodeTargetLevel>
       <module name="neim" target="1.8" />
+      <module name="neim-biz" target="1.8" />
+      <module name="neim-system" target="1.8" />
     </bytecodeTargetLevel>
   </component>
   <component name="JavacSettings">
     <option name="ADDITIONAL_OPTIONS_OVERRIDE">
-      <module name="neim" options="-bootclasspath &quot;D:\IntelliJ IDEA 2021.2.1\jbr\lib\rt.jar;D:\IntelliJ IDEA 2021.2.1\jbr\lib\jce.jar&quot; -Xlint:deprecation" />
+      <module name="neim" options="-bootclasspath $PROJECT_DIR$/../../../soft/jdk1.8.0_202/jre\lib\rt.jar;$PROJECT_DIR$/../../../soft/jdk1.8.0_202/jre\lib\jce.jar;$PROJECT_DIR$/../../../soft/jdk1.8.0_202/jre\lib\jsse.jar -Xlint:deprecation" />
+      <module name="neim-biz" options="-bootclasspath $PROJECT_DIR$/../../../soft/jdk1.8.0_202/jre\lib\rt.jar;$PROJECT_DIR$/../../../soft/jdk1.8.0_202/jre\lib\jce.jar;$PROJECT_DIR$/../../../soft/jdk1.8.0_202/jre\lib\jsse.jar -Xlint:deprecation" />
+      <module name="neim-system" options="-bootclasspath $PROJECT_DIR$/../../../soft/jdk1.8.0_202/jre\lib\rt.jar;$PROJECT_DIR$/../../../soft/jdk1.8.0_202/jre\lib\jce.jar;$PROJECT_DIR$/../../../soft/jdk1.8.0_202/jre\lib\jsse.jar -Xlint:deprecation" />
     </option>
   </component>
 </project>

+ 20 - 0
.idea/jarRepositories.xml

@@ -12,14 +12,34 @@
       <option name="url" value="https://repo.maven.apache.org/maven2" />
     </remote-repository>
     <remote-repository>
+      <option name="id" value="aliyun" />
+      <option name="name" value="aliyun" />
+      <option name="url" value="http://49.4.68.219:8888/repository/aliyun/" />
+    </remote-repository>
+    <remote-repository>
+      <option name="id" value="central" />
+      <option name="name" value="Central Repository" />
+      <option name="url" value="http://49.4.68.219:8888/repository/jiayue-group/" />
+    </remote-repository>
+    <remote-repository>
       <option name="id" value="central" />
       <option name="name" value="Maven Central repository" />
       <option name="url" value="https://repo1.maven.org/maven2" />
     </remote-repository>
     <remote-repository>
+      <option name="id" value="public" />
+      <option name="name" value="aliyun nexus" />
+      <option name="url" value="http://49.4.68.219:8888/repository/jiayue-group/" />
+    </remote-repository>
+    <remote-repository>
       <option name="id" value="jboss.community" />
       <option name="name" value="JBoss Community repository" />
       <option name="url" value="https://repository.jboss.org/nexus/content/repositories/public/" />
     </remote-repository>
+    <remote-repository>
+      <option name="id" value="jiayue" />
+      <option name="name" value="jiayue" />
+      <option name="url" value="http://49.4.68.219:8888/repository/jiayue-releases/" />
+    </remote-repository>
   </component>
 </project>

+ 1 - 0
.idea/misc.xml

@@ -7,6 +7,7 @@
       </list>
     </option>
   </component>
+  <component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" project-jdk-name="1.8" project-jdk-type="JavaSDK" />
   <component name="ProjectType">
     <option name="id" value="jpab" />
   </component>

+ 2 - 0
.idea/modules.xml

@@ -3,6 +3,8 @@
   <component name="ProjectModuleManager">
     <modules>
       <module fileurl="file://$PROJECT_DIR$/neim.iml" filepath="$PROJECT_DIR$/neim.iml" />
+      <module fileurl="file://$PROJECT_DIR$/neim-biz/neim-biz.iml" filepath="$PROJECT_DIR$/neim-biz/neim-biz.iml" />
+      <module fileurl="file://$PROJECT_DIR$/neim-system/neim-system.iml" filepath="$PROJECT_DIR$/neim-system/neim-system.iml" />
     </modules>
   </component>
 </project>

+ 0 - 10
.idea/runConfigurations.xml

@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
-  <component name="RunConfigurationProducerService">
-    <option name="ignoredProducers">
-      <set>
-        <option value="com.android.tools.idea.compose.preview.runconfiguration.ComposePreviewRunConfigurationProducer" />
-      </set>
-    </option>
-  </component>
-</project>

+ 556 - 20
.idea/workspace.xml

@@ -4,12 +4,341 @@
     <option name="autoReloadType" value="SELECTIVE" />
   </component>
   <component name="ChangeListManager">
-    <list default="true" id="12555237-475b-4aab-811e-0cafb2577a56" name="Changes" comment="" />
+    <list default="true" id="12555237-475b-4aab-811e-0cafb2577a56" name="Changes" comment="1.计算实际数据数量未过滤非选择时间区间,造成缺失率出现负数">
+      <change afterPath="$PROJECT_DIR$/neim-biz/src/main/java/com/jiayue/biz/domain/ProjectProgressInfo.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/neim-biz/src/main/java/com/jiayue/biz/mapper/ProjectProgressInfoMapper.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/neim-biz/src/main/java/com/jiayue/biz/service/ProjectProgressInfoService.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/neim-biz/src/main/java/com/jiayue/biz/service/WindDataCalculationService.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/neim-biz/src/main/java/com/jiayue/biz/service/impl/ProjectProgressInfoServiceImpl.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/neim-biz/src/main/java/com/jiayue/biz/service/impl/WindDataCalculationServiceImpl.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/neim-ui/src/views/largeScreenPage/Subpage/projectEvolve_BAK.vue" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/.idea/compiler.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/compiler.xml" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/.idea/jarRepositories.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/jarRepositories.xml" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/.idea/misc.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/misc.xml" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/.idea/modules.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/modules.xml" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/.idea/runConfigurations.xml" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/TwoParameterWeibullProbabilityPlotOutput.txt" beforeDir="false" afterPath="$PROJECT_DIR$/TwoParameterWeibullProbabilityPlotOutput.txt" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/pom.xml" beforeDir="false" afterPath="$PROJECT_DIR$/neim-biz/pom.xml" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/java/com/jiayue/biz/controller/DataRecalculationController.java" beforeDir="false" afterPath="$PROJECT_DIR$/neim-biz/src/main/java/com/jiayue/biz/controller/DataRecalculationController.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/java/com/jiayue/biz/controller/HomePageController.java" beforeDir="false" afterPath="$PROJECT_DIR$/neim-biz/src/main/java/com/jiayue/biz/controller/HomePageController.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/java/com/jiayue/biz/controller/ProjectController.java" beforeDir="false" afterPath="$PROJECT_DIR$/neim-biz/src/main/java/com/jiayue/biz/controller/ProjectController.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/java/com/jiayue/biz/controller/WindTowerCalculationDataController.java" beforeDir="false" afterPath="$PROJECT_DIR$/neim-biz/src/main/java/com/jiayue/biz/controller/WindTowerCalculationDataController.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/java/com/jiayue/biz/domain/WindTowerCalculationData.java" beforeDir="false" afterPath="$PROJECT_DIR$/neim-biz/src/main/java/com/jiayue/biz/domain/WindTowerCalculationData.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/java/com/jiayue/biz/job/AirDensityJob.java" beforeDir="false" afterPath="$PROJECT_DIR$/neim-biz/src/main/java/com/jiayue/biz/job/AirDensityJob.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/java/com/jiayue/biz/job/FileAnalysisJob.java" beforeDir="false" afterPath="$PROJECT_DIR$/neim-biz/src/main/java/com/jiayue/biz/job/FileAnalysisJob.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/java/com/jiayue/biz/job/ModbusReciveJob.java" beforeDir="false" afterPath="$PROJECT_DIR$/neim-biz/src/main/java/com/jiayue/biz/job/ModbusReciveJob.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/java/com/jiayue/biz/job/WindTowerCalculationDataJob.java" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/java/com/jiayue/biz/service/HomePageService.java" beforeDir="false" afterPath="$PROJECT_DIR$/neim-biz/src/main/java/com/jiayue/biz/service/HomePageService.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/java/com/jiayue/biz/service/ProjectService.java" beforeDir="false" afterPath="$PROJECT_DIR$/neim-biz/src/main/java/com/jiayue/biz/service/ProjectService.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/java/com/jiayue/biz/service/WindTowerCalculationDataService.java" beforeDir="false" afterPath="$PROJECT_DIR$/neim-biz/src/main/java/com/jiayue/biz/service/WindTowerCalculationDataService.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/java/com/jiayue/biz/service/impl/DataRecalculationImpl.java" beforeDir="false" afterPath="$PROJECT_DIR$/neim-biz/src/main/java/com/jiayue/biz/service/impl/DataRecalculationImpl.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/java/com/jiayue/biz/service/impl/HomePageServiceImpl.java" beforeDir="false" afterPath="$PROJECT_DIR$/neim-biz/src/main/java/com/jiayue/biz/service/impl/HomePageServiceImpl.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/java/com/jiayue/biz/service/impl/PdfServiceImpl.java" beforeDir="false" afterPath="$PROJECT_DIR$/neim-biz/src/main/java/com/jiayue/biz/service/impl/PdfServiceImpl.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/java/com/jiayue/biz/service/impl/ProjectInfoServiceImpl.java" beforeDir="false" afterPath="$PROJECT_DIR$/neim-biz/src/main/java/com/jiayue/biz/service/impl/ProjectInfoServiceImpl.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/java/com/jiayue/biz/service/impl/ProjectServiceImpl.java" beforeDir="false" afterPath="$PROJECT_DIR$/neim-biz/src/main/java/com/jiayue/biz/service/impl/ProjectServiceImpl.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/java/com/jiayue/biz/service/impl/WindDirectionStatisticsDataServiceImpl.java" beforeDir="false" afterPath="$PROJECT_DIR$/neim-biz/src/main/java/com/jiayue/biz/service/impl/WindDirectionStatisticsDataServiceImpl.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/java/com/jiayue/biz/service/impl/WindTowerCalculationDataServiceImpl.java" beforeDir="false" afterPath="$PROJECT_DIR$/neim-biz/src/main/java/com/jiayue/biz/service/impl/WindTowerCalculationDataServiceImpl.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/java/com/jiayue/biz/util/CalculationUtil.java" beforeDir="false" afterPath="$PROJECT_DIR$/neim-biz/src/main/java/com/jiayue/biz/util/CalculationUtil.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/java/com/jiayue/biz/util/CommonUtil.java" beforeDir="false" afterPath="$PROJECT_DIR$/neim-biz/src/main/java/com/jiayue/biz/util/CommonUtil.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/java/com/jiayue/biz/util/DateTimeUtil.java" beforeDir="false" afterPath="$PROJECT_DIR$/neim-biz/src/main/java/com/jiayue/biz/util/DateTimeUtil.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/application-dev.yml" beforeDir="false" afterPath="$PROJECT_DIR$/neim-biz/src/main/resources/application-dev.yml" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/html/ie.html" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/html/ie.html.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/img/bg.png" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/img/fengche.png" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/css/app.60c5599b.css" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/css/app.60c5599b.css.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/css/chunk-1208fcbe.793cbdf1.css" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/css/chunk-1208fcbe.793cbdf1.css.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/css/chunk-171ca186.99047b9c.css" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/css/chunk-171ca186.99047b9c.css.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/css/chunk-24c54c5f.25ee122e.css" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/css/chunk-24c54c5f.25ee122e.css.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/css/chunk-28506e6c.1487a511.css" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/css/chunk-2af653b1.55d20a16.css" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/css/chunk-2af653b1.55d20a16.css.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/css/chunk-32ea1202.153aa359.css" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/css/chunk-32ea1202.153aa359.css.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/css/chunk-345dd7f2.bbc9fa95.css" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/css/chunk-345dd7f2.bbc9fa95.css.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/css/chunk-3724ee0c.c7a6b184.css" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/css/chunk-3724ee0c.c7a6b184.css.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/css/chunk-3ca6096f.9f7e2498.css" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/css/chunk-3ca6096f.9f7e2498.css.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/css/chunk-444dbb2e.3e10cd59.css" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/css/chunk-444dbb2e.3e10cd59.css.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/css/chunk-46876428.680532d0.css" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/css/chunk-46876428.680532d0.css.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/css/chunk-47fed2d0.f9e52dca.css" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/css/chunk-47fed2d0.f9e52dca.css.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/css/chunk-48223c1b.139f8fef.css" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/css/chunk-48223c1b.139f8fef.css.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/css/chunk-55d183ec.4e8637e7.css" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/css/chunk-55d183ec.4e8637e7.css.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/css/chunk-57c7bd1b.84f98409.css" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/css/chunk-57c7bd1b.84f98409.css.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/css/chunk-59e3a2aa.db9979c1.css" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/css/chunk-59e3a2aa.db9979c1.css.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/css/chunk-5a5e4b3e.95f72f1d.css" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/css/chunk-5a5e4b3e.95f72f1d.css.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/css/chunk-5b83c289.ce2a2394.css" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/css/chunk-5b83c289.ce2a2394.css.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/css/chunk-5bcac654.179c4f24.css" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/css/chunk-5bcac654.179c4f24.css.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/css/chunk-5e857f95.daa871e9.css" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/css/chunk-5e857f95.daa871e9.css.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/css/chunk-67417c65.43ccdbe8.css" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/css/chunk-67417c65.43ccdbe8.css.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/css/chunk-6a51e97f.5a402cd2.css" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/css/chunk-6a51e97f.5a402cd2.css.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/css/chunk-6ad04947.f9e52dca.css" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/css/chunk-6ad04947.f9e52dca.css.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/css/chunk-7c4ca7cb.b3dde55f.css" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/css/chunk-7c4ca7cb.b3dde55f.css.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/css/chunk-7ca6e6a6.2e9373c8.css" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/css/chunk-7ca6e6a6.2e9373c8.css.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/css/chunk-7d80f20e.4b262291.css" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/css/chunk-7d80f20e.4b262291.css.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/css/chunk-7d993ace.3a987f25.css" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/css/chunk-7d993ace.3a987f25.css.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/css/chunk-b8e2922c.26edb5dd.css" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/css/chunk-b8e2922c.26edb5dd.css.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/css/chunk-c28ad000.17fbdb6b.css" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/css/chunk-c28ad000.17fbdb6b.css.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/css/chunk-d58e2ee6.925aad09.css" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/css/chunk-d58e2ee6.925aad09.css.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/css/chunk-fc6a2dd6.38c474aa.css" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/css/chunk-fc6a2dd6.38c474aa.css.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/css/chunk-libs.cecb3c02.css" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/css/chunk-libs.cecb3c02.css.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/fonts/element-icons.535877f5.woff" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/fonts/element-icons.732389de.ttf" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/img/401.089007e7.gif" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/img/404.a57b6f31.png" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/img/404_cloud.0f4bc32b.png" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/img/background.a568162c.svg" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/img/bg.110420cf.png" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/img/dark.412ca67e.svg" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/img/fengche.2a8cc8d4.png" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/img/light.4183aad0.svg" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/img/logo.31dfca28.png" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/app.2fbc47d9.js" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/app.2fbc47d9.js.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/app.bcc75f64.js" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/app.bcc75f64.js.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/app.d306d330.js" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/app.d306d330.js.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-005cb0c7.d78b238c.js" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-005cb0c7.d78b238c.js.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-02de484e.f44ecb0c.js" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-02de484e.f44ecb0c.js.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-0d5b0085.2d9a9351.js" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-0d5b0085.2d9a9351.js.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-1208fcbe.4b270fa8.js" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-1208fcbe.4b270fa8.js.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-171ca186.5fa16332.js" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-171ca186.5fa16332.js.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-210a75fa.07aa30da.js" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-210a75fa.07aa30da.js.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-210ca3e9.14cdb213.js" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-210ca3e9.14cdb213.js.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-210ce324.4abfccff.js" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-210ce324.4abfccff.js.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-24c54c5f.a70141cc.js" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-24c54c5f.a70141cc.js.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-2727631f.7cff2b3d.js" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-2727631f.7cff2b3d.js.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-28506e6c.ed468711.js" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-28506e6c.ed468711.js.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-2af653b1.3048c7b2.js" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-2af653b1.3048c7b2.js.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-2ccc379c.f0d982bc.js" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-2ccc379c.f0d982bc.js.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-2d0a3b04.d989512b.js" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-2d0a3b04.d989512b.js.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-2d0b1626.43374031.js" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-2d0b1626.43374031.js.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-2d0b2b28.9ffc10ea.js" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-2d0b2b28.9ffc10ea.js.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-2d0bce05.8f619b9f.js" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-2d0bce05.8f619b9f.js.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-2d0c8e18.22b64a5c.js" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-2d0c8e18.22b64a5c.js.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-2d0c94ba.7dc353e0.js" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-2d0c94ba.7dc353e0.js.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-2d0d0818.5ecb9cc0.js" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-2d0d0818.5ecb9cc0.js.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-2d0da2ea.6c3b83f3.js" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-2d0da2ea.6c3b83f3.js.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-2d0dd9c6.f7dbe80e.js" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-2d0dd9c6.f7dbe80e.js.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-2d0de3b1.0dd0775e.js" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-2d0de3b1.0dd0775e.js.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-2d0e2366.68f2ed78.js" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-2d0e2366.68f2ed78.js.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-2d0f012d.1bde8e38.js" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-2d0f012d.1bde8e38.js.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-2d20955d.d61e817f.js" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-2d20955d.d61e817f.js.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-2d2102b6.a5e01d67.js" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-2d2102b6.a5e01d67.js.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-2d212b99.b700d975.js" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-2d212b99.b700d975.js.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-2d217a3b.89a9c10c.js" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-2d217a3b.89a9c10c.js.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-2d217c9e.8ec1968a.js" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-2d217c9e.8ec1968a.js.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-2d21a3bb.8a51ac4c.js" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-2d21a3bb.8a51ac4c.js.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-2d22252c.60d0f445.js" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-2d22252c.60d0f445.js.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-2d230898.77a5396f.js" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-2d230898.77a5396f.js.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-32ea1202.b7b49c42.js" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-32ea1202.b7b49c42.js.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-345dd7f2.22da2a83.js" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-345dd7f2.22da2a83.js.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-3724ee0c.175c2e37.js" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-3724ee0c.175c2e37.js.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-38a7cfc8.7b2a35b0.js" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-38a7cfc8.7b2a35b0.js.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-39413ce8.3787794b.js" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-39413ce8.3787794b.js.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-3a08d90c.31842239.js" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-3a08d90c.31842239.js.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-3ca6096f.9442c104.js" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-3ca6096f.9442c104.js.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-3ca6096f.bdbd75af.js" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-3ca6096f.bdbd75af.js.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-3de27d00.a2c026ea.js" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-3de27d00.a2c026ea.js.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-3f93175c.cff35383.js" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-3f93175c.cff35383.js.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-444dbb2e.8201de86.js" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-444dbb2e.8201de86.js.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-46876428.6d4cac1f.js" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-46876428.6d4cac1f.js.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-47fed2d0.8c937d89.js" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-47fed2d0.8c937d89.js.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-48223c1b.c3f7af43.js" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-48223c1b.c3f7af43.js.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-529f242d.ecf94593.js" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-529f242d.ecf94593.js.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-55d183ec.74459cf8.js" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-55d183ec.74459cf8.js.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-56f22bce.670a716b.js" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-56f22bce.670a716b.js.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-57c7bd1b.e693d395.js" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-57c7bd1b.e693d395.js.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-582b2a7a.d62f2480.js" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-582b2a7a.d62f2480.js.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-59e3a2aa.ad5ef7f6.js" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-59e3a2aa.ad5ef7f6.js.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-5a5e4b3e.34b6b724.js" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-5a5e4b3e.34b6b724.js.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-5a5e4b3e.ddfb37b6.js" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-5a5e4b3e.ddfb37b6.js.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-5b83c289.8613a998.js" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-5b83c289.8613a998.js.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-5bcac654.d2d0b32f.js" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-5bcac654.d2d0b32f.js.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-5e857f95.2c045003.js" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-5e857f95.2c045003.js.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-5e857f95.659a3da1.js" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-5e857f95.659a3da1.js.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-60006966.ae364316.js" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-60006966.ae364316.js.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-612b035f.ebbe22c6.js" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-612b035f.ebbe22c6.js.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-67417c65.75833f9f.js" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-67417c65.75833f9f.js.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-68702101.246af57d.js" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-68702101.246af57d.js.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-68dadb0c.77b3d78e.js" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-68dadb0c.77b3d78e.js.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-6a51e97f.6a9bafd6.js" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-6a51e97f.6a9bafd6.js.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-6ad04947.6ed1118e.js" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-6ad04947.6ed1118e.js.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-717fd199.ba53c8d0.js" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-717fd199.ba53c8d0.js.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-7c4ca7cb.3d01db05.js" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-7c4ca7cb.3d01db05.js.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-7ca6e6a6.a015c8ac.js" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-7ca6e6a6.a015c8ac.js.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-7ca6e6a6.b5e59ae9.js" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-7ca6e6a6.b5e59ae9.js.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-7d80f20e.1c5d1181.js" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-7d80f20e.1c5d1181.js.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-7d993ace.f9835958.js" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-7d993ace.f9835958.js.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-7fa21b9b.5829dc1a.js" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-7fa21b9b.5829dc1a.js.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-8579d4da.cd51487e.js" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-8579d4da.cd51487e.js.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-873ec724.73d9e1b0.js" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-873ec724.73d9e1b0.js.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-8ee3fc10.e082d0cc.js" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-8ee3fc10.e082d0cc.js.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-9e2b9738.4c09625c.js" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-9e2b9738.4c09625c.js.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-a1cbecf6.84d8e5d8.js" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-a1cbecf6.84d8e5d8.js.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-b8e2922c.8f45b1f7.js" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-b8e2922c.8f45b1f7.js.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-be1c46e2.b94d95b6.js" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-be1c46e2.b94d95b6.js.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-c28ad000.97d8556d.js" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-c28ad000.97d8556d.js.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-d19c1a98.aceece2c.js" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-d19c1a98.aceece2c.js.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-d58e2ee6.69d4087e.js" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-d58e2ee6.69d4087e.js.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-e2ef1232.5ac34eb0.js" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-e2ef1232.5ac34eb0.js.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-ec22a596.5782a3f2.js" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-ec22a596.5782a3f2.js.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-elementUI.fc6f1a32.js" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-elementUI.fc6f1a32.js.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-fc6a2dd6.ac3ff710.js" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-fc6a2dd6.ac3ff710.js.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-libs.2340f19c.js" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/static/js/chunk-libs.2340f19c.js.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/templates/favicon.ico" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/templates/index.html" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/templates/index.html.gz" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-biz/src/main/resources/templates/robots.txt" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-system/neim-system.iml" beforeDir="false" afterPath="$PROJECT_DIR$/neim-system/neim-system.iml" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-system/src/main/java/com/jiayue/framework/config/ResourcesConfig.java" beforeDir="false" afterPath="$PROJECT_DIR$/neim-system/src/main/java/com/jiayue/framework/config/ResourcesConfig.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-ui/src/api/biz/dataQuery/homePage.js" beforeDir="false" afterPath="$PROJECT_DIR$/neim-ui/src/api/biz/dataQuery/homePage.js" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-ui/src/api/biz/dataQuery/project.js" beforeDir="false" afterPath="$PROJECT_DIR$/neim-ui/src/api/biz/dataQuery/project.js" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-ui/src/plugins/download.js" beforeDir="false" afterPath="$PROJECT_DIR$/neim-ui/src/plugins/download.js" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-ui/src/utils/dateTimeFormat.js" beforeDir="false" afterPath="$PROJECT_DIR$/neim-ui/src/utils/dateTimeFormat.js" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-ui/src/views/dataQuery/project/index.vue" beforeDir="false" afterPath="$PROJECT_DIR$/neim-ui/src/views/dataQuery/project/index.vue" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/neim-ui/src/views/largeScreenPage/Subpage/projectEvolve.vue" beforeDir="false" afterPath="$PROJECT_DIR$/neim-ui/src/views/largeScreenPage/Subpage/projectEvolve.vue" afterDir="false" />
+    </list>
     <option name="SHOW_DIALOG" value="false" />
     <option name="HIGHLIGHT_CONFLICTS" value="true" />
     <option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
     <option name="LAST_RESOLUTION" value="IGNORE" />
   </component>
+  <component name="ChangesViewManager">
+    <option name="groupingKeys">
+      <option value="directory" />
+    </option>
+  </component>
+  <component name="CodeStyleSettingsInfer">
+    <option name="done" value="true" />
+  </component>
+  <component name="FileTemplateManagerImpl">
+    <option name="RECENT_TEMPLATES">
+      <list>
+        <option value="Interface" />
+        <option value="Class" />
+      </list>
+    </option>
+  </component>
   <component name="Git.Settings">
     <option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
   </component>
@@ -21,28 +350,87 @@
       <filtered-out-file-type name="COMMIT_BY_MESSAGE" />
     </file-type-list>
   </component>
+  <component name="MarkdownSettingsMigration">
+    <option name="stateVersion" value="1" />
+  </component>
+  <component name="MavenImportPreferences">
+    <option name="generalSettings">
+      <MavenGeneralSettings>
+        <option name="mavenHome" value="$PROJECT_DIR$/../../../soft/apache-maven-3.8.7" />
+      </MavenGeneralSettings>
+    </option>
+  </component>
+  <component name="ProjectCodeStyleSettingsMigration">
+    <option name="version" value="2" />
+  </component>
   <component name="ProjectId" id="2Nu1EBsmt0OXdRP0zIPnSEWzDjr" />
-  <component name="ProjectLevelVcsManager" settingsEditedManually="true" />
+  <component name="ProjectLevelVcsManager" settingsEditedManually="true">
+    <ConfirmationsSetting value="2" id="Add" />
+  </component>
   <component name="ProjectViewState">
     <option name="hideEmptyMiddlePackages" value="true" />
     <option name="showLibraryContents" value="true" />
   </component>
-  <component name="PropertiesComponent">
-    <property name="RunOnceActivity.OpenProjectViewOnStart" value="true" />
-    <property name="RunOnceActivity.ShowReadmeOnStart" value="true" />
-    <property name="SONARLINT_PRECOMMIT_ANALYSIS" value="true" />
-    <property name="WebServerToolWindowFactoryState" value="false" />
-    <property name="last_opened_file_path" value="$PROJECT_DIR$" />
-    <property name="nodejs_interpreter_path.stuck_in_default_project" value="undefined stuck path" />
-    <property name="nodejs_npm_path_reset_for_default_project" value="true" />
-    <property name="nodejs_package_manager_path" value="npm" />
-    <property name="project.structure.last.edited" value="Problems" />
-    <property name="project.structure.proportion" value="0.0" />
-    <property name="project.structure.side.proportion" value="0.2" />
-    <property name="settings.editor.selected.configurable" value="terminal" />
-    <property name="vue.rearranger.settings.migration" value="true" />
-  </component>
-  <component name="RunManager">
+  <component name="PropertiesComponent">{
+  &quot;keyToString&quot;: {
+    &quot;ASKED_MARK_IGNORED_FILES_AS_EXCLUDED&quot;: &quot;true&quot;,
+    &quot;RequestMappingsPanelOrder0&quot;: &quot;0&quot;,
+    &quot;RequestMappingsPanelOrder1&quot;: &quot;1&quot;,
+    &quot;RequestMappingsPanelWidth0&quot;: &quot;75&quot;,
+    &quot;RequestMappingsPanelWidth1&quot;: &quot;75&quot;,
+    &quot;ToolWindowLeetcode.ShowToolbar&quot;: &quot;false&quot;,
+    &quot;WebServerToolWindowFactoryState&quot;: &quot;false&quot;,
+    &quot;last_opened_file_path&quot;: &quot;D:/work/project/neim/neim-ui/src/api/biz/dataQuery&quot;,
+    &quot;nodejs_package_manager_path&quot;: &quot;npm&quot;,
+    &quot;project.structure.last.edited&quot;: &quot;Libraries&quot;,
+    &quot;project.structure.proportion&quot;: &quot;0.0&quot;,
+    &quot;project.structure.side.proportion&quot;: &quot;0.72068965&quot;,
+    &quot;settings.editor.selected.configurable&quot;: &quot;settings.saveactions&quot;,
+    &quot;spring.configuration.checksum&quot;: &quot;11e2f58b52e83c10fcdf618b08664f48&quot;,
+    &quot;ts.external.directory.path&quot;: &quot;D:\\soft\\IntelliJ IDEA 2022.1.3\\plugins\\JavaScriptLanguage\\jsLanguageServicesImpl\\external&quot;,
+    &quot;vue.rearranger.settings.migration&quot;: &quot;true&quot;
+  }
+}</component>
+  <component name="ReactorSettings">
+    <option name="notificationShown" value="true" />
+  </component>
+  <component name="RecentsManager">
+    <key name="CopyFile.RECENT_KEYS">
+      <recent name="D:\work\project\neim\neim-ui\src\api\biz\dataQuery" />
+      <recent name="D:\work\project\neim\neim-ui\src\views\largeScreenPage\Subpage" />
+    </key>
+    <key name="CopyClassDialog.RECENTS_KEY">
+      <recent name="com.jiayue.biz.service" />
+      <recent name="com.jiayue.biz.dto" />
+      <recent name="com.jiayue.biz.domain" />
+      <recent name="com.jiayue.biz.job" />
+    </key>
+  </component>
+  <component name="RunManager" selected="Spring Boot.NeimApplication">
+    <configuration name="com.jiayue.biz.controller.HomePageController" type="Application" factoryName="Application" temporary="true" nameIsGenerated="true">
+      <option name="MAIN_CLASS_NAME" value="com.jiayue.biz.controller.HomePageController" />
+      <module name="neim-biz" />
+      <shortenClasspath name="CLASSPATH_FILE" />
+      <extension name="coverage">
+        <pattern>
+          <option name="PATTERN" value="com.jiayue.biz.controller.*" />
+          <option name="ENABLED" value="true" />
+        </pattern>
+      </extension>
+      <extension name="net.ashald.envfile">
+        <option name="IS_ENABLED" value="false" />
+        <option name="IS_SUBST" value="false" />
+        <option name="IS_PATH_MACRO_SUPPORTED" value="false" />
+        <option name="IS_IGNORE_MISSING_FILES" value="false" />
+        <option name="IS_ENABLE_EXPERIMENTAL_INTEGRATIONS" value="false" />
+        <ENTRIES>
+          <ENTRY IS_ENABLED="true" PARSER="runconfig" IS_EXECUTABLE="false" />
+        </ENTRIES>
+      </extension>
+      <method v="2">
+        <option name="Make" enabled="true" />
+      </method>
+    </configuration>
     <configuration default="true" type="JetRunConfigurationType">
       <method v="2">
         <option name="Make" enabled="true" />
@@ -54,6 +442,44 @@
         <option name="Make" enabled="true" />
       </method>
     </configuration>
+    <configuration name="NeimApplication" type="SpringBootApplicationConfigurationType" factoryName="Spring Boot">
+      <option name="ACTIVE_PROFILES" value="dev" />
+      <module name="neim-biz" />
+      <option name="SPRING_BOOT_MAIN_CLASS" value="com.jiayue.NeimApplication" />
+      <extension name="net.ashald.envfile">
+        <option name="IS_ENABLED" value="false" />
+        <option name="IS_SUBST" value="false" />
+        <option name="IS_PATH_MACRO_SUPPORTED" value="false" />
+        <option name="IS_IGNORE_MISSING_FILES" value="false" />
+        <option name="IS_ENABLE_EXPERIMENTAL_INTEGRATIONS" value="false" />
+        <ENTRIES>
+          <ENTRY IS_ENABLED="true" PARSER="runconfig" IS_EXECUTABLE="false" />
+        </ENTRIES>
+      </extension>
+      <method v="2">
+        <option name="Make" enabled="true" />
+      </method>
+    </configuration>
+    <configuration name="dev" type="js.build_tools.npm" nameIsGenerated="true">
+      <package-json value="$PROJECT_DIR$/neim-ui/package.json" />
+      <command value="run" />
+      <scripts>
+        <script value="dev" />
+      </scripts>
+      <node-interpreter value="project" />
+      <envs />
+      <method v="2" />
+    </configuration>
+    <list>
+      <item itemvalue="Application.com.jiayue.biz.controller.HomePageController" />
+      <item itemvalue="npm.dev" />
+      <item itemvalue="Spring Boot.NeimApplication" />
+    </list>
+    <recent_temporary>
+      <list>
+        <item itemvalue="Application.com.jiayue.biz.controller.HomePageController" />
+      </list>
+    </recent_temporary>
   </component>
   <component name="SpellCheckerSettings" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0" DefaultDictionary="application-level" UseSingleDictionary="true" transferred="true" />
   <component name="TaskManager">
@@ -66,12 +492,103 @@
       <workItem from="1680499045561" duration="848000" />
       <workItem from="1680500040089" duration="80000" />
       <workItem from="1680500146302" duration="52000" />
+      <workItem from="1693976604534" duration="23427000" />
+      <workItem from="1694153981873" duration="16577000" />
+      <workItem from="1694513665871" duration="4197000" />
+      <workItem from="1694650603575" duration="2271000" />
+      <workItem from="1695107939494" duration="980000" />
+      <workItem from="1695257499982" duration="628000" />
+      <workItem from="1695276622520" duration="353000" />
+      <workItem from="1695281051577" duration="1219000" />
+      <workItem from="1695286257855" duration="1280000" />
+      <workItem from="1695354248343" duration="4187000" />
+      <workItem from="1695607939747" duration="22421000" />
+      <workItem from="1695793726102" duration="6019000" />
+      <workItem from="1695869664215" duration="3352000" />
+      <workItem from="1696641708796" duration="6797000" />
+      <workItem from="1696656670801" duration="11930000" />
+      <workItem from="1696761475059" duration="31000" />
+      <workItem from="1696849624496" duration="7420000" />
+      <workItem from="1697072491023" duration="658000" />
+      <workItem from="1697175555968" duration="817000" />
+      <workItem from="1697444776869" duration="1887000" />
+      <workItem from="1697532616616" duration="1472000" />
+      <workItem from="1697598029801" duration="1453000" />
+      <workItem from="1698029227604" duration="38692000" />
+      <workItem from="1698196761315" duration="21165000" />
+      <workItem from="1698296915182" duration="203000" />
+      <workItem from="1698297148742" duration="25584000" />
+      <workItem from="1698627446431" duration="18727000" />
+      <workItem from="1698731205535" duration="19053000" />
+      <workItem from="1698818478401" duration="3133000" />
+      <workItem from="1698988414084" duration="1333000" />
+    </task>
+    <task id="LOCAL-00001" summary="1.开启健康监控节点-用于迁移内网后往公司邮箱发送每日健康监控&#10;2.修改通道数据选择场站时,带入风机名称bug&#10;3.待做项和注意项备注">
+      <created>1694163606551</created>
+      <option name="number" value="00001" />
+      <option name="presentableId" value="LOCAL-00001" />
+      <option name="project" value="LOCAL" />
+      <updated>1694163606551</updated>
+    </task>
+    <task id="LOCAL-00002" summary="1.代码bug修复-韩雪峰在风资源发现时修改并同步到这里">
+      <created>1694410279288</created>
+      <option name="number" value="00002" />
+      <option name="presentableId" value="LOCAL-00002" />
+      <option name="project" value="LOCAL" />
+      <updated>1694410279288</updated>
+    </task>
+    <task id="LOCAL-00003" summary="1.移动modbus接收声雷达程序">
+      <created>1694421784344</created>
+      <option name="number" value="00003" />
+      <option name="presentableId" value="LOCAL-00003" />
+      <option name="project" value="LOCAL" />
+      <updated>1694421784344</updated>
     </task>
+    <task id="LOCAL-00004" summary="1.测试-前后端打包到一起">
+      <created>1696656755508</created>
+      <option name="number" value="00004" />
+      <option name="presentableId" value="LOCAL-00004" />
+      <option name="project" value="LOCAL" />
+      <updated>1696656755508</updated>
+    </task>
+    <task id="LOCAL-00005" summary="1.调整测风塔排序">
+      <created>1696670936878</created>
+      <option name="number" value="00005" />
+      <option name="presentableId" value="LOCAL-00005" />
+      <option name="project" value="LOCAL" />
+      <updated>1696670936878</updated>
+    </task>
+    <task id="LOCAL-00006" summary="1.eol文件添加层高 A 解析">
+      <created>1696853674665</created>
+      <option name="number" value="00006" />
+      <option name="presentableId" value="LOCAL-00006" />
+      <option name="project" value="LOCAL" />
+      <updated>1696853674665</updated>
+    </task>
+    <task id="LOCAL-00007" summary="1.计算实际数据数量未过滤非选择时间区间,造成缺失率出现负数">
+      <created>1696934345266</created>
+      <option name="number" value="00007" />
+      <option name="presentableId" value="LOCAL-00007" />
+      <option name="project" value="LOCAL" />
+      <updated>1696934345266</updated>
+    </task>
+    <option name="localTasksCounter" value="8" />
     <servers />
   </component>
   <component name="TypeScriptGeneratedFilesManager">
     <option name="version" value="3" />
   </component>
+  <component name="Vcs.Log.History.Properties">
+    <option name="COLUMN_ID_ORDER">
+      <list>
+        <option value="Default.Root" />
+        <option value="Default.Author" />
+        <option value="Default.Date" />
+        <option value="Default.Subject" />
+        <option value="Space.CommitStatus" />
+      </list>
+    </option>
+  </component>
   <component name="Vcs.Log.Tabs.Properties">
     <option name="TAB_STATES">
       <map>
@@ -88,10 +605,29 @@
         </entry>
       </map>
     </option>
-    <option name="oldMeFiltersMigrated" value="true" />
   </component>
   <component name="VcsManagerConfiguration">
-    <option name="LAST_COMMIT_MESSAGE" value="" />
+    <option name="CHECK_CODE_SMELLS_BEFORE_PROJECT_COMMIT" value="false" />
+    <option name="CHECK_NEW_TODO" value="false" />
+    <MESSAGE value="1.开启健康监控节点-用于迁移内网后往公司邮箱发送每日健康监控&#10;2.修改通道数据选择场站时,带入风机名称bug&#10;3.待做项和注意项备注" />
+    <MESSAGE value="1.代码bug修复-韩雪峰在风资源发现时修改并同步到这里" />
+    <MESSAGE value="1.移动modbus接收声雷达程序" />
+    <MESSAGE value="1.测试-前后端打包到一起" />
+    <MESSAGE value="1.调整测风塔排序" />
+    <MESSAGE value="1.eol文件添加层高 A 解析" />
+    <MESSAGE value="1.计算实际数据数量未过滤非选择时间区间,造成缺失率出现负数" />
+    <option name="LAST_COMMIT_MESSAGE" value="1.计算实际数据数量未过滤非选择时间区间,造成缺失率出现负数" />
+  </component>
+  <component name="XDebuggerManager">
+    <breakpoint-manager>
+      <breakpoints>
+        <line-breakpoint enabled="true" type="java-line">
+          <url>file://$PROJECT_DIR$/neim-biz/src/main/java/com/jiayue/biz/job/ModbusReciveJob.java</url>
+          <line>191</line>
+          <option name="timeStamp" value="7" />
+        </line-breakpoint>
+      </breakpoints>
+    </breakpoint-manager>
   </component>
   <component name="XSLT-Support.FileAssociations.UIState">
     <expand />

+ 10 - 10
TwoParameterWeibullProbabilityPlotOutput.txt

@@ -1,25 +1,25 @@
 Two Parameter Weibull Probability Plot
 
-Tuesday, 21 February 2023, 10.10
+Wednesday, 1 November 2023, 10.47
 
 Unweighted constrained simplex regression
 
-Gradient:  1.0479        s.e. 0.0105
-Intercept: -0.4092       s.e. 0.0832
+Gradient:  1.0126        s.e. 0.0067
+Intercept: -0.0966       s.e. 0.0463
 
-Correlation Coefficient, r: 0.9699
-Critical Value for r:       0.0501
+Correlation Coefficient, r: 0.9973
+Critical Value for r:       0.0334
 Significance level used:    5.0%
-Sum of squares:             310.8105
+Sum of squares:             62.3871
 
 Best Estimates of the Parameters
-sigma:  8.3156      'pseudo-linear' s.e. 0.0328
-gamma:  2.7443      'pseudo-linear' s.e. 0.0312
+sigma:  7.0092      'pseudo-linear' s.e. 0.0226
+gamma:  2.1561      'pseudo-linear' s.e. 0.0164
 
 The 'pseudo-linear' s.e.s are a lower limit to the s.e. and may significantly underestimate the s.e.
 See documentation, http://www.ee.ucl.ac.uk/~mflanaga/java/ProbabilityPlot.html, for details
 
 'Pseudo-linear' Parameter-Parameter Correlation Coefficients
         sigma       gamma       
-sigma   1.0         0.2401      
-gamma   0.2401      1.0         
+sigma   1.0         0.4088      
+gamma   0.4088      1.0         

+ 12 - 0
neim-biz/pom.xml

@@ -131,10 +131,22 @@
                             <directory>src/main/resources/templates</directory>
                         </fileset>
                         <fileset>
+                            <directory>src/main/resources/js</directory>
+                        </fileset>
+                        <fileset>
+                            <directory>src/main/resources/js</directory>
+                        </fileset>
+                        <fileset>
                             <!-- 最终项目打包自动生成的package目录 -->
                             <directory>src/main/resources/static</directory>
+                        </fileset>
+                        <fileset>
                             <directory>src/main/resources/js</directory>
+                        </fileset>
+                        <fileset>
                             <directory>src/main/resources/largeScreenImg</directory>
+                        </fileset>
+                        <fileset>
                             <directory>src/main/resources/img</directory>
                         </fileset>
                     </filesets>

+ 51 - 2
neim-biz/src/main/java/com/jiayue/biz/controller/DataRecalculationController.java

@@ -4,13 +4,20 @@ import com.jiayue.biz.service.DataRecalculationService;
 import com.jiayue.common.core.domain.AjaxResult;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.fileupload.FileItem;
+import org.apache.commons.fileupload.disk.DiskFileItemFactory;
+import org.apache.commons.io.FileUtils;
+import org.apache.commons.io.IOUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.MediaType;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.commons.CommonsMultipartFile;
 
+import java.io.*;
 import java.util.Date;
 
 /**
@@ -29,7 +36,41 @@ public class DataRecalculationController {
 
     @PostMapping("/uploadFileAnalysis")
     public AjaxResult uploadFileAnalysis(@RequestParam("file") MultipartFile file, @RequestParam("equipmentNo") String equipmentNo, @RequestParam("recorderNo") String recorderNo) {
-        return dataRecalculationService.uploadFileAnalysis(file, equipmentNo, recorderNo);
+
+        MultipartFile file1 = null;
+        try {
+            String uploadfilePath = "." + File.separator + "uploadfile" + File.separator + file.getOriginalFilename();
+            FileUtils.copyInputStreamToFile(file.getInputStream(), new File(uploadfilePath));
+            file1 = getMultipartFile(new File(uploadfilePath));
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+        MultipartFile finalFile = file1;
+        Thread thread = new Thread(new Runnable() {
+            @Override
+            public void run() {
+                dataRecalculationService.uploadFileAnalysis(finalFile, equipmentNo, recorderNo);
+            }
+        });
+        thread.start();
+
+        return AjaxResult.success("提交后台处理文件成功");
+    }
+
+    public static MultipartFile getMultipartFile(File file) {
+        FileItem item = new DiskFileItemFactory().createItem("file"
+                , MediaType.MULTIPART_FORM_DATA_VALUE
+                , true
+                , file.getName());
+        try (InputStream input = new FileInputStream(file);
+             OutputStream os = item.getOutputStream()) {
+            // 流转移
+            IOUtils.copy(input, os);
+        } catch (Exception e) {
+            throw new IllegalArgumentException("Invalid file: " + e, e);
+        }
+
+        return new CommonsMultipartFile(item);
     }
 
     @PostMapping("/dataCheck")
@@ -39,6 +80,14 @@ public class DataRecalculationController {
 
     @PostMapping("/statisticsCheck")
     public AjaxResult statisticsCheck(@RequestParam("startTime") Long startTime, @RequestParam("endTime") Long endTime, @RequestParam("equipmentNo") String equipmentNo) {
-        return dataRecalculationService.statisticsCheck(new Date(startTime), new Date(endTime), equipmentNo);
+        Thread thread = new Thread(new Runnable() {
+            @Override
+            public void run() {
+                dataRecalculationService.statisticsCheck(new Date(startTime), new Date(endTime), equipmentNo);
+            }
+        });
+        thread.start();
+
+        return AjaxResult.success("提交后台重算成功");
     }
 }

+ 76 - 10
neim-biz/src/main/java/com/jiayue/biz/controller/HomePageController.java

@@ -1,14 +1,25 @@
 package com.jiayue.biz.controller;
 
-import com.jiayue.biz.service.*;
+import com.jiayue.biz.domain.ProjectProgressInfo;
+import com.jiayue.biz.service.HomePageService;
+import com.jiayue.biz.service.ProjectProgressInfoService;
+import com.jiayue.biz.util.CommonUtil;
 import com.jiayue.common.core.controller.BaseController;
 import com.jiayue.common.core.domain.AjaxResult;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
 import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.io.FileUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.File;
+import java.io.IOException;
+import java.util.HashSet;
 
 
 /**
@@ -20,10 +31,11 @@ import org.springframework.web.bind.annotation.*;
 @RequiredArgsConstructor(onConstructor_ = @Autowired)
 @RestController
 @RequestMapping("/dataQuery/homePage")
+@Slf4j
 public class HomePageController extends BaseController {
 
     private final HomePageService homePageService;
-
+    private final ProjectProgressInfoService projectProgressInfoService;
 
     /**
      * 首页风速曲线
@@ -142,14 +154,6 @@ public class HomePageController extends BaseController {
         return AjaxResult.success(homePageService.projectSelect());
     }
 
-    @ApiOperation(value = "项目进展情况", notes = "查询项目进展情况")
-    @ApiImplicitParams({
-            @ApiImplicitParam(name = "项目编号", value = "projectId", paramType = "query", dataType = "String"),
-    })
-    @GetMapping("/projectEvolve")
-    public AjaxResult projectEvolve(String projectId) {
-        return AjaxResult.success(homePageService.getProjectEvolve(projectId));
-    }
 
     @ApiOperation(value = "场站总体信息", notes = "查询场站总体信息")
     @ApiImplicitParams({
@@ -207,5 +211,67 @@ public class HomePageController extends BaseController {
         return AjaxResult.success(homePageService.getProjectSeat());
     }
 
+    @ApiOperation(value = "项目进展情况", notes = "查询项目进展情况")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "项目编号", value = "projectId", paramType = "query", dataType = "String"),
+    })
+    @GetMapping("/projectEvolve")
+    public AjaxResult projectEvolve(String projectId) {
+        return AjaxResult.success(homePageService.getProjectProgressEvolve(projectId));
+    }
+
+    @GetMapping("/delProjectProgressInfo")
+    public AjaxResult delProjectProgressInfo(String id) {
+        return AjaxResult.success(projectProgressInfoService.removeById(id));
+    }
+
+    /**
+     * 新增项目
+     */
+    @PutMapping("/updateProjectProgressInfo")
+    public AjaxResult updateProjectProgressInfo(@RequestBody ProjectProgressInfo projectProgressInfo) {
+        projectProgressInfoService.saveOrUpdate(projectProgressInfo);
+        return success("200");
+    }
+
+    @PostMapping("/uploadProjectProgressFile")
+    public AjaxResult uploadProjectProgressFile(@RequestParam("file") MultipartFile file, @RequestParam("id") String id) {
+
+        try {
+            // 得到上传文件后缀
+            String originalName = file.getOriginalFilename();
+            String fileUrl = CommonUtil.getRealPath() + File.separator + "uploadFile" + File.separator;
+
+            // 复制文件
+            File targetFile = new File(fileUrl, originalName);
+            if (targetFile.exists()) {
+                FileUtils.delete(targetFile);
+            }
+            FileUtils.writeByteArrayToFile(targetFile, file.getBytes());
+
+            log.info("文件上传成功:{} ,更新记录信息", fileUrl + originalName);
+
+            ProjectProgressInfo projectProgressInfo = projectProgressInfoService.getById(id);
+            if (null == projectProgressInfo.getFileUrl()) {
+                projectProgressInfo.setFileUrl(new HashSet<>());
+            }
+            projectProgressInfo.getFileUrl().add(fileUrl + originalName);
+            projectProgressInfoService.saveOrUpdate(projectProgressInfo);
+        } catch (IOException e) {
+            logger.error("保存文件到服务器(本地)失败", e);
+        }
+
+        return success("200");
+    }
+
+    @PostMapping("/downloadProjectProgressFile")
+    public void downloadProjectProgressFile(HttpServletResponse response, @RequestBody String filePath) {
+        File projectProgressDirFileNew = new File(filePath);
+        if (projectProgressDirFileNew.exists()) {
+            com.jiayue.biz.util.FileUtil.downloadFile(projectProgressDirFileNew, response);
+
+        }
+    }
+
 
 }

+ 103 - 22
neim-biz/src/main/java/com/jiayue/biz/controller/ProjectController.java

@@ -1,41 +1,39 @@
 package com.jiayue.biz.controller;
 
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.jiayue.biz.domain.Coordinates;
 import com.jiayue.biz.domain.Project;
-import com.jiayue.biz.domain.WindTowerInfo;
+import com.jiayue.biz.domain.ProjectInfo;
+import com.jiayue.biz.domain.ProjectProgressInfo;
 import com.jiayue.biz.dto.ProjectDto;
 import com.jiayue.biz.eunms.ProvinceEnum;
+import com.jiayue.biz.service.ProjectProgressInfoService;
 import com.jiayue.biz.service.ProjectService;
-import com.jiayue.biz.service.WindTowerInfoService;
 import com.jiayue.common.annotation.Log;
 import com.jiayue.common.core.controller.BaseController;
 import com.jiayue.common.core.domain.AjaxResult;
+import com.jiayue.common.core.page.TableDataInfo;
 import com.jiayue.common.enums.BusinessType;
 import com.jiayue.common.utils.poi.ExcelUtil;
-
+import lombok.RequiredArgsConstructor;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.security.core.parameters.P;
-import org.springframework.web.bind.annotation.DeleteMapping;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.PutMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-import java.util.*;
-import java.util.stream.Collectors;
-import javax.servlet.http.HttpServletResponse;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
 
-import cn.hutool.core.util.ObjectUtil;
-import cn.hutool.core.util.StrUtil;
-import lombok.RequiredArgsConstructor;
-
-import com.jiayue.common.core.page.TableDataInfo;
+import javax.servlet.http.HttpServletResponse;
+import java.io.BufferedReader;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
  * 项目Controller
@@ -49,6 +47,7 @@ import com.jiayue.common.core.page.TableDataInfo;
 public class ProjectController extends BaseController {
 
     private final ProjectService iProjectService;
+    private final ProjectProgressInfoService projectProgressInfoService;
 
     /**
      * 查询项目列表
@@ -106,6 +105,30 @@ public class ProjectController extends BaseController {
     @PostMapping
     public AjaxResult add(@RequestBody ProjectDto projectDto) {
         iProjectService.saveProject(projectDto);
+        if (StrUtil.isNotBlank(projectDto.getProjectNo())) {
+            List<ProjectProgressInfo> projectProgressInfoList = new ArrayList<>(3);
+
+            ProjectProgressInfo projectProgressInfo1 = new ProjectProgressInfo();
+            projectProgressInfo1.setProjectNo(projectDto.getProjectNo());
+            projectProgressInfo1.setTaskLevel(1);
+            projectProgressInfo1.setTaskNo("一");
+            projectProgressInfo1.setTaskTitle("成立项目公司");
+            projectProgressInfoList.add(projectProgressInfo1);
+            ProjectProgressInfo projectProgressInfo2 = new ProjectProgressInfo();
+            projectProgressInfo2.setProjectNo(projectDto.getProjectNo());
+            projectProgressInfo2.setTaskLevel(1);
+            projectProgressInfo2.setTaskNo("二");
+            projectProgressInfo2.setTaskTitle("项目核准");
+            projectProgressInfoList.add(projectProgressInfo2);
+            ProjectProgressInfo projectProgressInfo3 = new ProjectProgressInfo();
+            projectProgressInfo3.setProjectNo(projectDto.getProjectNo());
+            projectProgressInfo3.setTaskLevel(1);
+            projectProgressInfo3.setTaskNo("三");
+            projectProgressInfo3.setTaskTitle("投资决策");
+            projectProgressInfoList.add(projectProgressInfo2);
+
+            projectProgressInfoService.saveBatch(projectProgressInfoList);
+        }
         return success("200");
     }
 
@@ -130,7 +153,7 @@ public class ProjectController extends BaseController {
     @DeleteMapping("/{ids}")
     public AjaxResult remove(@PathVariable String ids) {
         iProjectService.delProject(ids);
-        return toAjax(1 );
+        return toAjax(1);
     }
 
     /**
@@ -192,4 +215,62 @@ public class ProjectController extends BaseController {
         }
 
     }
+
+    @PostMapping("/updateProjectInflectionPointCoordinates")
+    public AjaxResult updateProjectInflectionPointCoordinates(@RequestParam("file") MultipartFile file, @RequestParam("projectNo") String projectNo) {
+
+        try {
+            List<String[]> guaidian = new ArrayList<>();
+            List<String[]> fengji = new ArrayList<>();
+            boolean guaidianflag = false;
+            StringBuilder stringBuilder = null;
+            try {
+                if (file != null) {
+                    InputStream bb = file.getInputStream();
+                    InputStreamReader streamReader = new InputStreamReader(bb);
+                    BufferedReader reader = new BufferedReader(streamReader);
+                    String line;
+                    while ((line = reader.readLine()) != null) {
+
+                        if (!guaidianflag && line.contains("GD") || line.contains("FJ")) {
+                            guaidianflag = true;
+                            continue;
+                        }
+                        if (guaidianflag) {
+                            guaidian.add(line.split(","));
+                        } else {
+                            fengji.add(line.split(","));
+                        }
+                    }
+                    reader.close();
+                    bb.close();
+                } else {
+                    stringBuilder.append("空的");
+                }
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+
+
+            ProjectInfo projectInfo = iProjectService.getProjectById(projectNo);
+            List<Coordinates> coordinatesList = new ArrayList<>();
+            guaidian.forEach(g -> {
+                Coordinates coordinates = new Coordinates(g[0], g[1]);
+                coordinatesList.add(coordinates);
+            });
+
+            fengji.forEach(f -> {
+                Coordinates coordinates = new Coordinates(f[0], f[1]);
+                coordinatesList.add(coordinates);
+            });
+            List<List<Coordinates>> coordinatesListR = new ArrayList<>();
+            coordinatesListR.add(coordinatesList);
+            projectInfo.setCoordinates(coordinatesListR);
+            iProjectService.updateProjectInfo(projectInfo);
+        } catch (Exception e) {
+            logger.error("上传拐点坐标文件解析更新失败", e);
+        }
+
+        return success("200");
+    }
 }

+ 41 - 33
neim-biz/src/main/java/com/jiayue/biz/controller/WindTowerCalculationDataController.java

@@ -6,9 +6,9 @@ import com.jiayue.common.core.domain.AjaxResult;
 import com.jiayue.common.core.page.TableDataInfo;
 import lombok.RequiredArgsConstructor;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.*;
-
-import java.util.Date;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
 
 
 /**
@@ -25,7 +25,6 @@ public class WindTowerCalculationDataController extends BaseController {
     private final WindTowerCalculationDataService windTowerCalculationDataService;
 
 
-
     /**
      * 月平均风切变
      *
@@ -36,88 +35,93 @@ public class WindTowerCalculationDataController extends BaseController {
      * @throws Exception
      */
     @GetMapping(value = "/getWindShearByEqidAndAverageAndTime")
-    public AjaxResult getWindShearByEqidAndAverageAndTime(Long startTime,Long endTime, String height, String eqId) {
-        return AjaxResult.success(windTowerCalculationDataService.getWindShearByEqidAndAverageAndTime(startTime,endTime, height, eqId));
+    public AjaxResult getWindShearByEqidAndAverageAndTime(Long startTime, Long endTime, String height, String eqId) {
+        return AjaxResult.success(windTowerCalculationDataService.getWindShearByEqidAndAverageAndTime(startTime, endTime, height, eqId));
     }
 
     /**
      * 平均风速(统计曲线图)
      *
      * @param startTime 开始时间
-     * @param endTime 结束时间
-     * @param height 层高
-     * @param eqId 场站编号
+     * @param endTime   结束时间
+     * @param height    层高
+     * @param eqId      场站编号
      * @return
      */
     @GetMapping(value = "/getWindSpeedByEqidAndTime")
-    public TableDataInfo getWs(Long startTime, Long endTime, String height, String eqId,String uid) {
+    public TableDataInfo getWs(Long startTime, Long endTime, String height, String eqId, String uid) {
 
-        return getDataTable(windTowerCalculationDataService.getWindSpeed(startTime, endTime, height, eqId,uid));
+        return getDataTable(windTowerCalculationDataService.getWindSpeed(startTime, endTime, height, eqId, uid));
 
 
     }
+
     /**
      * 平均湍流(统计曲线图)
      *
      * @param height 层高
-     * @param eqId 场站编号
+     * @param eqId   场站编号
      * @return
      */
     @GetMapping(value = "/getTurbulenceByEqidAndTime")
     public TableDataInfo getTurbulence(Long startTime, Long endTime, String height, String eqId) {
 
-        return getDataTable(windTowerCalculationDataService.getTurbulence(startTime,endTime, height, eqId));
+        return getDataTable(windTowerCalculationDataService.getTurbulence(startTime, endTime, height, eqId));
 
 
     }
+
     /**
      * 平均空气密度(统计曲线图)
      *
-     * @param startTime 开始时间
-     * @param endTime 结束时
+     * @param startTime   开始时间
+     * @param endTime     结束时
      * @param equipmentId 场站编号
-     * @param uid 年月区分id
+     * @param uid         年月区分id
      * @return
      */
     @GetMapping(value = "/getAirDensityByEqidAndTime")
-    public TableDataInfo getAirDensity(Long startTime, Long endTime,String equipmentId,String uid) {
+    public TableDataInfo getAirDensity(Long startTime, Long endTime, String equipmentId, String uid) {
 
-        return getDataTable(windTowerCalculationDataService.getAirDensity(startTime, endTime,equipmentId,uid));
+        return getDataTable(windTowerCalculationDataService.getAirDensity(startTime, endTime, equipmentId, uid));
 
 
     }
+
     /**
      * 平均空气密度(统计曲线图)
      *
      * @param startTime 开始时间
-     * @param endTime 结束时
-     * @param eqId 场站编号
-     * @param uid 年月区分id
-     * @param height 层高
+     * @param endTime   结束时
+     * @param eqId      场站编号
+     * @param uid       年月区分id
+     * @param height    层高
      * @return
      */
     @GetMapping(value = "/getWpdByEqidAndTime")
-    public TableDataInfo getWpd(Long startTime, Long endTime, String height, String eqId,String uid) {
+    public TableDataInfo getWpd(Long startTime, Long endTime, String height, String eqId, String uid) {
 
-        return getDataTable(windTowerCalculationDataService.getWpd(startTime, endTime, height, eqId,uid));
+        return getDataTable(windTowerCalculationDataService.getWpd(startTime, endTime, height, eqId, uid));
 
 
     }
+
     /**
      * 平均风切变(统计曲线图)
      *
-     * @param eqId 场站编号
+     * @param eqId   场站编号
      * @param height 层高
      * @return
      */
     @GetMapping(value = "/getShearByEqidAndTime")
-    public TableDataInfo getShear(Long startTime, Long endTime,String height, String eqId) {
-        return getDataTable(windTowerCalculationDataService.getShear(startTime,endTime, height, eqId));
+    public TableDataInfo getShear(Long startTime, Long endTime, String height, String eqId) {
+        return getDataTable(windTowerCalculationDataService.getShear(startTime, endTime, height, eqId));
 
     }
 
     /**
      * 风资源年统计(风速 + 风功率密度)
+     *
      * @param startTime
      * @param endTime
      * @param height
@@ -125,34 +129,38 @@ public class WindTowerCalculationDataController extends BaseController {
      * @return
      */
     @GetMapping(value = "/getWindResourcesByEqidAndTime")
-    public TableDataInfo getWindResources(Long startTime, Long endTime,String height,String eqId) {
-        return getDataTable(windTowerCalculationDataService.getWindResources(startTime,endTime, height, eqId));
+    public TableDataInfo getWindResources(Long startTime, Long endTime, String height, String eqId) {
+        return getDataTable(windTowerCalculationDataService.getWindResources(startTime, endTime, height, eqId));
     }
+
     /**
      * 风资源年统计(空气密度)
+     *
      * @param startTime
      * @param endTime
      * @param eqId
      * @return
      */
     @GetMapping(value = "/getDensityByEqIdAndTime")
-    public TableDataInfo getDensity(Long startTime, Long endTime,String eqId) {
+    public TableDataInfo getDensity(Long startTime, Long endTime, String eqId) {
 
-        return getDataTable(windTowerCalculationDataService.getDensityYear(startTime,endTime, eqId));
+        return getDataTable(windTowerCalculationDataService.getDensityYear(startTime, endTime, eqId));
 
 
     }
+
     /**
      * Gumbel分布概率
+     *
      * @param startTime
      * @param endTime
      * @param eqId
      * @return
      */
     @GetMapping(value = "/getGumbelByEqIdAndTime")
-    public TableDataInfo getGumbel(Long startTime, Long endTime,String eqId,String height) {
+    public TableDataInfo getGumbel(Long startTime, Long endTime, String eqId, String height) {
 
-        return getDataTable(windTowerCalculationDataService.getGumbel(startTime,endTime, eqId,height));
+        return getDataTable(windTowerCalculationDataService.getGumbel(startTime, endTime, eqId, height));
 
 
     }

+ 92 - 0
neim-biz/src/main/java/com/jiayue/biz/domain/ProjectProgressInfo.java

@@ -0,0 +1,92 @@
+package com.jiayue.biz.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * 项目进度信息
+ */
+@Data
+@NoArgsConstructor
+@Accessors(chain = true)
+@TableName(value = "project_progress_info", autoResultMap = true)
+public class ProjectProgressInfo implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+
+    /**
+     * 主键id
+     */
+    @TableId(type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 项目编号
+     * task_level
+     * task_title
+     * task_content
+     * task_plan_time
+     * task_complete_time
+     * task_status
+     * create_time
+     * update_time
+     */
+    private String projectNo;
+    private String taskFlag;
+    private String taskNo;
+    private String showIndex;
+    private String taskParentNo;
+
+    /**
+     * 任务级别  一,二,三  一级自动生成
+     */
+    private Integer taskLevel;
+
+    /**
+     * 任务名
+     */
+    private String taskTitle;
+
+    /**
+     * 任务内容详情
+     */
+    private String taskContent;
+
+    /**
+     * 计划日期
+     */
+    private Date taskPlanTime;
+    /**
+     * 完成时间
+     */
+    private Date taskCompleteTime;
+
+    /**
+     * 项目状态 0:立项 1:运行 2:终止 3:结束
+     */
+    private String taskStatus;
+    //文件路径
+    @TableField(typeHandler = JacksonTypeHandler.class)
+    private Set<String> fileUrl;
+
+
+    @TableField(exist = false)
+    private List<ProjectProgressInfo> children;
+
+
+    public ProjectProgressInfo(String taskTitle) {
+        this.taskTitle = taskTitle;
+    }
+}

+ 22 - 8
neim-biz/src/main/java/com/jiayue/biz/domain/WindTowerCalculationData.java

@@ -24,31 +24,45 @@ import java.util.Date;
 @TableName("wind_tower_calculation_data")
 public class WindTowerCalculationData implements Serializable {
 
-	private static final long serialVersionUID = 1L;
+    private static final long serialVersionUID = 1L;
 
 
-    /** 主键ID */
+    /**
+     * 主键ID
+     */
     @TableId(type = IdType.ASSIGN_UUID)
     private String id;
 
-    /** 设备主键ID */
+    /**
+     * 设备主键ID
+     */
     @Excel(name = "设备主键ID")
     private String equipmentId;
 
 
-    /** 数据类型ID */
+    /**
+     * 数据类型ID
+     */
     @Excel(name = "数据类型ID")
     private String ebId;
 
-    /** 时间 */
+    /**
+     * 时间
+     */
     @Excel(name = "时间")
     private Date time;
 
-    /** 数值 */
+    /**
+     * 数值
+     */
     @Excel(name = "数值")
     private BigDecimal value;
 
 
-
-
+    public WindTowerCalculationData(Date startTime, String equipmentId, String ebId, BigDecimal value) {
+        this.time = startTime;
+        this.equipmentId = equipmentId;
+        this.ebId = ebId;
+        this.value = value;
+    }
 }

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 22 - 122
neim-biz/src/main/java/com/jiayue/biz/job/AirDensityJob.java


+ 7 - 8
neim-biz/src/main/java/com/jiayue/biz/job/FileAnalysisJob.java

@@ -9,7 +9,6 @@ import com.jiayue.biz.service.impl.EmailImpl;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.annotation.EnableScheduling;
-import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Service;
 
 
@@ -41,7 +40,7 @@ public class FileAnalysisJob {
         this.emailImpl = emailImpl;
     }
 
-    @Scheduled(fixedDelay = 60000)
+    //@Scheduled(fixedDelay = 60000)
     public void fileAnalysis() {
 
         log.debug("文件解析定时任务执行开始");
@@ -51,7 +50,8 @@ public class FileAnalysisJob {
         log.debug("文件解析定时任务执行完成");
 
     }
-//    @Scheduled(fixedDelay = 60000 * 15)
+
+    //    @Scheduled(fixedDelay = 60000 * 15)
     public void sldFileAnalysis() {
 
         log.debug("声雷达文件解析定时任务执行开始");
@@ -61,11 +61,12 @@ public class FileAnalysisJob {
         log.debug("声雷达文件解析定时任务执行完成");
 
     }
-//    @Scheduled(fixedDelay = 6000
-   @Scheduled(fixedDelay = 60000 * 15)
+
+    //    @Scheduled(fixedDelay = 6000
+    //@Scheduled(fixedDelay = 60000 * 15)
     public void eolFileAnalysis() {
 
-        log.debug("eol文件解析定时任务执行开始");
+        log.info("eol文件解析定时任务执行开始");
 
         this.analysisData.moveEolFileAndParseEol();
 
@@ -74,6 +75,4 @@ public class FileAnalysisJob {
     }
 
 
-
-
 }

+ 10 - 12
neim-biz/src/main/java/com/jiayue/biz/job/ModbusReciveJob.java

@@ -8,13 +8,11 @@ import com.jiayue.biz.domain.WindTowerInfo;
 import com.jiayue.biz.service.PointAttributeService;
 import com.jiayue.biz.service.TunnelInfoService;
 import com.jiayue.biz.service.WindTowerInfoService;
-import com.jiayue.biz.service.impl.CheckDataRecode;
 import com.jiayue.biz.service.impl.WindTowerDataParentTableServiceImpl;
 import com.jiayue.biz.util.CalculationUtil;
 import com.jiayue.common.utils.DateUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.annotation.Bean;
 import org.springframework.stereotype.Service;
 import wei.yigulu.modbus.domain.FunctionCode;
 import wei.yigulu.modbus.domain.Obj4RequestRegister;
@@ -58,18 +56,19 @@ public class ModbusReciveJob {
 
     private HashMap<String, ModbusTcpMasterBuilder> masterMap = new HashMap<>();
 
-    @Bean
+    //@Bean
     public void timingTunnel() {
         List<TunnelInfo> tunnelInfoList = tunnelInfoService.list();
         for (TunnelInfo tunnelInfo : tunnelInfoList) {
             //过滤不可用通道
-            if(null != tunnelInfo.getIsAble() && tunnelInfo.getIsAble().equals("0")) {
+            if (null != tunnelInfo.getIsAble() && tunnelInfo.getIsAble().equals("0")) {
                 ModbusTcpMasterBuilder master = start(tunnelInfo);
                 masterMap.put(tunnelInfo.getStationId(), master);
             }
 
         }
     }
+
     //创建线程
     public ModbusTcpMasterBuilder start(TunnelInfo tunnelInfo) {
         //创建通道后    对通道map 进行  采集数据
@@ -91,13 +90,12 @@ public class ModbusReciveJob {
     }
 
 
-
     public void tunnel() {
         List<TunnelInfo> tunnelInfoList = tunnelInfoService.list();
         log.info("接入tunnelInfoList通道:{}", JSONUtil.parse(tunnelInfoList));
         List<PointAttribute> attributeList = pointAttributeService.list();
         String time = DateUtil.format(DateUtil.date(), "yyyy-MM-dd HH:mm:00");
-        log.info("接入modbus时间:{}",time);
+        log.info("接入modbus时间:{}", time);
         //TODO 现场测试筛选数据是否能正常入库
 //        List<HashMap<String, Object>> mapList = new ArrayList<>();
         for (Map.Entry<String, ModbusTcpMasterBuilder> masterBuilderEntry : masterMap.entrySet()) {
@@ -176,7 +174,7 @@ public class ModbusReciveJob {
                             for (Map.Entry<Integer, IModbusDataType> typeEntry : registerData.entrySet()) {
                                 for (Map.Entry<String, Integer> entry : stringStringBuilderMap.entrySet()) {
                                     if (typeEntry.getKey().equals(entry.getValue())) {
-                                        log.info("塔:{} 点位:{}-----数值:{}",tunnelInfo.getEquipmentNo(), typeEntry.getKey(), ((NumericModbusData) typeEntry.getValue()).getValue());
+                                        log.info("塔:{} 点位:{}-----数值:{}", tunnelInfo.getEquipmentNo(), typeEntry.getKey(), ((NumericModbusData) typeEntry.getValue()).getValue());
                                         //点位一致 置换value
                                         pointMap.put(entry.getKey(), ((NumericModbusData) typeEntry.getValue()).getValue());
                                     }
@@ -192,8 +190,8 @@ public class ModbusReciveJob {
                 wsHeightSet.addAll(wdHeightSet);
 
                 windTowerDataParentTableService.saveDataForTunnel(pointMap, wsHeightSet, tunnelInfo.getEquipmentNo(), time);
-            }catch (Exception e){
-                log.error("modbus 接入测风塔:{} 的数据错误:{}",masterBuilderEntry.getKey() ,e);
+            } catch (Exception e) {
+                log.error("modbus 接入测风塔:{} 的数据错误:{}", masterBuilderEntry.getKey(), e);
             }
         }
 
@@ -204,7 +202,7 @@ public class ModbusReciveJob {
         //如果数据库没有此测风塔 读取点表信息增加塔表
         HashMap<String, Integer> dataMap = new HashMap<>();
         for (PointAttribute channelPoint : channelPoints) {
-            if(channelPoint.getUnit() == null){
+            if (channelPoint.getUnit() == null) {
                 channelPoint.setUnit("");
             }
             if ((channelPoint.getUnit().equals("y") || channelPoint.getUnit().equals("Y")) && channelPoint.getMeaning().contains("年")) {
@@ -217,7 +215,7 @@ public class ModbusReciveJob {
                 dataMap.put("HH", channelPoint.getPoint());
             } else if (channelPoint.getUnit().equals("m") && channelPoint.getMeaning().contains("分")) {
                 dataMap.put("mm", channelPoint.getPoint());
-            }  else if (channelPoint.getMeaning().contains("纬")) {
+            } else if (channelPoint.getMeaning().contains("纬")) {
                 dataMap.put("latitude", channelPoint.getPoint());
             } else if (channelPoint.getMeaning().contains("经")) {
                 dataMap.put("longitude", channelPoint.getPoint());
@@ -284,7 +282,7 @@ public class ModbusReciveJob {
             typeStr = "Max";
         } else if (str.contains("最小值")) {
             typeStr = "Min";
-        } else if (str.contains("瞬时") ||str.contains("实时")) {
+        } else if (str.contains("瞬时") || str.contains("实时")) {
             typeStr = "Inst";
         } else if (str.contains("极大")) {
             typeStr = "Great";

+ 0 - 77
neim-biz/src/main/java/com/jiayue/biz/job/WindTowerCalculationDataJob.java

@@ -1,77 +0,0 @@
-package com.jiayue.biz.job;
-
-import com.jiayue.biz.domain.EquipmentAttribute;
-import com.jiayue.biz.domain.WindTowerCalculationData;
-import com.jiayue.biz.domain.WindTowerInfo;
-import com.jiayue.biz.service.WindTowerCalculationDataService;
-import com.jiayue.biz.service.WindTowerDataParentTableService;
-import com.jiayue.biz.service.WindTowerInfoService;
-import com.jiayue.biz.service.impl.EquipmentAttributeServiceImpl;
-import com.jiayue.biz.service.impl.WindTowerCalculationDataServiceImpl;
-import com.jiayue.biz.util.DateMomentUtil;
-import lombok.AllArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.lang3.time.DateUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.scheduling.annotation.EnableScheduling;
-import org.springframework.scheduling.annotation.Scheduled;
-import org.springframework.stereotype.Service;
-
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
-
-@EnableScheduling
-@AllArgsConstructor
-@Slf4j
-@Service
-public class WindTowerCalculationDataJob {
-    private final WindTowerCalculationDataServiceImpl windTowerCalculationDataService;
-
-    @Autowired
-    WindTowerDataParentTableService windTowerDataParentTableService;
-
-    private final WindTowerInfoService windTowerInfoService;
-    @Autowired
-    EquipmentAttributeServiceImpl equipmentAttributeService;
-
-    //每天11点执行一次
-//    @Scheduled(cron = "0 0 16 * * ?")
-    public void calculateWindPowerDensityJob() {
-        try {
-            Date systemDate = new Date();
-            //获取昨日开始和结束时间
-            Long startTime = DateMomentUtil.getDayStartTime(DateUtils.addDays(systemDate, -1).getTime());
-            Long endTime = startTime + 86399000;
-            //查询所有测风塔
-            List<WindTowerInfo> windTowerInfoList = windTowerInfoService.list();
-            List<EquipmentAttribute> list = equipmentAttributeService.list();
-            for (WindTowerInfo windTowerInfo : windTowerInfoList) {
-                List<WindTowerCalculationData> windTowerCalculationDataList = windTowerCalculationDataService.getByBetweenTimeAndEquipmentId(new Date(startTime), new Date(endTime), windTowerInfo.getEquipmentNo());
-                List<Map<String, Object>> maps = windTowerDataParentTableService.selectDataByBetweenTimeAndEquipmetId(new Date(startTime), new Date(endTime), windTowerInfo.getEquipmentNo());
-//                windTowerCalculationDataService.calculateWindPowerDensity(startTime, endTime, windTowerInfo.getEquipmentNo(), maps, list,windTowerCalculationDataList);
-            }
-
-        } catch (Exception e) {
-            log.error("计算风况图数据出错(平均风速,平均风功率密度)");
-            e.printStackTrace();
-        }
-
-    }
-
-    /**
-     * 每小时的15分30秒执行 计算上一小时风切变指数月平均
-     */
-//    @Scheduled(cron = "30 15 0-23 * * ? ")
-//    public void calculateWindPowerShearJob(){
-//        try {
-//            windTowerCalculationDataService.calculateWindPowerShear();
-//        }catch (Exception e){
-//            log.error("时间点:{} 计算风切变指数数据出错:{}",new Date(), e);
-//            e.printStackTrace();
-//        }
-//
-//    }
-
-
-}

+ 7 - 0
neim-biz/src/main/java/com/jiayue/biz/mapper/ProjectProgressInfoMapper.java

@@ -0,0 +1,7 @@
+package com.jiayue.biz.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.jiayue.biz.domain.ProjectProgressInfo;
+
+public interface ProjectProgressInfoMapper extends BaseMapper<ProjectProgressInfo> {
+}

+ 19 - 13
neim-biz/src/main/java/com/jiayue/biz/service/HomePageService.java

@@ -1,13 +1,12 @@
 package com.jiayue.biz.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.jiayue.biz.domain.ProjectProgressInfo;
 import com.jiayue.biz.domain.ProvincialEnergyStations;
-import com.jiayue.biz.domain.WindTowerDataChildTable;
 import com.jiayue.biz.domain.WindTowerDataParentTable;
 import com.jiayue.biz.dto.ProjectEvolveDto;
 import com.jiayue.biz.dto.SelectLabForVal;
 
-import java.math.BigDecimal;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -21,9 +20,9 @@ import java.util.Map;
  */
 public interface HomePageService extends IService<WindTowerDataParentTable> {
     /*首页玫瑰图*/
-    HashMap<String, Object> homePageRose(String equipmentId, String height,String month);
+    HashMap<String, Object> homePageRose(String equipmentId, String height, String month);
 
-    Map<String, Object> getWsAndWpdForHeight(String equipmentId,String month);
+    Map<String, Object> getWsAndWpdForHeight(String equipmentId, String month);
 
     /*首页风速曲线*/
     Map<String, Object> homePageCharts(String equipmentId, String month);
@@ -38,37 +37,40 @@ public interface HomePageService extends IService<WindTowerDataParentTable> {
 
 
     /*首页地图*/
-    List<Map<String,Object>> homePageMap();
+    List<Map<String, Object>> homePageMap();
+
     /*首页所有塔的地图*/
-    List<Map<String,Object>> homePageAllWindMap();
+    List<Map<String, Object>> homePageAllWindMap();
 
 
     //首页空气密度、温度、压强平均值
-    Map<String, Object> getAirAndPaAndT(String projectId,String equipmentId, String month);
+    Map<String, Object> getAirAndPaAndT(String projectId, String equipmentId, String month);
 
     //首页场站空气密度、温度、压强平均值
-    Map<String, Object> selectStationTForAir(String stationId,String equipmentId, String month);
+    Map<String, Object> selectStationTForAir(String stationId, String equipmentId, String month);
 
 
     //首页全省资源概述
-    HashMap<String,String> getResourcesOverview();
+    HashMap<String, String> getResourcesOverview();
 
     //获取华电以及全省资源概况
     ProvincialEnergyStations getProvincialEnergyStations();
 
     //获取项目类别以及项目概况
-    HashMap<String,Object> getProjectSort();
+    HashMap<String, Object> getProjectSort();
 
     //查询项目概况
     HashMap<String, Object> projectMapInfo(String projectId);
+
     /**
-     *  项目测风塔下拉框
+     * 项目测风塔下拉框
+     *
      * @return List<SelectLabForVal>
      */
-     List<SelectLabForVal> projectSelect();
+    List<SelectLabForVal> projectSelect();
 
     //查询场站信息以及场站列表
-    HashMap<String,Object> getStationTotalityInfo();
+    HashMap<String, Object> getStationTotalityInfo();
 
     /**
      * 查询场站详细信息(风机、机型等)
@@ -92,10 +94,14 @@ public interface HomePageService extends IService<WindTowerDataParentTable> {
     //项目进展
     List<ProjectEvolveDto> getProjectEvolve(String projectId);
 
+    List<ProjectProgressInfo> getProjectProgressEvolve(String projectId);
+
     //地图点位坐标 (风机、测风塔、拐点)
     HashMap<String, Object> getPointMap();
+
     //查询所有的场站坐标
     HashMap<String, Object> getStationSeat();
+
     //查询所有的项目坐标
     ArrayList<Object> getProjectSeat();
 }

+ 9 - 0
neim-biz/src/main/java/com/jiayue/biz/service/ProjectProgressInfoService.java

@@ -0,0 +1,9 @@
+package com.jiayue.biz.service;
+
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.jiayue.biz.domain.ProjectProgressInfo;
+
+public interface ProjectProgressInfoService extends IService<ProjectProgressInfo> {
+
+}

+ 9 - 2
neim-biz/src/main/java/com/jiayue/biz/service/ProjectService.java

@@ -1,8 +1,9 @@
 package com.jiayue.biz.service;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.jiayue.biz.domain.Project;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.jiayue.biz.domain.Project;
+import com.jiayue.biz.domain.ProjectInfo;
 import com.jiayue.biz.dto.ProjectDto;
 
 import java.util.List;
@@ -15,16 +16,22 @@ import java.util.List;
  */
 public interface ProjectService extends IService<Project> {
     // 根据项目名称模糊查询
-    Page getByProjectName(Integer current, Integer size,String projectName);
+    Page getByProjectName(Integer current, Integer size, String projectName);
 
     //查询组装项目列表
     List<ProjectDto> getProject(Project project);
 
+    ProjectInfo getProjectById(String projectId);
+
     //修改项目
     void updateProject(ProjectDto projectDto);
+
+    void updateProjectInfo(ProjectInfo projectInfo);
+
     //新增项目
     void saveProject(ProjectDto projectDto);
 
     void delProject(String id);
 
+
 }

+ 68 - 0
neim-biz/src/main/java/com/jiayue/biz/service/WindDataCalculationService.java

@@ -0,0 +1,68 @@
+package com.jiayue.biz.service;
+
+import com.jiayue.biz.domain.*;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+public interface WindDataCalculationService {
+
+
+    ArrayList<WindTowerCalculationData> calcu(ArrayList<WindTowerCalculationData> dataList, Date startDate, Date endDate, String equipmentNo
+            , List<ProphaseAnemometryData> prophaseAnemometryDataList, List<ProphaseWeatherData> prophaseWeatherDataList, Map<String, EquipmentAttribute> equipmentAttributeMap
+            , List<WindTowerCalculationData> windTowerCalculationDataList, WindTowerInfo windTowerInfo);
+
+    /**
+     * 重算
+     *
+     * @param dataList
+     * @param startDate
+     * @param endDate
+     * @param equipmentNo
+     * @param prophaseAnemometryDataList
+     * @param prophaseWeatherDataList
+     * @param equipmentAttributeMap
+     * @param windTowerCalculationDataList
+     * @param windTowerInfo
+     * @return
+     */
+    ArrayList<WindTowerCalculationData> calcuRe(ArrayList<WindTowerCalculationData> dataList, Date startDate, Date endDate, String equipmentNo
+            , List<ProphaseAnemometryData> prophaseAnemometryDataList, List<ProphaseWeatherData> prophaseWeatherDataList, Map<String, EquipmentAttribute> equipmentAttributeMap
+            , List<WindTowerCalculationData> windTowerCalculationDataList, WindTowerInfo windTowerInfo);
+
+    /**
+     * 日均数据计算
+     *
+     * @param dataList
+     * @param startDate
+     * @param endDate
+     * @param equipmentNo
+     * @param prophaseAnemometryDataList
+     * @param prophaseWeatherDataList
+     * @param equipmentAttributeMap
+     * @param windTowerCalculationDataList
+     * @return
+     */
+    ArrayList<WindTowerCalculationData> calcuForDay(ArrayList<WindTowerCalculationData> dataList, Date startDate, Date endDate, String equipmentNo, List<ProphaseAnemometryData> prophaseAnemometryDataList
+            , List<ProphaseWeatherData> prophaseWeatherDataList, Map<String, EquipmentAttribute> equipmentAttributeMap
+            , List<WindTowerCalculationData> windTowerCalculationDataList, WindTowerInfo windTowerInfo);
+
+    /**
+     * 月均数据计算
+     *
+     * @param dataList
+     * @param startDate
+     * @param endDate
+     * @param equipmentNo
+     * @param prophaseAnemometryDataList
+     * @param prophaseWeatherDataList
+     * @param equipmentAttributeMap
+     * @param windTowerCalculationDataList
+     * @return
+     */
+    ArrayList<WindTowerCalculationData> calcuForMonth(ArrayList<WindTowerCalculationData> dataList, Date startDate, Date endDate, String equipmentNo
+            , List<ProphaseAnemometryData> prophaseAnemometryDataList, List<ProphaseWeatherData> prophaseWeatherDataList, Map<String, EquipmentAttribute> equipmentAttributeMap
+            , List<WindTowerCalculationData> windTowerCalculationDataList, WindTowerInfo windTowerInfo);
+}

+ 18 - 33
neim-biz/src/main/java/com/jiayue/biz/service/WindTowerCalculationDataService.java

@@ -1,48 +1,18 @@
 package com.jiayue.biz.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
-import com.jiayue.biz.domain.*;
+import com.jiayue.biz.domain.EquipmentAttribute;
+import com.jiayue.biz.domain.WindTowerCalculationData;
 
-import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
-import java.util.Map;
 
 
 public interface WindTowerCalculationDataService extends IService<WindTowerCalculationData> {
 
-    //计算风功率密度
-    List<WindTowerCalculationData> calculateWindPowerDensity(Long startTime, Long endTime, String equipmentNo, List<ProphaseAnemometryData> prophaseAnemometryDataList, List<ProphaseWeatherData> prophaseWeatherDataList, List<EquipmentAttribute> equipmentAttributeList, List<WindTowerCalculationData> windTowerCalculationDataList);
 
-    List getWindShearByEqidAndAverageAndTime(Long startTime,Long endTime, String height, String eqId);
+    List getWindShearByEqidAndAverageAndTime(Long startTime, Long endTime, String height, String eqId);
 
-    //风速
-    List getWindSpeed(Long startTime, Long endTime, String height, String eqId, String uid);
-
-    //湍流
-    List getTurbulence(Long startTime, Long endTime, String height, String eqId);
-
-    //空气密度
-    List getAirDensity(Long startTime, Long endTime, String equipmentId, String uid);
-
-    //日发电量与满发小时数
-    ArrayList<WindTowerCalculationData> calculateBattery(Long startTime, Long endTime, WindTowerInfo windTowerInfo, List<ProphaseAnemometryData> prophaseAnemometryDataList, List<EquipmentAttribute> equipmentAttributeList, List<WindTowerCalculationData> windTowerCalculationDataList);
-
-
-    //风功率密度
-    List getWpd(Long startTime, Long endTime, String height, String eqId, String uid);
-
-    //风切变
-    List getShear(Long startTime, Long endTime, String height, String eqId);
-
-    //风资源年统计
-    List getWindResources(Long startTime, Long endTime, String height, String eqId);
-
-    //空气密度年统计
-    List getDensityYear(Long startTime, Long endTime, String eqId);
-
-    //Gumbel
-    List getGumbel(Long startTime, Long endTime, String eqId, String height);
 
     /**
      * 根据设备编号获取该设备的最后一条统计数据
@@ -55,4 +25,19 @@ public interface WindTowerCalculationDataService extends IService<WindTowerCalcu
 
     List<WindTowerCalculationData> getByBetweenTimeAndEquipmentIdAndEbId(Date startTime, Date endTime, String equipmentId, List<EquipmentAttribute> equipmentAttributeList);
 
+    List<?> getTurbulence(Long startTime, Long endTime, String height, String eqId);
+
+    List<?> getAirDensity(Long startTime, Long endTime, String equipmentId, String uid);
+
+    List<?> getWindSpeed(Long startTime, Long endTime, String height, String eqId, String uid);
+
+    List<?> getShear(Long startTime, Long endTime, String height, String eqId);
+
+    List<?> getWpd(Long startTime, Long endTime, String height, String eqId, String uid);
+
+    List<?> getWindResources(Long startTime, Long endTime, String height, String eqId);
+
+    List<?> getDensityYear(Long startTime, Long endTime, String eqId);
+
+    List<?> getGumbel(Long startTime, Long endTime, String eqId, String height);
 }

+ 35 - 87
neim-biz/src/main/java/com/jiayue/biz/service/impl/DataRecalculationImpl.java

@@ -2,16 +2,13 @@ package com.jiayue.biz.service.impl;
 
 
 import cn.hutool.core.util.ZipUtil;
+import cn.hutool.json.JSONUtil;
 import cn.hutool.poi.excel.ExcelReader;
 import cn.hutool.poi.excel.ExcelUtil;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.jiayue.biz.domain.*;
 import com.jiayue.biz.mapper.ProphaseAnemometryDataMapper;
-import com.jiayue.biz.mapper.ProphaseWeatherDataMapper;
-import com.jiayue.biz.service.DataRecalculationService;
-import com.jiayue.biz.service.EquipmentAttributeService;
-import com.jiayue.biz.service.ProphaseWeatherDataService;
-import com.jiayue.biz.service.WindTowerDataChildTableService;
+import com.jiayue.biz.service.*;
 import com.jiayue.biz.util.DateTimeUtil;
 import com.jiayue.biz.util.FileUtil;
 import com.jiayue.common.core.domain.AjaxResult;
@@ -22,7 +19,6 @@ import org.apache.poi.xssf.streaming.SXSSFRow;
 import org.apache.poi.xssf.streaming.SXSSFSheet;
 import org.apache.poi.xssf.streaming.SXSSFWorkbook;
 import org.joda.time.DateTime;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.web.multipart.MultipartFile;
 
@@ -49,6 +45,7 @@ public class DataRecalculationImpl implements DataRecalculationService {
 
     private final WindTowerInfoServiceImpl windTowerInfoService;
     private final WindTowerCalculationDataServiceImpl windTowerCalculationDataService;
+    private final WindDataCalculationService windDataCalculationService;
 
     private final WindDirectionStatisticsDataServiceImpl windDirectionStatisticsDataService;
 
@@ -62,7 +59,6 @@ public class DataRecalculationImpl implements DataRecalculationService {
     private final ProphaseAnemometryDataMapper prophaseAnemometryDataMapper;
 
 
-
     public void teset() {
 //    File file1 = MultipartFileToFile(file);
 //    //如果是压缩包
@@ -326,7 +322,7 @@ public class DataRecalculationImpl implements DataRecalculationService {
             //txt转xls
             analysisTXT(f.getPath(), excelFile);
             //xls文件解析入库
-            analysisExcel(new File(excelFile),equipmentNo);
+            analysisExcel(new File(excelFile), equipmentNo);
             //转换成xls文件后删除txt文件
             f.delete();
             //解析完成后删除xls文件
@@ -464,7 +460,7 @@ public class DataRecalculationImpl implements DataRecalculationService {
      *
      * @param file 文件
      */
-    public void analysisExcel(File file,String equipmentNo) {
+    public void analysisExcel(File file, String equipmentNo) {
         String type = "rld";
         ExcelReader reader = ExcelUtil.getReader(file, 0);
         List<List<Object>> read = reader.read(0);
@@ -595,14 +591,20 @@ public class DataRecalculationImpl implements DataRecalculationService {
 
     }
 
+    private final WindTowerCalculationDataServiceImpl windTowerCalculationDataServiceImpl;
+
     public AjaxResult statisticsCheck(Date startTime, Date endTime, String equipmentNo) {
         try {
+            log.info("开始重新计算统计数据:startTime-{};endTime-{};equipmentNo-{};", endTime, endTime, equipmentNo);
             //获取到结束时间的当天最后时间
             endTime = DateTimeUtil.getDayLastTime(endTime.getTime());
-            List<StatisticsSituation> statisticsSituations = statisticsSituationService.list();
-            List<EquipmentAttribute> equipmentAttributeList = equipmentAttributeService.list();
-            List<WindTowerCalculationData> windTowerCalculationDataList = windTowerCalculationDataService.getByBetweenTimeAndEquipmentId(startTime, endTime, equipmentNo);
             List<WindTowerInfo> windTowerInfoList = windTowerInfoService.getByEquipmentNo(equipmentNo);
+            WindTowerInfo windTowerInfo = null;
+            if (null != windTowerInfoList && null != windTowerInfoList.get(0)) {
+                windTowerInfo = windTowerInfoList.get(0);
+            } else {
+                return AjaxResult.error("测风塔信息查询异常:{}", JSONUtil.toJsonStr(windTowerInfoList));
+            }
             //风数据查询
             List<ProphaseAnemometryData> prophaseAnemometryDataList = prophaseAnemometryDataMapper.selectList(Wrappers.<ProphaseAnemometryData>lambdaQuery()
                     .eq(ProphaseAnemometryData::getEquipmentId, equipmentNo)
@@ -610,83 +612,29 @@ public class DataRecalculationImpl implements DataRecalculationService {
                     .ge(ProphaseAnemometryData::getTs, new Timestamp(startTime.getTime())));
             //环境数据查询
             List<ProphaseWeatherData> prophaseWeatherDataList = prophaseWeatherDataService.selectPublicData(equipmentNo, new Timestamp(startTime.getTime()), new Timestamp(endTime.getTime()));
-            //把传入的时间按照日或月分割
-            log.info("开始重新计算统计数据");
-            ArrayList<WindTowerCalculationData> allDataList = new ArrayList<>();
-            //小时风功率密度和平均风速
-            ArrayList<WindTowerCalculationData> dataList = windTowerCalculationDataService.calculateWindPowerDensity(startTime.getTime(), endTime.getTime(), equipmentNo, prophaseAnemometryDataList, prophaseWeatherDataList, equipmentAttributeList, windTowerCalculationDataList);
-            allDataList.addAll(dataList);
-            //小时风切变
-            ArrayList<WindTowerCalculationData> calculationData = windTowerCalculationDataService.calculateWindPowerShear(startTime, endTime, equipmentNo, prophaseAnemometryDataList, windTowerCalculationDataList);
-            allDataList.addAll(calculationData);
-            //日平均温度
-            ArrayList<WindTowerCalculationData> tDay = windTowerCalculationDataService.tDay(startTime, endTime, equipmentNo, prophaseWeatherDataList, equipmentAttributeList);
-            allDataList.addAll(tDay);
-            //日平均气压
-            ArrayList<WindTowerCalculationData> paDay = windTowerCalculationDataService.paDay(startTime, endTime, equipmentNo, prophaseWeatherDataList, equipmentAttributeList);
-            allDataList.addAll(paDay);
-            //发电量与满发小时数
-            ArrayList<WindTowerCalculationData> calculateBattery = windTowerCalculationDataService.calculateBattery(startTime.getTime(), endTime.getTime(), windTowerInfoList.get(0), prophaseAnemometryDataList,  equipmentAttributeList, windTowerCalculationDataList);
-            allDataList.addAll(calculateBattery);
-            //日平均风速
-            ArrayList<WindTowerCalculationData> wsDay = windTowerCalculationDataService.wsDay(startTime, endTime, equipmentNo, windTowerCalculationDataList, equipmentAttributeList, windTowerInfoList);
-            allDataList.addAll(wsDay);
-            //日平均风速标差
-            ArrayList<WindTowerCalculationData> calculationData1 = windTowerCalculationDataService.calculateStaDay(startTime, endTime, equipmentNo, prophaseAnemometryDataList, equipmentAttributeList, windTowerInfoList, windTowerCalculationDataList);
-            allDataList.addAll(calculationData1);
-            //日平均湍流
-            ArrayList<WindTowerCalculationData> turbulenceDay = windTowerCalculationDataService.turbulenceDay(startTime, endTime, equipmentNo, equipmentAttributeList, windTowerInfoList, windTowerCalculationDataList);
-            allDataList.addAll(turbulenceDay);
-            //日平均空气密度
-            ArrayList<WindTowerCalculationData> airDensityDay = windTowerCalculationDataService.airDensityDay(startTime, endTime, equipmentNo, prophaseWeatherDataList, equipmentAttributeList, windTowerCalculationDataList);
-            allDataList.addAll(airDensityDay);
-            //日平均风功率密度
-            ArrayList<WindTowerCalculationData> wpdDay = windTowerCalculationDataService.wpdDay(startTime, endTime, equipmentNo, windTowerCalculationDataList, equipmentAttributeList, windTowerInfoList);
-            allDataList.addAll(wpdDay);
-            //日平均风切变
-            ArrayList<WindTowerCalculationData> shearDay = windTowerCalculationDataService.shearDay(startTime, endTime, equipmentNo, windTowerCalculationDataList, equipmentAttributeList, windTowerInfoList,prophaseAnemometryDataList);
-            allDataList.addAll(shearDay);
-
-
-            List<Long> dateTime = DateTimeUtil.getIntervalTimeByMonth(DateTimeUtil.beginOfMonth(startTime), DateTimeUtil.beginOfMonth(endTime));
-            for (Long l : dateTime) {
-                //月平均风速
-                ArrayList<WindTowerCalculationData> wsMonth = windTowerCalculationDataService.wsMonth(DateTimeUtil.beginOfMonth(new Date(l)), DateTimeUtil.endOfMonth(new Date(l)), equipmentNo, windTowerCalculationDataList, equipmentAttributeList, windTowerInfoList);
-                allDataList.addAll(wsMonth);
-                //月平均风功率密度
-                ArrayList<WindTowerCalculationData> wpdMonth = windTowerCalculationDataService.wpdMonth(DateTimeUtil.beginOfMonth(new Date(l)), DateTimeUtil.endOfMonth(new Date(l)), equipmentNo, windTowerCalculationDataList, equipmentAttributeList, windTowerInfoList);
-                allDataList.addAll(wpdMonth);
-                //月平均湍流
-                ArrayList<WindTowerCalculationData> turbulenceMonth = windTowerCalculationDataService.turbulenceMonth(DateTimeUtil.beginOfMonth(new Date(l)), DateTimeUtil.endOfMonth(new Date(l)), equipmentNo, windTowerCalculationDataList, equipmentAttributeList, windTowerInfoList);
-                allDataList.addAll(turbulenceMonth);
-                //月平均空气密度
-                ArrayList<WindTowerCalculationData> airDensityMonth = windTowerCalculationDataService.airDensityMonth(DateTimeUtil.beginOfMonth(new Date(l)), DateTimeUtil.endOfMonth(new Date(l)), equipmentNo, windTowerCalculationDataList, equipmentAttributeList);
-                allDataList.addAll(airDensityMonth);
-                //月最大风速
-                ArrayList<WindTowerCalculationData> wsMaxMonth = windTowerCalculationDataService.wsMaxMonth(DateTimeUtil.beginOfMonth(new Date(l)), DateTimeUtil.endOfMonth(new Date(l)), equipmentNo, prophaseAnemometryDataList, equipmentAttributeList, windTowerInfoList);
-                allDataList.addAll(wsMaxMonth);
-                //月平均风切变
-                ArrayList<WindTowerCalculationData> shearMonth = windTowerCalculationDataService.shearMonth(DateTimeUtil.beginOfMonth(new Date(l)), DateTimeUtil.endOfMonth(new Date(l)), equipmentNo, windTowerCalculationDataList, equipmentAttributeList, windTowerInfoList,prophaseAnemometryDataList);
-                allDataList.addAll(shearMonth);
-                //月平均风速标差
-                ArrayList<WindTowerCalculationData> staMonth = windTowerCalculationDataService.staMonth(DateTimeUtil.beginOfMonth(new Date(l)), DateTimeUtil.endOfMonth(new Date(l)), equipmentNo, prophaseAnemometryDataList, equipmentAttributeList, windTowerInfoList);
-                allDataList.addAll(staMonth);
-                //月玫瑰图
-                windDirectionStatisticsDataService.roseMonth(DateTimeUtil.beginOfMonth(new Date(l)), DateTimeUtil.endOfMonth(new Date(l)), equipmentNo, prophaseAnemometryDataList,prophaseWeatherDataList, equipmentAttributeList);
-                //月平均环境数据
-                ArrayList<WindTowerCalculationData> environmentData = windTowerCalculationDataService.environmentData(DateTimeUtil.beginOfMonth(new Date(l)), DateTimeUtil.endOfMonth(new Date(l)), equipmentNo, prophaseWeatherDataList, equipmentAttributeList);
-                allDataList.addAll(environmentData);
-                //空气密度月逐时
-                ArrayList<WindTowerCalculationData> airDensityMonth1 = windTowerCalculationDataService.airDensityMonth(equipmentNo, DateTimeUtil.beginOfMonth(new Date(l)), DateTimeUtil.endOfMonth(new Date(l)), prophaseWeatherDataList);
-                allDataList.addAll(airDensityMonth1);
-                //湍流月逐时
-                ArrayList<WindTowerCalculationData> turbulenceHourForMonth = windTowerCalculationDataService.turbulenceHourForMonth(equipmentNo, DateTimeUtil.beginOfMonth(new Date(l)), DateTimeUtil.endOfMonth(new Date(l)), prophaseAnemometryDataList, equipmentAttributeList, windTowerInfoList);
-                allDataList.addAll(turbulenceHourForMonth);
+
+            log.info("重算数据查询完成- prophaseWeatherDataList:{};prophaseAnemometryDataList:{}", prophaseWeatherDataList.size(), prophaseAnemometryDataList.size());
+            if (0 == prophaseWeatherDataList.size() || 0 == prophaseAnemometryDataList.size()) {
+                log.error("未查询到计算需要的数据");
+                return AjaxResult.error("未查询到计算需要的数据");
             }
+
+            List<EquipmentAttribute> equipmentAttributeList = equipmentAttributeService.list();
+            List<WindTowerCalculationData> windTowerCalculationDataList = windTowerCalculationDataService.getByBetweenTimeAndEquipmentId(startTime, endTime, equipmentNo);
+
+            ArrayList<WindTowerCalculationData> allDataList = new ArrayList<>();
+            Map<String, EquipmentAttribute> equipmentAttributeMap = equipmentAttributeList.stream().collect(Collectors.toMap(x -> x.getFieldName() + "", x -> x, (x1, x2) -> x1));
+            allDataList = windDataCalculationService.calcu(allDataList, startTime, endTime, equipmentNo, prophaseAnemometryDataList
+                    , prophaseWeatherDataList, equipmentAttributeMap, windTowerCalculationDataList, windTowerInfo);
+            log.info("数据计算完成,开始保存:{}", allDataList.size());
             // 统计概述
-            statisticsSituationService.statisticsSituation(windTowerInfoList.get(0), statisticsSituations, equipmentAttributeList);
-            windTowerCalculationDataService.saveBatchByEquipmentId(allDataList,equipmentNo);
-            log.info("计算统计数据执行完毕");
+            List<StatisticsSituation> statisticsSituations = statisticsSituationService.list();
+            statisticsSituationService.statisticsSituation(windTowerInfo, statisticsSituations, equipmentAttributeList);
+
+            //删除时间段所有数据后保存新数据
+            windTowerCalculationDataServiceImpl.removeByStartTimeBetweenAndEquipmentIdAndEbId(startTime, endTime, equipmentNo, "");
+            windTowerCalculationDataService.saveBatchByEquipmentId(allDataList, equipmentNo);
+            log.info("计算统计数据保存执行完毕");
             return AjaxResult.success("数据已经重新统计");
         } catch (Exception e) {
             log.info("数据统计计算时异常");

+ 40 - 12
neim-biz/src/main/java/com/jiayue/biz/service/impl/HomePageServiceImpl.java

@@ -1,43 +1,31 @@
 package com.jiayue.biz.service.impl;
 
 import cn.hutool.core.date.DateTime;
-import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.db.Entity;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.jiayue.biz.conf.RequestDataHelper;
 import com.jiayue.biz.domain.*;
 import com.jiayue.biz.dto.EquipmentDto;
 import com.jiayue.biz.dto.ProjectEvolveDto;
 import com.jiayue.biz.dto.ProjectInfoDto;
 import com.jiayue.biz.dto.SelectLabForVal;
 import com.jiayue.biz.eunms.WindDirectionEnum;
-import com.jiayue.biz.mapper.ProphaseAnemometryDataMapper;
-import com.jiayue.biz.mapper.ProphaseWeatherDataMapper;
 import com.jiayue.biz.mapper.WindTowerDataParentTableMapper;
 import com.jiayue.biz.service.*;
 import com.jiayue.biz.util.CalculationUtil;
 import com.jiayue.biz.util.DateTimeUtil;
-import com.jiayue.common.core.redis.RedisCache;
 import com.jiayue.common.utils.DateUtil;
-import com.jiayue.common.utils.spring.SpringUtils;
-import com.sun.corba.se.spi.ior.ObjectKey;
 import lombok.AllArgsConstructor;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.sql.Timestamp;
-import java.sql.Wrapper;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.*;
 import java.util.stream.Collectors;
-import java.util.stream.Stream;
 
 /**
  * 首页Service业务层处理
@@ -84,6 +72,7 @@ public class HomePageServiceImpl extends ServiceImpl<WindTowerDataParentTableMap
 
     private final Double e = 10.0;
 
+    private final ProjectProgressInfoService projectProgressInfoService;
 
     /**
      * 风速 风功率 柱状图
@@ -1154,6 +1143,7 @@ public class HomePageServiceImpl extends ServiceImpl<WindTowerDataParentTableMap
 
     //项目进展
     public List<ProjectEvolveDto> getProjectEvolve(String projectId) {
+
         //查询项目进展信息
         List<ProjectProgress> projectProgresses = proProjectInfoService.selectProProjectInfo();
         //根据项目id筛选数据
@@ -1223,5 +1213,43 @@ public class HomePageServiceImpl extends ServiceImpl<WindTowerDataParentTableMap
 
     }
 
+    //项目进展
+    public List<ProjectProgressInfo> getProjectProgressEvolve(String projectId) {
+        LambdaQueryWrapper<ProjectProgressInfo> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(ProjectProgressInfo::getProjectNo, projectId);
+        List<ProjectProgressInfo> projectProgressInfoList = projectProgressInfoService.list(queryWrapper);
+        List<ProjectProgressInfo> projectProgressInfoListResult = new ArrayList<>(projectProgressInfoList.size());
+
+        Map<String, List<ProjectProgressInfo>> pr = projectProgressInfoList.stream().collect(Collectors.groupingBy(ProjectProgressInfo::getTaskFlag));
+        if (pr.size() > 0) {
+            Set set = pr.keySet();
+            Object[] arr = set.toArray();
+            Arrays.sort(arr);
+            for (Object key : arr) {
+
+                Map<Integer, List<ProjectProgressInfo>> childs = pr.get(key).stream().collect(Collectors.groupingBy(ProjectProgressInfo::getTaskLevel));
+
+                if (childs.size() > 0) {
+
+                    Set setChilds = childs.keySet();
+                    Object[] arrChilds = setChilds.toArray();
+                    Arrays.sort(arrChilds);
+                    for (Object keyChild : arrChilds) {
+                        Map<String, List<ProjectProgressInfo>> childs1 = childs.get(keyChild).stream().collect(Collectors.groupingBy(ProjectProgressInfo::getTaskNo));
+                        Set set1 = childs1.keySet();
+                        Object[] arr1 = set1.toArray();
+                        Arrays.sort(arr1);
+                        for (Object key1 : arr1) {
+                            projectProgressInfoListResult.addAll(childs1.get(key1).stream().sorted(Comparator.comparing(ProjectProgressInfo::getShowIndex)).collect(Collectors.toList()));
+                        }
+
+                    }
+
+                }
+            }
+        }
+        return projectProgressInfoListResult;
+
+    }
 
 }

+ 5 - 17
neim-biz/src/main/java/com/jiayue/biz/service/impl/PdfServiceImpl.java

@@ -1,6 +1,5 @@
 package com.jiayue.biz.service.impl;
 
-import cn.hutool.core.date.DateTime;
 import cn.hutool.db.Entity;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.jiayue.biz.domain.*;
@@ -22,9 +21,6 @@ import java.sql.Timestamp;
 import java.text.SimpleDateFormat;
 import java.util.*;
 import java.util.stream.Collectors;
-import java.util.stream.Stream;
-
-import static com.jiayue.biz.eunms.TimeDimension.month;
 
 /**
  * 首页Service业务层处理
@@ -57,7 +53,7 @@ public class PdfServiceImpl extends ServiceImpl<WindTowerDataParentTableMapper,
             endDay = DateUtil.endOfDay(DateUtil.yesterday());
         }
         Map<String, Object> map = new HashMap<>();
-        SimpleDateFormat sdfTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+
         long realityCount = 0;//数据实际条数
         // 一年的计算数据
         startDay = DateUtil.beginOfMonth(startDay);
@@ -70,17 +66,15 @@ public class PdfServiceImpl extends ServiceImpl<WindTowerDataParentTableMapper,
         //所有测风塔信息
         List<WindTowerInfo> windTowerInfoList = windTowerInfoService.list();
         List<WindTowerInfo> windTowerInfos = windTowerInfoList.stream().filter(w -> w.getEquipmentNo().equals(equipmentId)).collect(Collectors.toList());
-//        List<WindTowerInfo> windTowerInfos = windTowerInfoService.getByEquipmentNo(equipmentId);
         //计算完整性
         List<Entity> entities = prophaseWeatherDataService.selectCount(equipmentId);
 
         for (Entity entity : entities) {
             //过滤非时间区间的数据累加;只要时间范围内的
-            if(((Timestamp)entity.get("_wstart")).compareTo(startDay) > -1 && ((Timestamp)entity.get("_wstart")).compareTo(endDay) <=0){
+            if (((Timestamp) entity.get("_wstart")).compareTo(startDay) > -1 && ((Timestamp) entity.get("_wstart")).compareTo(endDay) <= 0) {
                 // td engine 取出的时间需要截取字段
                 realityCount += (long) entity.get("count(*)");
             }
-
         }
 
         //测风塔信息概要
@@ -1398,23 +1392,17 @@ public class PdfServiceImpl extends ServiceImpl<WindTowerDataParentTableMapper,
             List<WindTowerCalculationData> turbulenceList = windTowerCalculationDataList.stream().filter(w -> w.getEbId().equals(turbulenceMonth.get(0).getId())).sorted(Comparator.comparing(WindTowerCalculationData::getTime)).collect(Collectors.toList());
             //height层高的月逐时湍流集合
             List<WindTowerCalculationData> turbulenceHourForMonthList = windTowerCalculationDataList.stream().filter(w -> w.getEbId().equals(turbulenceHourForMonth.get(0).getId())).sorted(Comparator.comparing(WindTowerCalculationData::getTime)).collect(Collectors.toList());
-
+            BigDecimal aveDayTurInsity = new BigDecimal(0);
             /*日变化*/
             if (!turbulenceHourForMonthList.isEmpty()) {
                 dayResults = CalculationUtil.getData24(turbulenceHourForMonthList);
+                aveDayTurInsity = dayResults.stream().reduce(BigDecimal.ZERO, BigDecimal::add).divide(BigDecimal.valueOf(24), 2, RoundingMode.HALF_UP);
 
             }
-            BigDecimal aveDayTurInsity = new BigDecimal(0);
-            aveDayTurInsity = dayResults.stream().reduce(BigDecimal.ZERO, BigDecimal::add).divide(BigDecimal.valueOf(24), 2, RoundingMode.HALF_UP);
+
             map.put("dayTurInsity", dayResults);
             map.put("aveDayTurInsity", aveDayTurInsity);
-            /*年变化*/
-//            for (WindTowerCalculationData w : turbulenceList) {
-//                yearResults.add(w.getValue());
-//                monthTimeList.add(sdf.format(w.getTime()));
-//            }
             for (int i = 1; i <= 12; i++) {
-//                Date monthStartTime = DateTimeUtil.getDayStartTime(DateTimeUtil.mouthOneDay(i).getTime());
                 //过滤时间区间集合
                 List<WindTowerCalculationData> filterList = new ArrayList<>();
                 BigDecimal value = new BigDecimal(0);

+ 10 - 7
neim-biz/src/main/java/com/jiayue/biz/service/impl/ProjectInfoServiceImpl.java

@@ -17,22 +17,25 @@ public class ProjectInfoServiceImpl implements ProjectInfoService {
     private final MongoTemplate mongoTemplate;
 
     //保存
-    public void saveProjectInfo(ProjectInfo projectInfo){
+    public void saveProjectInfo(ProjectInfo projectInfo) {
         mongoTemplate.save(projectInfo);
 
     }
 
     //查询所有项目信息
-    public List<ProjectInfo> getProjectInfoList(){
-        return mongoTemplate.find(new Query(),ProjectInfo.class,"project_info");
+    public List<ProjectInfo> getProjectInfoList() {
+        return mongoTemplate.find(new Query(), ProjectInfo.class, "project_info");
     }
+
     //根据id查询
-    public ProjectInfo getOneProjectInfoById(String id){
-        return mongoTemplate.findOne(new Query(Criteria.where("_id").is(id)),ProjectInfo.class);
+    public ProjectInfo getOneProjectInfoById(String id) {
+        return mongoTemplate.findOne(new Query(Criteria.where("_id").is(id)), ProjectInfo.class);
     }
+
+
     //删除
-    public void delProjectInfo(String id){
-        mongoTemplate.remove(new Query(Criteria.where("_id").is(id)),ProjectInfo.class);
+    public void delProjectInfo(String id) {
+        mongoTemplate.remove(new Query(Criteria.where("_id").is(id)), ProjectInfo.class);
     }
 
 }

+ 14 - 0
neim-biz/src/main/java/com/jiayue/biz/service/impl/ProjectProgressInfoServiceImpl.java

@@ -0,0 +1,14 @@
+package com.jiayue.biz.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.jiayue.biz.domain.ProjectProgressInfo;
+import com.jiayue.biz.mapper.ProjectProgressInfoMapper;
+import com.jiayue.biz.service.ProjectProgressInfoService;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+
+@AllArgsConstructor
+@Service
+public class ProjectProgressInfoServiceImpl extends ServiceImpl<ProjectProgressInfoMapper, ProjectProgressInfo> implements ProjectProgressInfoService {
+
+}

+ 14 - 10
neim-biz/src/main/java/com/jiayue/biz/service/impl/ProjectServiceImpl.java

@@ -1,11 +1,8 @@
 package com.jiayue.biz.service.impl;
 
-import cn.hutool.json.JSONObject;
-import cn.hutool.json.JSONUtil;
-import com.baomidou.mybatisplus.core.conditions.Wrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.jiayue.biz.domain.*;
 import com.jiayue.biz.dto.ProjectDto;
 import com.jiayue.biz.mapper.ProjectMapper;
@@ -13,12 +10,9 @@ import com.jiayue.biz.service.ProjectInfoService;
 import com.jiayue.biz.service.ProjectService;
 import com.jiayue.biz.service.WindTowerInfoService;
 import com.jiayue.biz.util.CalculationUtil;
-import com.jiayue.common.utils.DateUtil;
 import lombok.AllArgsConstructor;
-import org.bson.json.JsonObject;
 import org.springframework.data.mongodb.core.MongoTemplate;
 import org.springframework.stereotype.Service;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -100,7 +94,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                     for (Coordinates coordinates1 : coordinate) {
                         stringBuilder.append(coordinates1.getLongitude()).append(",").append(coordinates1.getLatitude()).append(";");
                     }
-                    if(stringBuilder.length() > 0){
+                    if (stringBuilder.length() > 0) {
                         stringBuilder.delete(stringBuilder.length() - 1, stringBuilder.length());
                         stringBuilder.append("。");
                     }
@@ -116,6 +110,11 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         return projectList;
     }
 
+    @Override
+    public ProjectInfo getProjectById(String projectId) {
+        return projectInfoService.getOneProjectInfoById(projectId);
+    }
+
 
     public void delProject(String id) {
         projectInfoService.delProjectInfo(id);
@@ -176,7 +175,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         if (projectDto.getEquipment() != null && !projectDto.getEquipment().equals("")) {
             List<Equipment> equipment = CalculationUtil.getEquipment(windTowerInfoList, projectDto.getEquipment());
             projectInfo.setEquipment(equipment);
-        }else {
+        } else {
             projectInfo.setEquipment(new ArrayList<>());
         }
 
@@ -187,7 +186,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                 cooList.add(coordinatesList);
             }
         } else {
-            if(!projectDto.getCoordinates().equals("")){
+            if (!projectDto.getCoordinates().equals("")) {
                 List<Coordinates> coordinatesList1 = this.getCoordinates(projectDto.getCoordinates());
                 cooList.add(coordinatesList1);
             }
@@ -196,6 +195,11 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         mongoTemplate.save(projectInfo);
     }
 
+    //修改
+    public void updateProjectInfo(ProjectInfo projectInfo) {
+
+        mongoTemplate.save(projectInfo);
+    }
 
     public List<Coordinates> getCoordinates(String coordinates) {
         ArrayList<Coordinates> coordinatesList = new ArrayList<>();

+ 1670 - 0
neim-biz/src/main/java/com/jiayue/biz/service/impl/WindDataCalculationServiceImpl.java

@@ -0,0 +1,1670 @@
+package com.jiayue.biz.service.impl;
+
+import cn.hutool.core.date.DatePattern;
+import com.jiayue.biz.domain.*;
+import com.jiayue.biz.dto.SpeedAndDensityDto;
+import com.jiayue.biz.eunms.WindDirectionEnum;
+import com.jiayue.biz.service.EquipmentAttributeService;
+import com.jiayue.biz.service.WindDataCalculationService;
+import com.jiayue.biz.service.WindTowerInfoService;
+import com.jiayue.biz.util.CalculationUtil;
+import com.jiayue.biz.util.DateTimeUtil;
+import com.jiayue.common.utils.DateUtil;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * 风资源相关计算服务
+ */
+@Slf4j
+@Service
+@AllArgsConstructor
+public class WindDataCalculationServiceImpl implements WindDataCalculationService {
+    //风功率密度和平均风速的统一标识
+    private final String attributeFunction = "WindPowerDensity";
+    private final String tDay = "tDay";
+    private final String shearFunction = "shear";
+    private final String turbulenceFunction = "turbulence";
+    private final String wsFunction = "ws";
+    private final String wsDayFunction = "wsDay";
+    private final String wsMonthFunction = "wsMonth";
+    private final String wpdFunction = "WindPowerDensity";
+    private final String wsMaxMonthFunction = "maxWsMonth";
+    private final String turbulenceDay = "turbulenceDay";
+    private final String staDay = "staDay";
+
+    private final String windShearFiledName = "windShear";
+    private final String windShearDayFiledName = "windShearDay";
+
+    private final BigDecimal zero = new BigDecimal(0);
+    private final long oneDay = 86400000L;
+    private final long oneHour = 3600000L;
+    private final SimpleDateFormat yyyyMMdd = new SimpleDateFormat("yyyyMMdd");
+    private final SimpleDateFormat yyyyMMddHH = new SimpleDateFormat("yyyyMMddHH");
+
+    private final WindTowerInfoService windTowerInfoService;
+
+    private final EquipmentAttributeService equipmentAttributeService;
+    private final WindDirectionStatisticsDataServiceImpl windDirectionStatisticsDataServiceImpl;
+    private final WindTowerCalculationDataServiceImpl windTowerCalculationDataServiceImpl;
+
+    /**
+     * 统一计算
+     *
+     * @param dataList
+     * @param startDate
+     * @param endDate
+     * @param equipmentNo
+     * @param prophaseAnemometryDataList
+     * @param prophaseWeatherDataList
+     * @param equipmentAttributeMap
+     * @param windTowerCalculationDataList
+     */
+    @Override
+    public ArrayList<WindTowerCalculationData> calcu(ArrayList<WindTowerCalculationData> dataList, Date startDate, Date endDate, String equipmentNo
+            , List<ProphaseAnemometryData> prophaseAnemometryDataList, List<ProphaseWeatherData> prophaseWeatherDataList, Map<String, EquipmentAttribute> equipmentAttributeMap
+            , List<WindTowerCalculationData> windTowerCalculationDataList, WindTowerInfo windTowerInfo) {
+
+
+        //小时平均风速风功率密度
+        ArrayList<WindTowerCalculationData> wsAndWpdList = this.calculateWindPowerDensity(startDate.getTime(), endDate.getTime(), equipmentNo, prophaseAnemometryDataList
+                , prophaseWeatherDataList, equipmentAttributeMap, windTowerCalculationDataList, windTowerInfo);
+        dataList.addAll(wsAndWpdList);
+        //每小时风切变指数
+        ArrayList<WindTowerCalculationData> windShearList = this.calculateWindPowerShear(startDate, endDate, equipmentNo, prophaseAnemometryDataList, windTowerCalculationDataList, equipmentAttributeMap, windTowerInfo);
+        dataList.addAll(windShearList);
+
+        //计算日均
+        calcuForDay(dataList, startDate, endDate, equipmentNo, prophaseAnemometryDataList, prophaseWeatherDataList, equipmentAttributeMap, windTowerCalculationDataList, windTowerInfo);
+
+        //如果结束时间和数据统计的时间相差大于30天就分割月份进行计算
+        if (endDate.getTime() - startDate.getTime() > oneDay * 30) {
+            List<Long> dateTime = DateTimeUtil.getIntervalTimeByMonth(DateTimeUtil.beginOfMonth(startDate), DateTimeUtil.beginOfMonth(endDate));
+            for (Long l : dateTime) {
+                log.info("计算设备:{} 在时间:{} 的统计数据", equipmentNo, cn.hutool.core.date.DateUtil.format(cn.hutool.core.date.DateUtil.date(l), DatePattern.NORM_DATE_FORMAT));
+                //传入时间的月初
+                Date startMonthDate = DateTimeUtil.beginOfMonth(new Date(l));
+                //传入时间的月末
+                Date endMonthDate = DateTimeUtil.endOfMonth(new Date(l));
+                //月玫瑰图
+                this.roseMonth(startMonthDate, endMonthDate, equipmentNo, prophaseAnemometryDataList, prophaseWeatherDataList, equipmentAttributeMap, windTowerInfo);
+                this.calcuForMonth(dataList, startMonthDate, endMonthDate, equipmentNo, prophaseAnemometryDataList, prophaseWeatherDataList
+                        , equipmentAttributeMap, windTowerCalculationDataList, windTowerInfo);
+            }
+        } else {
+            //传入时间的月初
+            Date startMonthDate = DateTimeUtil.beginOfMonth(startDate);
+            //前一天23点59分
+            Date endDate1 = DateTimeUtil.getDayLastTime(DateUtil.yesterday().getTime());
+            //传入时间的月末
+            Date endMonthDate = DateTimeUtil.endOfMonth(endDate1);
+
+            log.info("计算设备:{} 在时间:{} 的统计数据", equipmentNo, cn.hutool.core.date.DateUtil.format(startMonthDate, DatePattern.NORM_DATE_FORMAT));
+            this.calcuForMonth(dataList, startMonthDate, endMonthDate, equipmentNo, prophaseAnemometryDataList, prophaseWeatherDataList, equipmentAttributeMap, windTowerCalculationDataList, windTowerInfo);
+
+            // 月玫瑰图
+            this.roseMonth(startMonthDate, endMonthDate, equipmentNo, prophaseAnemometryDataList, prophaseWeatherDataList, equipmentAttributeMap, windTowerInfo);
+
+        }
+        return dataList;
+    }
+
+    /**
+     * 重算调用方法
+     *
+     * @param dataList
+     * @param startDate
+     * @param endDate
+     * @param equipmentNo
+     * @param prophaseAnemometryDataList
+     * @param prophaseWeatherDataList
+     * @param equipmentAttributeMap
+     * @param windTowerCalculationDataList
+     * @param windTowerInfo
+     * @return
+     */
+    @Override
+    public ArrayList<WindTowerCalculationData> calcuRe(ArrayList<WindTowerCalculationData> dataList, Date startDate, Date endDate, String equipmentNo
+            , List<ProphaseAnemometryData> prophaseAnemometryDataList, List<ProphaseWeatherData> prophaseWeatherDataList
+            , Map<String, EquipmentAttribute> equipmentAttributeMap, List<WindTowerCalculationData> windTowerCalculationDataList, WindTowerInfo windTowerInfo) {
+        return null;
+    }
+
+    @Override
+    public ArrayList<WindTowerCalculationData> calcuForDay(ArrayList<WindTowerCalculationData> dataList, Date startDate, Date endDate, String equipmentNo
+            , List<ProphaseAnemometryData> prophaseAnemometryDataList, List<ProphaseWeatherData> prophaseWeatherDataList
+            , Map<String, EquipmentAttribute> equipmentAttributeMap, List<WindTowerCalculationData> windTowerCalculationDataList, WindTowerInfo windTowerInfo) {
+        //日平均温度
+        ArrayList<WindTowerCalculationData> tList = this.tDay(startDate, endDate, equipmentNo, prophaseWeatherDataList, equipmentAttributeMap);
+        dataList.addAll(tList);
+        //日平均气压
+        ArrayList<WindTowerCalculationData> paList = this.paDay(startDate, endDate, equipmentNo, prophaseWeatherDataList, equipmentAttributeMap);
+        dataList.addAll(paList);
+        //发电量与满发小时数
+        ArrayList<WindTowerCalculationData> calculateBattery = this.calculateBattery(startDate.getTime(), endDate.getTime(), windTowerInfo, prophaseAnemometryDataList, equipmentAttributeMap, windTowerCalculationDataList);
+        dataList.addAll(calculateBattery);
+        //日平均空气密度
+        ArrayList<WindTowerCalculationData> airList = this.airDensityDay(startDate, endDate, equipmentNo, prophaseWeatherDataList, equipmentAttributeMap, windTowerCalculationDataList);
+        dataList.addAll(airList);
+        //日平均风速标差
+        ArrayList<WindTowerCalculationData> staDay = this.calculateStaDay(startDate, endDate, equipmentNo, prophaseAnemometryDataList, equipmentAttributeMap, windTowerInfo, windTowerCalculationDataList);
+        dataList.addAll(staDay);
+        //日平均风速
+        ArrayList<WindTowerCalculationData> wsDayList = this.wsDay(startDate, endDate, equipmentNo, windTowerCalculationDataList, equipmentAttributeMap, windTowerInfo);
+        dataList.addAll(wsDayList);
+        //日平均湍流
+        ArrayList<WindTowerCalculationData> turList = this.turbulenceDay(startDate, endDate, equipmentNo, equipmentAttributeMap, windTowerInfo, windTowerCalculationDataList);
+        dataList.addAll(turList);
+        //日平均风切变
+        ArrayList<WindTowerCalculationData> windShearDay = this.shearDay(startDate, endDate, equipmentNo, windTowerCalculationDataList, equipmentAttributeMap, windTowerInfo, prophaseAnemometryDataList);
+        dataList.addAll(windShearDay);
+        //日平均风功率密度
+        ArrayList<WindTowerCalculationData> wpdDayList = this.wpdDay(startDate, endDate, equipmentNo, windTowerCalculationDataList, equipmentAttributeMap, windTowerInfo);
+        dataList.addAll(wpdDayList);
+
+        return dataList;
+    }
+
+    @Override
+    public ArrayList<WindTowerCalculationData> calcuForMonth(ArrayList<WindTowerCalculationData> dataList, Date startDate, Date endDate, String equipmentNo
+            , List<ProphaseAnemometryData> prophaseAnemometryDataList, List<ProphaseWeatherData> prophaseWeatherDataList, Map<String, EquipmentAttribute> equipmentAttributeMap
+            , List<WindTowerCalculationData> windTowerCalculationDataList, WindTowerInfo windTowerInfo) {
+        //月平均风速
+        ArrayList<WindTowerCalculationData> wsMonth = this.wsMonth(startDate, endDate, equipmentNo, windTowerCalculationDataList, equipmentAttributeMap, windTowerInfo);
+        dataList.addAll(wsMonth);
+        //月平均风功率密度
+        ArrayList<WindTowerCalculationData> wpdMonth = this.wpdMonth(startDate, endDate, equipmentNo, windTowerCalculationDataList, equipmentAttributeMap, windTowerInfo);
+        dataList.addAll(wpdMonth);
+        //月平均湍流
+        ArrayList<WindTowerCalculationData> turbulenceMonth = this.turbulenceMonth(startDate, endDate, equipmentNo, windTowerCalculationDataList, equipmentAttributeMap, windTowerInfo);
+        dataList.addAll(turbulenceMonth);
+        //月平均空气密度
+        ArrayList<WindTowerCalculationData> airDensityMonth = this.airDensityMonth(startDate, endDate, equipmentNo, windTowerCalculationDataList, equipmentAttributeMap);
+        dataList.addAll(airDensityMonth);
+        //月最大风速
+        ArrayList<WindTowerCalculationData> wsMaxMonth = this.wsMaxMonth(startDate, endDate, equipmentNo, prophaseAnemometryDataList, equipmentAttributeMap, windTowerInfo);
+        dataList.addAll(wsMaxMonth);
+        //月平均风切变
+        ArrayList<WindTowerCalculationData> shearMonth = this.shearMonth(startDate, endDate, equipmentNo, windTowerCalculationDataList, equipmentAttributeMap, windTowerInfo, prophaseAnemometryDataList);
+        dataList.addAll(shearMonth);
+        //月平均风速标差
+        ArrayList<WindTowerCalculationData> staMonth = this.staMonth(startDate, endDate, equipmentNo, prophaseAnemometryDataList, equipmentAttributeMap, windTowerInfo);
+        dataList.addAll(staMonth);
+
+        //月平均环境数据
+        ArrayList<WindTowerCalculationData> environmentData = this.environmentData(startDate, endDate, equipmentNo, prophaseWeatherDataList, equipmentAttributeMap);
+        dataList.addAll(environmentData);
+        //空气密度月逐时
+        ArrayList<WindTowerCalculationData> airDensityMonth1 = this.airDensityMonth(equipmentNo, startDate, endDate, prophaseWeatherDataList, equipmentAttributeMap);
+        dataList.addAll(airDensityMonth1);
+        //湍流月逐时
+        ArrayList<WindTowerCalculationData> turbulenceHourForMonth = this.turbulenceHourForMonth(equipmentNo, startDate, endDate, prophaseAnemometryDataList, equipmentAttributeMap, windTowerInfo);
+        dataList.addAll(turbulenceHourForMonth);
+        return dataList;
+    }
+
+    /**
+     * 风功率密度和平均风速计算方法
+     */
+    public ArrayList<WindTowerCalculationData> calculateWindPowerDensity(Long startTime, Long endTime, String eqNo, List<ProphaseAnemometryData> prophaseAnemometryDataList
+            , List<ProphaseWeatherData> prophaseWeatherDataList, Map<String, EquipmentAttribute> equipmentAttributeMap, List<WindTowerCalculationData> windTowerCalculationDataList, WindTowerInfo windTowerInfo) {
+        //获取对应测风塔数据
+        List<ProphaseAnemometryData> anemometryDataList = prophaseAnemometryDataList.stream().filter(p -> p.getTs().getTime() >= startTime
+                && p.getTs().getTime() <= endTime && null != p.getWsAve() && p.getWsAve() > 0).collect(Collectors.toList());
+        List<ProphaseWeatherData> weatherDataList = prophaseWeatherDataList.stream().filter(p -> p.getTs().getTime() >= startTime
+                && p.getTs().getTime() <= endTime && null != p.getAirDensity() && p.getAirDensity() > 0).collect(Collectors.toList());
+
+
+        String[] height = windTowerInfo.getHeights().split(",");
+        //定义数据空集合用来装载 结果数据
+        ArrayList<WindTowerCalculationData> list = new ArrayList<>();
+        try {
+            //遍历出过滤出的平均风速属性
+            for (String h : height) {
+                EquipmentAttribute equipmentAttributeAws = equipmentAttributeMap.get(h + "aws");
+                EquipmentAttribute equipmentAttributeWpd = equipmentAttributeMap.get(h + "wpd");
+                if (null == equipmentAttributeAws || null == equipmentAttributeWpd) {
+                    log.error("属性 {} 和 {} 信息查询失败,属性集合数量:{}", h + "aws", h + "wpd", equipmentAttributeMap.size());
+                    continue;
+                }
+                //遍历24小时,用来计算逐小时数据
+                for (long time = startTime; time <= endTime; time += oneHour) {
+                    //过滤出对应测风塔数据
+                    long finalTime = time;
+                    //风数据过滤
+                    List<ProphaseAnemometryData> anemometryData = anemometryDataList.stream().filter(w -> w.getTs().getTime() >= finalTime
+                            && w.getTs().getTime() <= finalTime + oneHour - 1000 && w.getLayerHeight().equals(h)).collect(Collectors.toList());
+                    if (anemometryData.isEmpty()) {
+                        log.error("计算{}设备平均风速和风功率密度 无风速数据##,计算时间范围:{}", eqNo, DateTimeUtil.getFormatDateStr(time));
+                        continue;
+                    }
+                    //根据层高获取所有风速数据
+                    List<BigDecimal> bigDecimals = anemometryData.stream().map((ProphaseAnemometryData p) -> {
+                        return BigDecimal.valueOf(p.getWsAve());
+                    }).collect(Collectors.toList());
+
+                    //风速数据时所有计算的根本,无数据不计算
+                    if (bigDecimals.isEmpty()) {
+                        log.error("计算{}设备平均风速和风功率密度 无有效数据##,计算时间范围:{}", eqNo, DateTimeUtil.getFormatDateStr(time));
+                        continue;
+                    }
+                    //环境数据过滤
+                    List<ProphaseWeatherData> weatherData = weatherDataList.stream().filter(w -> w.getTs().getTime() >= finalTime
+                            && w.getTs().getTime() <= finalTime + oneHour - 1000).collect(Collectors.toList());
+                    SpeedAndDensityDto speedAndDensityDto = getSpeedAndDensityDto(bigDecimals, anemometryData, weatherData);
+                    Date dataTime = new Date(time);
+                    if (speedAndDensityDto.getWindPowerDensity().compareTo(BigDecimal.ZERO) < 0 ||
+                            speedAndDensityDto.getWindSpeed().compareTo(BigDecimal.ZERO) < 0) {
+                        log.error("计算风功率密度/平均风速出现异常值 平均风速:{} 风功率密度:{};时间:{} ;设备编号:{}", speedAndDensityDto.getWindSpeed(), speedAndDensityDto.getWindPowerDensity(), dataTime, eqNo);
+                        continue;
+                    }
+                    //保存平均风速
+                    WindTowerCalculationData windTowerCalculationData = new WindTowerCalculationData();
+                    windTowerCalculationData.setTime(dataTime);
+                    windTowerCalculationData.setEbId(equipmentAttributeAws.getId());
+                    windTowerCalculationData.setEquipmentId(eqNo);
+                    windTowerCalculationData.setValue(speedAndDensityDto.getWindSpeed());
+                    windTowerCalculationDataList.add(windTowerCalculationData);
+                    list.add(windTowerCalculationData);
+                    //保存风功率密度
+                    WindTowerCalculationData windTowerCalculationDataWpd = new WindTowerCalculationData();
+                    windTowerCalculationDataWpd.setTime(dataTime);
+                    windTowerCalculationDataWpd.setEbId(equipmentAttributeWpd.getId());
+                    windTowerCalculationDataWpd.setEquipmentId(eqNo);
+                    windTowerCalculationDataWpd.setValue(speedAndDensityDto.getWindPowerDensity());
+                    windTowerCalculationDataList.add(windTowerCalculationDataWpd);
+                    list.add(windTowerCalculationDataWpd);
+
+                }
+            }
+        } catch (Exception e) {
+            log.error("计算{}设备平均风速和风功率密度失败!!!{}", eqNo, e);
+        }
+        log.info("计算{}设备平均风速和风功率密度完成^ ^", eqNo);
+
+        return list;
+    }
+
+
+    /**
+     * 计算月平均风速标差
+     *
+     * @param startTime   开始时间
+     * @param endTime     结束时间
+     * @param equipmentId 设备id
+     * @return
+     */
+    public ArrayList<WindTowerCalculationData> staMonth(Date startTime, Date endTime, String
+            equipmentId, List<ProphaseAnemometryData> prophaseAnemometryDataList
+            , Map<String, EquipmentAttribute> equipmentAttributeMap, WindTowerInfo windTowerInfo) {
+        //时间-1防止0点数据查不到
+        Date startHour = new Date(startTime.getTime() - 1);
+        List<ProphaseAnemometryData> collect = prophaseAnemometryDataList.stream().filter(p -> p.getTs().getTime() >= startTime.getTime()
+                && p.getTs().getTime() <= endTime.getTime() && null != p.getWsSta() && p.getWsSta() >= 0).collect(Collectors.toList());
+
+        ArrayList<WindTowerCalculationData> windTowerCalculationDataList = new ArrayList<>();
+        if (!collect.isEmpty()) {
+            String[] heights = windTowerInfo.getHeights().split(",");
+            //计算标差
+            for (String height : heights) {
+                EquipmentAttribute equipmentAttribute = equipmentAttributeMap.get(height + "staMonth");
+                BigDecimal sumSta = CalculationUtil.getBigDecimal(collect.stream().filter(c -> c.getLayerHeight().equals(height)).mapToDouble(ProphaseAnemometryData::getWsSta).sum());
+                WindTowerCalculationData windTowerCalculationData = new WindTowerCalculationData();
+                windTowerCalculationData.setEbId(equipmentAttribute.getId());
+                windTowerCalculationData.setTime(startHour);
+                windTowerCalculationData.setValue(sumSta.divide(new BigDecimal(collect.size()), 2, RoundingMode.HALF_UP));
+                windTowerCalculationData.setEquipmentId(equipmentId);
+                windTowerCalculationDataList.add(windTowerCalculationData);
+            }
+        }
+        return windTowerCalculationDataList;
+    }
+
+
+    /**
+     * 温湿度气压月 最大,均值
+     *
+     * @param startTime             开始时间
+     * @param endTime               结束时间
+     * @param equipmentId           设备id
+     * @param equipmentAttributeMap 属性集合
+     * @return
+     */
+    public ArrayList<WindTowerCalculationData> environmentData(Date startTime, Date endTime, String equipmentId
+            , List<ProphaseWeatherData> prophaseWeatherDataList, Map<String, EquipmentAttribute> equipmentAttributeMap) {
+        ArrayList<WindTowerCalculationData> windTowerCalculationDataList = new ArrayList<>();
+        try {
+            //时间-1防止0点数据查不到
+            Date startHour = new Date(startTime.getTime() - 1);
+            List<ProphaseWeatherData> prophaseWeatherData = prophaseWeatherDataList.stream().filter(p -> p.getTs().getTime() >= startHour.getTime()
+                    && p.getTs().getTime() <= endTime.getTime()).collect(Collectors.toList());
+
+
+            if (prophaseWeatherData.isEmpty()) {
+                log.error("计算温湿度气压数据时,原数据{prophaseWeatherData}为空");
+                return windTowerCalculationDataList;
+            }
+            List<BigDecimal> paList = new ArrayList<>();
+            List<BigDecimal> rhList = new ArrayList<>();
+            List<BigDecimal> tList = new ArrayList<>();
+            /*计算平均值数值为null 不计算*/
+            for (ProphaseWeatherData map : prophaseWeatherData) {
+                if (null != map.getPaAve() && map.getPaAve() > 0) {
+                    paList.add(CalculationUtil.getBigDecimal(map.getPaAve()));
+                }
+                if (null != map.getRhAve() && map.getRhAve() > 0) {
+                    rhList.add(CalculationUtil.getBigDecimal(map.getRhAve()));
+                }
+                if (null != map.getTAve() && map.getTAve() != -99) {
+                    tList.add(CalculationUtil.getBigDecimal(map.getTAve()));
+                }
+            }
+
+            BigDecimal sumPa = new BigDecimal(0);
+            BigDecimal avePa = new BigDecimal(0);
+
+            /*气压*/
+            BigDecimal maxPa = new BigDecimal(0);
+            BigDecimal minPa = new BigDecimal(0);
+            if (!paList.isEmpty()) {
+                maxPa = paList.stream().max(BigDecimal::compareTo).get();
+                minPa = paList.stream().min(BigDecimal::compareTo).get();
+                for (BigDecimal pa : paList) {
+                    sumPa = sumPa.add(pa);
+                }
+                avePa = sumPa.divide(new BigDecimal(paList.size()), 2, RoundingMode.HALF_UP);
+            }
+
+            windTowerCalculationDataList.add(new WindTowerCalculationData(startTime, equipmentId, equipmentAttributeMap.get("paMAX").getId(), maxPa));
+            windTowerCalculationDataList.add(new WindTowerCalculationData(startTime, equipmentId, equipmentAttributeMap.get("paMIN").getId(), minPa));
+            windTowerCalculationDataList.add(new WindTowerCalculationData(startTime, equipmentId, equipmentAttributeMap.get("paAVE").getId(), avePa));
+
+            BigDecimal sumT = new BigDecimal(0);
+            BigDecimal aveT = new BigDecimal(0);
+            /*温度*/
+            BigDecimal maxT = new BigDecimal(0);
+            BigDecimal minT = new BigDecimal(0);
+            if (!tList.isEmpty()) {
+                maxT = tList.stream().max(BigDecimal::compareTo).get();
+                minT = tList.stream().min(BigDecimal::compareTo).get();
+                for (BigDecimal t : tList) {
+                    sumT = sumT.add(t);
+                }
+                aveT = sumT.divide(new BigDecimal(tList.size()), 2, RoundingMode.HALF_UP);
+            }
+            windTowerCalculationDataList.add(new WindTowerCalculationData(startTime, equipmentId, equipmentAttributeMap.get("tMAX").getId(), maxT));
+            windTowerCalculationDataList.add(new WindTowerCalculationData(startTime, equipmentId, equipmentAttributeMap.get("tMIN").getId(), minT));
+            windTowerCalculationDataList.add(new WindTowerCalculationData(startTime, equipmentId, equipmentAttributeMap.get("tAVE").getId(), aveT));
+
+
+            BigDecimal sumRh = new BigDecimal(0);
+            BigDecimal aveRh = new BigDecimal(0);
+            /*湿度*/
+            BigDecimal maxRh = new BigDecimal(0);
+            BigDecimal minRh = new BigDecimal(0);
+            if (!rhList.isEmpty()) {
+                maxRh = rhList.stream().max(BigDecimal::compareTo).get();
+                minRh = rhList.stream().min(BigDecimal::compareTo).get();
+                for (BigDecimal rh : rhList) {
+                    sumRh = sumRh.add(rh);
+                }
+                aveRh = sumRh.divide(new BigDecimal(rhList.size()), 2, RoundingMode.HALF_UP);
+            }
+
+
+            windTowerCalculationDataList.add(new WindTowerCalculationData(startTime, equipmentId, equipmentAttributeMap.get("rhMAX").getId(), maxRh));
+            windTowerCalculationDataList.add(new WindTowerCalculationData(startTime, equipmentId, equipmentAttributeMap.get("rhMIN").getId(), minRh));
+            windTowerCalculationDataList.add(new WindTowerCalculationData(startTime, equipmentId, equipmentAttributeMap.get("rhAVE").getId(), aveRh));
+
+
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return windTowerCalculationDataList;
+    }
+
+    /**
+     * 湍流月逐时
+     *
+     * @param equipmentId           设备Id
+     * @param startTime             开始时间
+     * @param endTime               结束时间
+     * @param equipmentAttributeMap 属性集合
+     * @param windTowerInfo         测风塔信息
+     * @return
+     */
+    public ArrayList<WindTowerCalculationData> turbulenceHourForMonth(String equipmentId, Date startTime, Date
+            endTime, List<ProphaseAnemometryData> prophaseAnemometryDataList
+            , Map<String, EquipmentAttribute> equipmentAttributeMap, WindTowerInfo windTowerInfo) {
+        String[] heights = windTowerInfo.getHeights().split(",");
+
+        ArrayList<WindTowerCalculationData> list = new ArrayList<>();
+        try {
+            //遍历层高
+            for (String h : heights) {
+                //获取湍流年逐时ebId
+                String ebId = equipmentAttributeMap.get(h + "turDayForMonth").getId();
+                HashMap<Integer, BigDecimal> timeAndTurMap = new HashMap<>();
+                HashMap<Integer, BigDecimal> totalAndTurMap = new HashMap<>();
+
+                //循环开始时间到时间一小时为间隔
+                for (long time = startTime.getTime(); time <= endTime.getTime(); time = time + oneHour) {
+
+                    long startHour = time;
+                    long endHour = time + oneHour;
+                    //筛选小时数据
+                    List<ProphaseAnemometryData> anemometryDataList = prophaseAnemometryDataList.stream()
+                            .filter(p -> p.getTs().getTime() >= startHour && p.getTs().getTime() <= endHour && p.getLayerHeight().equals(h)).collect(Collectors.toList());
+
+
+                    if (null == anemometryDataList || anemometryDataList.isEmpty()) {
+                        log.warn("时间区间:{}-{} 计算设备:{} 层高:{} 原数据为空", DateTimeUtil.getFormatDateStr(time), DateTimeUtil.getFormatDateStr(endHour), equipmentId, h);
+                        continue;
+                    }
+                    BigDecimal turAve = BigDecimal.ZERO;
+                    //循环实时数据计算总风速和标差
+                    BigDecimal wsSun = CalculationUtil.getBigDecimal(anemometryDataList.stream().filter(a -> null != a.getWsAve()
+                            && a.getWsAve() >= 0).mapToDouble(ProphaseAnemometryData::getWsAve).sum());
+                    BigDecimal staSun = CalculationUtil.getBigDecimal(anemometryDataList.stream().filter(a -> null != a.getWsSta()
+                            && a.getWsSta() >= 0).mapToDouble(ProphaseAnemometryData::getWsSta).sum());
+                    //除以一小时的个数 求小时的平均值
+                    BigDecimal wsAve = wsSun.divide(BigDecimal.valueOf(anemometryDataList.size()), 2, RoundingMode.HALF_UP);
+                    BigDecimal staAve = staSun.divide(BigDecimal.valueOf(anemometryDataList.size()), 2, RoundingMode.HALF_UP);
+                    //如果除数等于0就跳过本次循环
+                    if (wsAve.compareTo(BigDecimal.ZERO) == 0 || staAve.compareTo(BigDecimal.ZERO) == 0) {
+                        log.warn("计算设备:{} 层高:{} 时间区间:{}-{}  wsAve:{} staAve:{} ", equipmentId, h, DateTimeUtil.getFormatDateStr(time)
+                                , DateTimeUtil.getFormatDateStr(endHour), wsAve.doubleValue(), staAve.doubleValue());
+                        continue;
+                    }
+                    turAve = staAve.divide(wsAve, 2, RoundingMode.HALF_UP);
+                    //判断map中是否存在此小时的key 如果存在就把数值相加 个数加一
+                    int curentHours = new Date(startHour).getHours();
+                    if (timeAndTurMap.get(curentHours) != null) {
+
+                        BigDecimal Average = timeAndTurMap.get(curentHours).add(turAve);
+                        BigDecimal total = totalAndTurMap.get(curentHours).add(BigDecimal.ONE);
+
+                        timeAndTurMap.put(curentHours, Average);
+                        totalAndTurMap.put(curentHours, total);
+                    } else {
+                        //如果map中不存在这个key则直接把平均值加入 个数加一
+                        timeAndTurMap.put(curentHours, turAve);
+                        totalAndTurMap.put(curentHours, BigDecimal.ONE);
+                    }
+                }
+
+                if (timeAndTurMap.entrySet().isEmpty()) {
+                    log.error("计算设备:{} 层高:{} 时间区间:{}-{}  中间结果 {timeAndTurMap}为空,无法计算 湍流月逐时", equipmentId, h);
+                    continue;
+                }
+
+                //设置数据时间为开始时间
+                String start = yyyyMMdd.format(new Date(startTime.getTime()));
+                for (Map.Entry<Integer, BigDecimal> a : timeAndTurMap.entrySet()) {
+                    Date timeMonth = yyyyMMddHH.parse(start + String.valueOf(a.getKey()));
+                    BigDecimal airAve = a.getValue().divide(totalAndTurMap.get(a.getKey()), 2, RoundingMode.HALF_UP);
+                    if (airAve.compareTo(zero) < 0) {
+                        log.error("计算得到的湍流月逐时异常,为负数:{}", airAve);
+                        continue;
+                    }
+                    list.add(new WindTowerCalculationData(timeMonth, equipmentId, ebId, airAve));
+                }
+
+            }
+        } catch (ParseException e) {
+            log.error("设备编号{},湍流年逐时计算错误", equipmentId);
+            e.printStackTrace();
+        }
+
+        log.info("设备编号{},湍流年逐时,计算完成", equipmentId);
+        return list;
+    }
+
+
+    /**
+     * 空气密度月逐时入库
+     *
+     * @param equipmentId 设备id
+     * @param startTime   开始时间
+     * @param endTime     结束时间
+     * @return
+     */
+    public ArrayList<WindTowerCalculationData> airDensityMonth(String equipmentId, Date startTime, Date
+            endTime, List<ProphaseWeatherData> prophaseWeatherDataList
+            , Map<String, EquipmentAttribute> equipmentAttributeMap) {
+        //获取ebId
+        String ebId = equipmentAttributeMap.get("airDensityDayForYear").getId();
+        ArrayList<WindTowerCalculationData> list = new ArrayList<>();
+
+        try {
+            HashMap<Integer, BigDecimal> timeAndAirMap = new HashMap<>();
+            HashMap<Integer, BigDecimal> totalAndAirMap = new HashMap<>();
+
+            for (long time = startTime.getTime(); time <= endTime.getTime(); time = time + oneHour) {
+                BigDecimal airSun = BigDecimal.ZERO;
+                long startHour = time;
+                long endHour = time + oneHour;
+                List<ProphaseWeatherData> weatherDataList = prophaseWeatherDataList.stream().filter(p -> p.getTs().getTime() >= startHour
+                        && p.getTs().getTime() <= endHour && null != p.getAirDensity() && p.getAirDensity() > 0).collect(Collectors.toList());
+                for (ProphaseWeatherData map : weatherDataList) {
+                    //过滤异常数据
+                    airSun = airSun.add(CalculationUtil.getBigDecimal(map.getAirDensity()));
+
+                }
+                if (weatherDataList.size() > 0) {
+                    BigDecimal airAve = airSun.divide(BigDecimal.valueOf(weatherDataList.size()), 2, RoundingMode.HALF_UP);
+                    //判断map的key是否包含此小时  不包含直接加入value中 包含则相加
+                    int curentHours = new Date(startHour).getHours();
+                    if (timeAndAirMap.get(curentHours) != null) {
+
+                        BigDecimal Average = timeAndAirMap.get(curentHours).add(airAve);
+                        BigDecimal total = totalAndAirMap.get(curentHours).add(BigDecimal.ONE);
+
+                        timeAndAirMap.put(curentHours, Average);
+                        totalAndAirMap.put(curentHours, total);
+                    } else {
+                        //如果map中不存在这个key则直接把平均值加入个数加一
+                        timeAndAirMap.put(curentHours, airAve);
+                        totalAndAirMap.put(curentHours, BigDecimal.ONE);
+                    }
+                }
+            }
+            if (timeAndAirMap.entrySet().isEmpty()) {
+                log.error("计算设备:{}  中间结果 {timeAndAirMap}为空,无法计算 空气密度月逐时", equipmentId);
+                return list;
+            }
+            //设置数据时间为开始时间
+            String start = yyyyMMdd.format(new Date(startTime.getTime()));
+            for (Map.Entry<Integer, BigDecimal> a : timeAndAirMap.entrySet()) {
+                //拼接时间
+                Date time = yyyyMMddHH.parse(start + String.valueOf(a.getKey()));
+                BigDecimal airAve = a.getValue().divide(totalAndAirMap.get(a.getKey()), 2, RoundingMode.HALF_UP);
+                WindTowerCalculationData windTowerCalculationData = new WindTowerCalculationData();
+                windTowerCalculationData.setEbId(ebId);
+                windTowerCalculationData.setTime(time);
+                windTowerCalculationData.setEquipmentId(equipmentId);
+                windTowerCalculationData.setValue(airAve);
+                if (windTowerCalculationData.getValue().doubleValue() < 0) {
+                    windTowerCalculationData.setValue(zero);
+                }
+                list.add(windTowerCalculationData);
+            }
+
+        } catch (Exception e) {
+            log.error("设备编号{},空气密度月逐时计算错误:{}", equipmentId, e);
+        }
+
+        log.info("设备编号{},空气密度月逐时,计算完成", equipmentId);
+        return list;
+
+    }
+
+
+    /**
+     * 日平均温度入库
+     *
+     * @param startTime             开始时间
+     * @param endTime               结束时间
+     * @param equipmentId           设备Id
+     * @param equipmentAttributeMap 属性集合
+     */
+    public ArrayList<WindTowerCalculationData> tDay(Date startTime, Date endTime, String
+            equipmentId, List<ProphaseWeatherData> prophaseWeatherDataList
+            , Map<String, EquipmentAttribute> equipmentAttributeMap) {
+        String ebId = equipmentAttributeMap.get(tDay).getId();
+
+        ArrayList<WindTowerCalculationData> tList = new ArrayList<>();
+        try {
+            for (long time = startTime.getTime(); time < endTime.getTime(); time += oneDay) {
+                long dayTime = time;
+                //过滤一天数据
+                List<ProphaseWeatherData> collect = prophaseWeatherDataList.stream().filter(p -> p.getTs().getTime() >= dayTime && p.getTs().getTime() < dayTime + oneDay && p.getTAve() != null && p.getTAve() != -99).collect(Collectors.toList());
+                if (collect.isEmpty()) {
+                    log.error("计算设备:{} 时间:{} 源数据为空,无法计算 日平均温度", equipmentId, DateTimeUtil.getFormatDateStr(dayTime));
+                    continue;
+                }
+                //计算时间段内所有温度
+                BigDecimal tSum = CalculationUtil.getBigDecimal(collect.stream().mapToDouble(ProphaseWeatherData::getTAve).sum());
+                WindTowerCalculationData windTowerCalculationData = new WindTowerCalculationData();
+                windTowerCalculationData.setEbId(ebId);
+                windTowerCalculationData.setTime(new Date(dayTime));
+                windTowerCalculationData.setValue(tSum.divide(BigDecimal.valueOf(collect.size()), 2, RoundingMode.HALF_UP));
+
+                windTowerCalculationData.setEquipmentId(equipmentId);
+                tList.add(windTowerCalculationData);
+
+            }
+        } catch (Exception e) {
+            log.error("设备{}日平均温度统计异常", equipmentId, e);
+        }
+        log.info("{}设备日平均温度计算完成", equipmentId);
+        return tList;
+    }
+
+    /**
+     * 日平均气压入库
+     *
+     * @param startTime             开始时间
+     * @param endTime               结束时间
+     * @param equipmentId           设备Id
+     * @param equipmentAttributeMap 属性集合
+     */
+    public ArrayList<WindTowerCalculationData> paDay(Date startTime, Date endTime, String
+            equipmentId, List<ProphaseWeatherData> prophaseWeatherDataList
+            , Map<String, EquipmentAttribute> equipmentAttributeMap) {
+        String ebId = equipmentAttributeMap.get("paDay").getId();
+
+        ArrayList<WindTowerCalculationData> list = new ArrayList<>();
+        try {
+            for (long time = startTime.getTime(); time < endTime.getTime(); time += oneDay) {
+                long dayTime = time;
+                //过滤一天数据
+                List<ProphaseWeatherData> collect = prophaseWeatherDataList.stream().filter(p -> p.getTs().getTime() >= dayTime && p.getTs().getTime() < dayTime + oneDay
+                        && null != p.getPaAve() && p.getPaAve() > 0).collect(Collectors.toList());
+                if (collect.isEmpty()) {
+                    log.error("计算设备:{} 时间:{} 源数据为空,无法计算 日平均气压", equipmentId, DateTimeUtil.getFormatDateStr(dayTime));
+                    continue;
+                }
+                BigDecimal paSum = CalculationUtil.getBigDecimal(collect.stream().mapToDouble(ProphaseWeatherData::getPaAve).sum());
+                WindTowerCalculationData windTowerCalculationData = new WindTowerCalculationData();
+                windTowerCalculationData.setEbId(ebId);
+                windTowerCalculationData.setTime(new Date(dayTime));
+                windTowerCalculationData.setValue(paSum.divide(BigDecimal.valueOf(collect.size()), 2, RoundingMode.HALF_UP));
+                windTowerCalculationData.setEquipmentId(equipmentId);
+                list.add(windTowerCalculationData);
+
+            }
+        } catch (Exception e) {
+            log.error("设备{}日平均气压统计异常", equipmentId, e);
+        }
+        log.info("{}设备日平均气压计算完成", equipmentId);
+        return list;
+    }
+
+
+    /**
+     * 计算上一个小时 每10分钟的风切变指数
+     */
+    public ArrayList<WindTowerCalculationData> calculateWindPowerShear(Date startTime, Date endTime, String
+            equipmentId
+            , List<ProphaseAnemometryData> prophaseAnemometryDataList, List<WindTowerCalculationData> windTowerCalculationDataList
+            , Map<String, EquipmentAttribute> equipmentAttributeMap, WindTowerInfo windTowerInfo) {
+        log.info("开始计算小时风切变指数");
+        String[] heights = windTowerInfo.getHeights().split(",");
+        ArrayList<WindTowerCalculationData> listAll = new ArrayList<>();
+
+        String ebId = equipmentAttributeMap.get(windShearFiledName).getId();
+        try {
+            for (long start1 = startTime.getTime(); start1 <= endTime.getTime(); start1 = start1 + oneHour) {
+                //开始时间--->start1  结束时间---->start2
+                long start2 = start1 + oneHour;
+
+                long finalStart = start1;
+                List<ProphaseAnemometryData> collect = prophaseAnemometryDataList.stream().filter(p -> p.getTs().getTime() >= finalStart && p.getTs().getTime() < start2
+                        && null != p.getWsAve() && p.getWsAve() >= 3).collect(Collectors.toList());
+                //计算综合风切变
+                if (collect.isEmpty()) {
+                    log.error("计算设备:{} 时间:{} 源数据为空,无法计算 综合风切变", equipmentId, DateTimeUtil.getFormatDateStr(start1));
+                    continue;
+                }
+                BigDecimal windShear = CalculationUtil.getWindShear(collect, heights);
+                WindTowerCalculationData windTowerCalculationData = new WindTowerCalculationData();
+                windTowerCalculationData.setEquipmentId(equipmentId);
+                windTowerCalculationData.setTime(new Date(start1));
+                windTowerCalculationData.setValue(windShear);
+                windTowerCalculationData.setEbId(ebId);
+                windTowerCalculationDataList.add(windTowerCalculationData);
+                listAll.add(windTowerCalculationData);
+
+            }
+        } catch (Exception e) {
+            log.error("设备{}小时风切变统计异常:{}", equipmentId, e);
+        }
+        log.info("{}设备风切变指数计算完成", equipmentId);
+        return listAll;
+    }
+
+    /**
+     * 计算日发电量与满发小时数
+     */
+
+    public ArrayList<WindTowerCalculationData> calculateBattery(Long startTime, Long endTime, WindTowerInfo
+            windTowerInfo, List<ProphaseAnemometryData> prophaseAnemometryDataList
+            , Map<String, EquipmentAttribute> equipmentAttributeMap, List<WindTowerCalculationData> windTowerCalculationDataList) {
+
+        ArrayList<WindTowerCalculationData> batteryList = new ArrayList<>();
+        EquipmentAttribute batteryDay = equipmentAttributeMap.get("batteryDay");
+        //获取最高层高
+        String maxHeight = CalculationUtil.getNumberFromString(Arrays.asList(windTowerInfo.getHeights().split(",")).get(0));
+        for (long time = startTime; time < endTime; time += oneDay) {
+            long finalTime = time;
+            BigDecimal batterySum = prophaseAnemometryDataList.stream().filter(p -> p.getLayerHeight().equals(maxHeight) && null != p.getWsAve() && p.getWsAve() >= 0
+                            && p.getTs().getTime() >= finalTime && p.getTs().getTime() < finalTime + oneDay)
+                    .map(p -> CalculationUtil.getBattery(BigDecimal.valueOf(p.getWsAve()))).reduce(BigDecimal.ZERO, BigDecimal::add);
+
+            //日发电量
+            if (batterySum.compareTo(BigDecimal.ZERO) != 0) {
+                batterySum = batterySum.divide(BigDecimal.valueOf(6 * 1000), 2, RoundingMode.HALF_UP);
+
+                WindTowerCalculationData windTowerCalculationData = new WindTowerCalculationData();
+                windTowerCalculationData.setValue(batterySum);
+                windTowerCalculationData.setEbId(batteryDay.getId());
+                windTowerCalculationData.setTime(DateUtil.beginOfDay(new Date(time)));
+                windTowerCalculationData.setEquipmentId(windTowerInfo.getEquipmentNo());
+                batteryList.add(windTowerCalculationData);
+                windTowerCalculationDataList.add(windTowerCalculationData);
+            }
+
+
+        }
+        return batteryList;
+
+    }
+
+
+    /**
+     * 计算日平均空气密度
+     *
+     * @param startTime   开始时间
+     * @param endTime     结束时间
+     * @param equipmentId 设备ID
+     * @return
+     */
+    public ArrayList<WindTowerCalculationData> airDensityDay(Date startTime, Date endTime, String
+            equipmentId, List<ProphaseWeatherData> prophaseWeatherDataList
+            , Map<String, EquipmentAttribute> equipmentAttributeMap, List<WindTowerCalculationData> windTowerCalculationDataList) {
+
+        long startHour = startTime.getTime();
+        long endHour = endTime.getTime();
+        //空气密度属性
+        EquipmentAttribute equipmentAttribute = equipmentAttributeMap.get("airDensity");
+        ArrayList<WindTowerCalculationData> list = new ArrayList<>();
+        try {
+            for (long start1 = startHour; start1 < endHour; start1 = start1 + oneDay) {
+                //每天的结束时间
+                long start2 = start1 + oneDay - 1L;
+
+                long start = start1;
+                List<ProphaseWeatherData> collect = prophaseWeatherDataList.stream().filter(p -> p.getTs().getTime() >= start && p.getTs().getTime() <= start2
+                        && null != p.getAirDensity() && p.getAirDensity() > 0).collect(Collectors.toList());
+
+                //存平均值
+                if (collect.isEmpty()) {
+                    log.error("计算设备:{} 时间:{} 源数据为空,无法计算 日平均空气密度", equipmentId, DateTimeUtil.getFormatDateStr(start1));
+                    continue;
+                }
+                BigDecimal airDensityDay = zero;
+                for (ProphaseWeatherData map : collect) {
+                    airDensityDay = airDensityDay.add(CalculationUtil.getBigDecimal(map.getAirDensity()));
+                }
+                WindTowerCalculationData windTowerCalculationData = new WindTowerCalculationData();
+                windTowerCalculationData.setEbId(equipmentAttribute.getId());
+                windTowerCalculationData.setTime(new Date(start1));
+                windTowerCalculationData.setValue(airDensityDay.divide(new BigDecimal(collect.size()), 2, RoundingMode.HALF_UP));
+                if (windTowerCalculationData.getValue().doubleValue() < 0) {
+                    windTowerCalculationData.setValue(zero);
+                }
+                windTowerCalculationData.setEquipmentId(equipmentId);
+                windTowerCalculationDataList.add(windTowerCalculationData);
+                list.add(windTowerCalculationData);
+            }
+        } catch (Exception e) {
+            log.error("计算日平均空气密度错误:{}", e);
+        }
+        log.info("计算日平均空气密度完成");
+        return list;
+    }
+
+
+    /**
+     * 计算月最大风速
+     *
+     * @param startTime   开始时间
+     * @param endTime     结束时间
+     * @param equipmentId 设备id
+     * @return
+     */
+    public ArrayList<WindTowerCalculationData> wsMaxMonth(Date startTime, Date endTime, String
+            equipmentId, List<ProphaseAnemometryData> prophaseAnemometryDataList
+            , Map<String, EquipmentAttribute> equipmentAttributeMap, WindTowerInfo windTowerInfo) {
+
+        List<ProphaseAnemometryData> collect = prophaseAnemometryDataList.stream().filter(p -> p.getTs().getTime() >= startTime.getTime()
+                && p.getTs().getTime() <= endTime.getTime() && null != p.getWsMax() && p.getWsMax() >= 0).collect(Collectors.toList());
+
+        //获取所有层高
+        String[] height = windTowerInfo.getHeights().split(",");
+        ArrayList<WindTowerCalculationData> list = new ArrayList<>();
+        try {
+            if (!collect.isEmpty()) {
+                for (String h : height) {
+                    //获取对应层高的字段
+                    String ebIdMonth = equipmentAttributeMap.get(h + "maxwsMonth").getId();
+
+                    BigDecimal max = CalculationUtil.getBigDecimal(collect.stream().filter(c -> c.getLayerHeight().equals(h)).mapToDouble(ProphaseAnemometryData::getWsMax).sum());
+                    WindTowerCalculationData windTowerCalculationData = new WindTowerCalculationData();
+                    windTowerCalculationData.setEbId(ebIdMonth);
+                    windTowerCalculationData.setTime(startTime);
+                    windTowerCalculationData.setEquipmentId(equipmentId);
+                    windTowerCalculationData.setValue(max.divide(BigDecimal.valueOf(collect.size()), 2, RoundingMode.HALF_UP));
+                    list.add(windTowerCalculationData);
+                }
+            } else {
+                log.error("计算设备:{}  源数据为空,无法计算 月最大风速", equipmentId);
+            }
+        } catch (Exception e) {
+            log.error("设备编号{}月最大风速计算错误:{}", equipmentId, e);
+        }
+        log.info("设备编号{}月最大风速计算完成^ ^", equipmentId);
+        return list;
+    }
+
+
+    /**
+     * 计算月平均空气密度
+     *
+     * @param startTime   开始时间
+     * @param endTime     结束时间
+     * @param equipmentId 设备ID
+     * @return
+     */
+    public ArrayList<WindTowerCalculationData> airDensityMonth(Date startTime, Date endTime, String
+            equipmentId, List<WindTowerCalculationData> windTowerCalculationDataList
+            , Map<String, EquipmentAttribute> equipmentAttributeMap) {
+        ArrayList<WindTowerCalculationData> list = new ArrayList<>();
+        //时间-1防止0点数据查不到
+        Date startHour = new Date(startTime.getTime() - 1);
+        //获取时间段所有统计数据
+        List<WindTowerCalculationData> windTowerCalculationDataList1 = windTowerCalculationDataList.stream().filter(w -> w.getEquipmentId().equals(equipmentId) && w.getTime().after(startHour) && w.getTime().before(endTime)).collect(Collectors.toList());
+
+        EquipmentAttribute equipmentAttribute = equipmentAttributeMap.get("airDensity");
+        EquipmentAttribute equipmentAttributeMonth = equipmentAttributeMap.get("airDensityMonth");
+
+        BigDecimal airDensityMonth = new BigDecimal(0);
+        try {
+
+            //所有数据日空气密度
+            List<WindTowerCalculationData> windCalDataList = windTowerCalculationDataList1.stream().filter(w -> w.getTime().after(startHour) &&
+                    w.getTime().before(endTime) && w.getEquipmentId().equals(equipmentId) && w.getEbId().equals(equipmentAttribute.getId())).collect(Collectors.toList());
+            for (WindTowerCalculationData w : windCalDataList) {
+                airDensityMonth = airDensityMonth.add(w.getValue());
+            }
+            //平均值
+            if (!windCalDataList.isEmpty()) {
+                WindTowerCalculationData windTowerCalculationData = new WindTowerCalculationData();
+                windTowerCalculationData.setEbId(equipmentAttributeMonth.getId());
+                windTowerCalculationData.setTime(startTime);
+                windTowerCalculationData.setValue(airDensityMonth.divide(new BigDecimal(windCalDataList.size()), 2, RoundingMode.HALF_UP));
+                windTowerCalculationData.setEquipmentId(equipmentId);
+                list.add(windTowerCalculationData);
+            }
+        } catch (Exception e) {
+            log.error("计算月平均空气密度失败");
+            e.printStackTrace();
+        }
+        log.info("计算月平均空气密度完成");
+        return list;
+    }
+
+    /**
+     * 计算日平均风速
+     *
+     * @param startTime   开始时间
+     * @param endTime     结束时间
+     * @param equipmentId 设备id
+     * @return
+     */
+    public ArrayList<WindTowerCalculationData> wsDay(Date startTime, Date endTime, String
+            equipmentId, List<WindTowerCalculationData> windTowerCalculationDataList
+            , Map<String, EquipmentAttribute> equipmentAttributeMap, WindTowerInfo windTowerInfo) {
+        long startHour = startTime.getTime();
+        long endHour = endTime.getTime();
+
+        //获取测风塔所有层高
+        String[] strings = windTowerInfo.getHeights().split(",");
+        List<WindTowerCalculationData> windTowerCalculationDataList1 = windTowerCalculationDataList.stream().filter(w -> w.getEquipmentId().equals(equipmentId) && w.getTime().after(startTime) && w.getTime().before(endTime)).collect(Collectors.toList());
+        ArrayList<WindTowerCalculationData> list = new ArrayList<>();
+        try {
+            if (windTowerCalculationDataList1.isEmpty()) {
+                log.error("计算设备:{}  源数据为空,无法计算 日平均风速", equipmentId);
+                return list;
+            }
+            //遍历测风塔所有层高
+            for (String h : strings) {
+                //获取小时风速表
+                EquipmentAttribute awsEq = equipmentAttributeMap.get(h + "aws");
+                //获取日风速表
+                EquipmentAttribute awsDayEq = equipmentAttributeMap.get(h + "awsDay");
+
+                for (long start1 = startHour; start1 < endHour; start1 = start1 + oneDay) {
+                    long start2 = start1 + oneDay - 1L;
+                    //获取小时风速数据
+                    long start = start1;
+                    List<WindTowerCalculationData> wsCalDataList = windTowerCalculationDataList1.stream().filter(
+                                    w -> w.getTime().after(new Date(start)) &&
+                                            w.getTime().before(new Date(start2)) &&
+                                            w.getEquipmentId().equals(equipmentId) &&
+                                            w.getEbId().equals(awsEq.getId()))
+                            .collect(Collectors.toList()
+                            );
+                    //小时风功率总值
+                    BigDecimal awsSum = BigDecimal.ZERO;
+                    for (WindTowerCalculationData ws : wsCalDataList) {
+                        awsSum = awsSum.add(ws.getValue()).setScale(4, RoundingMode.HALF_UP);
+                    }
+                    if (!wsCalDataList.isEmpty()) {
+                        WindTowerCalculationData windTowerCalculationData = new WindTowerCalculationData();
+                        windTowerCalculationData.setEquipmentId(equipmentId);
+                        windTowerCalculationData.setValue(awsSum.divide(new BigDecimal(wsCalDataList.size()), 2, RoundingMode.HALF_UP));
+                        windTowerCalculationData.setEbId(awsDayEq.getId());
+                        windTowerCalculationData.setTime(new Date(start1));
+                        windTowerCalculationDataList.add(windTowerCalculationData);
+                        list.add(windTowerCalculationData);
+
+                    }
+
+                }
+            }
+        } catch (Exception e) {
+            log.error("设备编号{}日平均风速计算错误:{}", equipmentId, e);
+        }
+
+        log.info("设备编号{}米层高日平均风速计算完成", equipmentId);
+        return list;
+    }
+
+
+    /**
+     * 计算月平均风速
+     *
+     * @param startTime   开始时间
+     * @param endTime     结束时间
+     * @param equipmentId 设备编号
+     * @return
+     */
+    public ArrayList<WindTowerCalculationData> wsMonth(Date startTime, Date endTime, String
+            equipmentId, List<WindTowerCalculationData> windTowerCalculationDataList
+            , Map<String, EquipmentAttribute> equipmentAttributeMap, WindTowerInfo windTowerInfo) {
+        //时间-1防止0点数据查不到
+        Date startHour = new Date(startTime.getTime() - 1);
+        //获取时间段所有统计数据
+        List<WindTowerCalculationData> windTowerCalculationDataList1 = windTowerCalculationDataList.stream().filter(w -> w.getEquipmentId().equals(equipmentId) && w.getTime().after(startHour) && w.getTime().before(endTime)).collect(Collectors.toList());
+
+        ArrayList<WindTowerCalculationData> list = new ArrayList<>();
+        //遍历层高
+        try {
+            if (windTowerCalculationDataList1.isEmpty()) {
+                log.error("计算设备:{}  源数据为空,无法计算 日平均风速", equipmentId);
+                return list;
+            }
+            //获取所有层高
+            String[] height = windTowerInfo.getHeights().split(",");
+            for (String h : height) {
+                //获取对应层高的月平均风速字段
+                String ebIdMonth = equipmentAttributeMap.get(h + "awsMonth").getId();
+                String ebIdDay = equipmentAttributeMap.get(h + "awsDay").getId();
+
+                //获取所有日平均风速
+                List<WindTowerCalculationData> windTowerCalculationDatas = windTowerCalculationDataList1.stream().filter(w -> w.getEbId().equals(ebIdDay)
+                        && w.getTime().after(startHour) && w.getTime().before(endTime) && w.getEquipmentId().equals(equipmentId)).collect(Collectors.toList());
+                BigDecimal wsSum = new BigDecimal(0);
+
+                for (WindTowerCalculationData w : windTowerCalculationDatas) {
+                    wsSum = wsSum.add(w.getValue());
+                }
+
+                if (!windTowerCalculationDatas.isEmpty()) {
+                    WindTowerCalculationData windTowerCalculationData = new WindTowerCalculationData();
+                    windTowerCalculationData.setEbId(ebIdMonth);
+                    windTowerCalculationData.setTime(startTime);
+                    windTowerCalculationData.setEquipmentId(equipmentId);
+                    windTowerCalculationData.setValue(wsSum.divide(new BigDecimal(windTowerCalculationDatas.size()), 2, RoundingMode.HALF_UP).setScale(2, RoundingMode.HALF_UP));
+                    list.add(windTowerCalculationData);
+                }
+            }
+        } catch (Exception e) {
+            log.error("设备编号{}月平均风速计算错误:{}", equipmentId, e);
+        }
+        log.info("{}设备月平均风速统计完成", equipmentId);
+        return list;
+
+    }
+
+    /**
+     * 计算日平均风功率密度
+     *
+     * @param startTime   开始时间
+     * @param endTime     结束时间
+     * @param equipmentId 设备id
+     * @return
+     */
+    public ArrayList<WindTowerCalculationData> wpdDay(Date startTime, Date endTime, String
+            equipmentId, List<WindTowerCalculationData> windTowerCalculationDataList
+            , Map<String, EquipmentAttribute> equipmentAttributeMap, WindTowerInfo windTowerInfo) {
+        long startHour = startTime.getTime();
+        long endHour = endTime.getTime();
+        List<WindTowerCalculationData> windTowerCalculationDataList1 = windTowerCalculationDataList.stream().filter(w -> w.getEquipmentId().equals(equipmentId) && w.getTime().after(startTime) && w.getTime().before(endTime)).collect(Collectors.toList());
+        //获取所有层高
+        String[] strings = windTowerInfo.getHeights().split(",");
+        ArrayList<WindTowerCalculationData> list = new ArrayList<>();
+        try {
+            if (windTowerCalculationDataList1.isEmpty()) {
+                log.error("计算设备:{}  源数据为空,无法计算 日平均风功率密度", equipmentId);
+                return list;
+            }
+            //遍历层高
+            for (String h : strings) {
+                //获取所有小时风功率表
+                EquipmentAttribute wpdList = equipmentAttributeMap.get(h + "wpd");
+                //获取所有日风功率表
+                EquipmentAttribute wpdDayList = equipmentAttributeMap.get(h + "wpdDay");
+                for (long start1 = startHour; start1 < endHour; start1 = start1 + oneDay) {
+                    long start2 = start1 + oneDay - 1L;
+
+                    //获取所有小时风功率数据
+                    long start = start1;
+                    List<WindTowerCalculationData> wpdCalDataList = windTowerCalculationDataList1.stream().filter(w -> w.getTime().after(new Date(start)) &&
+                            w.getTime().before(new Date(start2)) && w.getEquipmentId().equals(equipmentId) && w.getEbId().equals(wpdList.getId())).collect(Collectors.toList());
+                    //小时风功率总值
+                    BigDecimal wpdSum = BigDecimal.ZERO;
+                    for (WindTowerCalculationData wpd : wpdCalDataList) {
+                        wpdSum = wpdSum.add(wpd.getValue());
+                    }
+                    if (!wpdCalDataList.isEmpty()) {
+                        WindTowerCalculationData windTowerCalculationData = new WindTowerCalculationData();
+                        windTowerCalculationData.setEquipmentId(equipmentId);
+                        windTowerCalculationData.setValue(wpdSum.divide(BigDecimal.valueOf(wpdCalDataList.size()), 2, RoundingMode.HALF_UP));
+                        windTowerCalculationData.setEbId(wpdDayList.getId());
+                        windTowerCalculationData.setTime(new Date(start1));
+                        windTowerCalculationDataList.add(windTowerCalculationData);
+                        list.add(windTowerCalculationData);
+                    }
+                }
+            }
+        } catch (Exception e) {
+            log.error("设备编号{}日平均风功率计算错误:{}", equipmentId, e);
+        }
+        log.info("设备编号{}日平均风功率计算完成^ ^", equipmentId);
+        return list;
+    }
+
+    /**
+     * 计算月平均风功率密度
+     *
+     * @param startTime   开始时间
+     * @param endTime     结束时间
+     * @param equipmentId 设备id
+     * @return
+     */
+    @Transactional
+    public ArrayList<WindTowerCalculationData> wpdMonth(Date startTime, Date endTime, String
+            equipmentId, List<WindTowerCalculationData> windTowerCalculationDataList
+            , Map<String, EquipmentAttribute> equipmentAttributeMap, WindTowerInfo windTowerInfo) {
+        //时间-1防止0点数据查不到
+        Date startHour = new Date(startTime.getTime() - 1);
+        //获取时间段所有统计数据
+        List<WindTowerCalculationData> windTowerCalculationDataList1 = windTowerCalculationDataList.stream().filter(w -> w.getEquipmentId().equals(equipmentId) && w.getTime().after(startHour)
+                && w.getTime().before(endTime)).collect(Collectors.toList());
+
+        //获取所有层高
+        String[] height = windTowerInfo.getHeights().split(",");
+        ArrayList<WindTowerCalculationData> list = new ArrayList<>();
+        try {
+            for (String h : height) {
+                //获取对应层高的月平均风速字段
+                String ebIdMonth = equipmentAttributeMap.get(h + "wpdMonth").getId();
+                String ebIdDay = equipmentAttributeMap.get(h + "wpdDay").getId();
+                //获取所有日平均风功率密度
+                List<WindTowerCalculationData> windTowerCalculationDatas = windTowerCalculationDataList1.stream().filter(w -> w.getEbId().equals(ebIdDay) && w.getTime().after(startHour)
+                        && w.getTime().before(endTime) && w.getEquipmentId().equals(equipmentId)).collect(Collectors.toList());
+                BigDecimal sum = zero;
+
+                for (WindTowerCalculationData w : windTowerCalculationDatas) {
+                    sum = sum.add(w.getValue());
+                }
+
+                if (!windTowerCalculationDatas.isEmpty()) {
+                    WindTowerCalculationData windTowerCalculationData = new WindTowerCalculationData();
+                    windTowerCalculationData.setEbId(ebIdMonth);
+                    windTowerCalculationData.setTime(startTime);
+                    windTowerCalculationData.setEquipmentId(equipmentId);
+                    windTowerCalculationData.setValue(sum.divide(new BigDecimal(windTowerCalculationDatas.size()), 2, RoundingMode.HALF_UP).setScale(2, RoundingMode.HALF_UP));
+                    list.add(windTowerCalculationData);
+                } else {
+                    log.error("计算设备:{}  源数据为空,无法计算 月平均风功率", equipmentId);
+                }
+
+            }
+
+        } catch (Exception e) {
+            log.error("设备编号{}月平均风功率计算错误:{}", equipmentId, e);
+        }
+        log.info("设备编号{}高月平均风功率计算完成", equipmentId);
+        return list;
+    }
+
+
+    /**
+     * 计算日平均风速标差
+     *
+     * @param startTime             开始时间
+     * @param endTime               结束时间
+     * @param equipmentId           测风塔编号
+     * @param equipmentAttributeMap 属性表
+     * @return
+     */
+    public ArrayList<WindTowerCalculationData> calculateStaDay(Date startTime, Date endTime, String
+            equipmentId, List<ProphaseAnemometryData> prophaseAnemometryDataList
+            , Map<String, EquipmentAttribute> equipmentAttributeMap, WindTowerInfo
+                                                                       windTowerInfo, List<WindTowerCalculationData> windTowerCalculationDataList) {
+        ArrayList<WindTowerCalculationData> dataList = new ArrayList<>();
+        long startHour = startTime.getTime();
+        long endHour = endTime.getTime();
+        String[] heights = windTowerInfo.getHeights().split(",");
+        prophaseAnemometryDataList = prophaseAnemometryDataList.stream().filter(p -> null != p.getWsSta() && p.getWsSta() >= 0).collect(Collectors.toList());
+        try {
+            for (String h : heights) {
+                //获取对应层高的属性
+                EquipmentAttribute equipmentAttributes = equipmentAttributeMap.get(h + "staDay");
+                //每天循环
+                for (long time = startHour; time < endHour; time = time + oneDay) {
+                    long startDate = time;
+                    //过滤一天的数据
+                    List<ProphaseAnemometryData> collect = prophaseAnemometryDataList.stream().filter(p -> p.getTs().getTime() >= startDate && p.getTs().getTime() < startDate + oneDay
+                            && p.getLayerHeight().equals(h)).collect(Collectors.toList());
+
+                    if (collect.size() > 0) {
+                        BigDecimal staSum = CalculationUtil.getBigDecimal(collect.stream().mapToDouble(ProphaseAnemometryData::getWsSta).sum());
+                        WindTowerCalculationData windTowerCalculationData = new WindTowerCalculationData();
+                        windTowerCalculationData.setEquipmentId(equipmentId);
+                        windTowerCalculationData.setTime(new Date(startDate));
+                        windTowerCalculationData.setValue(staSum.divide(CalculationUtil.getBigDecimal(collect.size()), 2, RoundingMode.HALF_UP));
+                        windTowerCalculationData.setEbId(equipmentAttributes.getId());
+                        windTowerCalculationDataList.add(windTowerCalculationData);
+                        dataList.add(windTowerCalculationData);
+                    } else {
+                        log.error("计算设备:{}  源数据为空,无法计算 日平均风速标差", equipmentId);
+                    }
+                }
+            }
+        } catch (Exception e) {
+            log.error("设备编号{}日平均风速标差计算错误:{} ", equipmentId, e);
+        }
+        log.info("设备编号{},风速标差数据计算完成", equipmentId);
+        return dataList;
+
+    }
+
+
+    /**
+     * 计算日平均湍流
+     *
+     * @param startTime   开始时间
+     * @param endTime     结束时间
+     * @param equipmentId 设备id
+     * @return
+     */
+    public ArrayList<WindTowerCalculationData> turbulenceDay(Date startTime, Date endTime, String
+            equipmentId, Map<String, EquipmentAttribute> equipmentAttributeMap, WindTowerInfo
+                                                                     windTowerInfo, List<WindTowerCalculationData> windTowerCalculationDataList) {
+        long startHour = startTime.getTime();
+        long endHour = endTime.getTime();
+        String[] heightAll = windTowerInfo.getHeights().split(",");
+        //获取对应测风塔数据
+        ArrayList<WindTowerCalculationData> list = new ArrayList<>();
+        try {
+            for (String h : heightAll) {
+
+                EquipmentAttribute turList = equipmentAttributeMap.get(h + turbulenceDay);
+                EquipmentAttribute staList = equipmentAttributeMap.get(h + staDay);
+                EquipmentAttribute wsList = equipmentAttributeMap.get(h + "awsDay");
+
+                for (long start1 = startHour; start1 < endHour; start1 = start1 + oneDay) {
+
+                    long finalStart = start1;
+                    List<WindTowerCalculationData> staDay = windTowerCalculationDataList.stream().filter(w -> w.getEbId().equals(staList.getId())
+                            && w.getTime().getTime() == finalStart).collect(Collectors.toList());
+                    List<WindTowerCalculationData> wsDay = windTowerCalculationDataList.stream().filter(w -> w.getEbId().equals(wsList.getId())
+                            && w.getTime().getTime() == finalStart).collect(Collectors.toList());
+
+                    if (!staDay.isEmpty() && !wsDay.isEmpty()) {
+
+                        //数据入库
+                        WindTowerCalculationData windTowerCalculationData = new WindTowerCalculationData();
+                        windTowerCalculationData.setTime(new Date(start1));
+                        windTowerCalculationData.setEbId(turList.getId());
+                        windTowerCalculationData.setEquipmentId(equipmentId);
+                        windTowerCalculationData.setValue(CalculationUtil.caTurbulenceIntensity(staDay.get(0).getValue(), wsDay.get(0).getValue()));
+                        windTowerCalculationDataList.add(windTowerCalculationData);
+                        list.add(windTowerCalculationData);
+                    } else {
+                        log.error("计算设备:{}  源数据为空,无法计算 日平均湍流", equipmentId);
+                    }
+                }
+
+
+            }
+        } catch (NumberFormatException e) {
+            log.error("设备编号{}日平均湍流计算错误:{}", equipmentId, e);
+        }
+        log.info("设备编号{}日平均湍流计算完成", equipmentId);
+        return list;
+    }
+
+
+    /**
+     * 月平均湍流
+     *
+     * @param startTime   开始时间
+     * @param endTime     结束时间
+     * @param equipmentId 设备编号
+     * @return
+     */
+    public ArrayList<WindTowerCalculationData> turbulenceMonth(Date startTime, Date endTime, String
+            equipmentId, List<WindTowerCalculationData> windTowerCalculationDataList
+            , Map<String, EquipmentAttribute> equipmentAttributeMap, WindTowerInfo windTowerInfo) {
+        //时间-1防止0点数据查不到
+        Date startHour = new Date(startTime.getTime() - 1);
+        //获取时间段所有统计数据
+        List<WindTowerCalculationData> windTowerCalculationDataList1 = windTowerCalculationDataList.stream().filter(w -> w.getEquipmentId().equals(equipmentId) && w.getTime().after(startHour) && w.getTime().before(endTime)).collect(Collectors.toList());
+
+        //获取所有层高
+        String[] height = windTowerInfo.getHeights().split(",");
+        ArrayList<WindTowerCalculationData> list = new ArrayList<>();
+        try {
+            for (String h : height) {
+                //获取对应层高的月平均风速字段
+                String ebIdDay = equipmentAttributeMap.get(h + "turbulenceDay").getId();
+                String ebIdMonth = equipmentAttributeMap.get(h + "turbulenceMonth").getId();
+
+                //获取所有日平均湍流风速
+                List<WindTowerCalculationData> windTowerCalculationDatas = windTowerCalculationDataList1.stream().filter(w -> w.getEbId().equals(ebIdDay) && w.getTime().after(startHour)
+                        && w.getTime().before(endTime) && w.getEquipmentId().equals(equipmentId)).collect(Collectors.toList());
+                BigDecimal sum = new BigDecimal(0);
+
+                for (WindTowerCalculationData w : windTowerCalculationDatas) {
+                    sum = sum.add(w.getValue());
+                }
+
+                if (!windTowerCalculationDatas.isEmpty()) {
+                    WindTowerCalculationData windTowerCalculationData = new WindTowerCalculationData();
+                    windTowerCalculationData.setEbId(ebIdMonth);
+                    windTowerCalculationData.setTime(startTime);
+                    windTowerCalculationData.setEquipmentId(equipmentId);
+                    windTowerCalculationData.setValue(sum.divide(new BigDecimal(windTowerCalculationDatas.size()), 2, RoundingMode.HALF_UP).setScale(2, RoundingMode.HALF_UP));
+                    list.add(windTowerCalculationData);
+                } else {
+                    log.error("计算设备:{}  源数据为空,无法计算 月平均湍流", equipmentId);
+                }
+            }
+
+        } catch (Exception e) {
+            log.error("设备编号{}月平均湍流计算错误:{}", equipmentId, e);
+        }
+        log.info("设备编号{}月平均湍流计算完成", equipmentId);
+        return list;
+    }
+
+    /**
+     * 计算日风切变入库
+     *
+     * @param startTime   开始时间
+     * @param endTime     结束时间
+     * @param equipmentId 设备id
+     * @return
+     */
+    public ArrayList<WindTowerCalculationData> shearDay(Date startTime, Date endTime, String
+            equipmentId, List<WindTowerCalculationData> windTowerCalculationDataList
+            , Map<String, EquipmentAttribute> equipmentAttributeMap, WindTowerInfo
+                                                                windTowerInfo, List<ProphaseAnemometryData> prophaseAnemometryDataList) {
+        long startHour = startTime.getTime();
+        long endHour = endTime.getTime();
+        String[] heights = windTowerInfo.getHeights().split(",");
+        List<ProphaseAnemometryData> prophaseAnemometryData = prophaseAnemometryDataList.stream().filter(p -> null != p.getWsAve() && p.getWsAve() >= 3).collect(Collectors.toList());
+        ArrayList<WindTowerCalculationData> list = new ArrayList<>();
+        try {
+            //获取日综合风切变
+            EquipmentAttribute shearDayList = equipmentAttributeMap.get(windShearDayFiledName);
+
+            for (long start1 = startHour; start1 < endHour; start1 = start1 + oneDay) {
+                long start2 = start1 + oneDay - 1L;
+
+                //获取所有小时风切变数据
+                long start = start1;
+                List<ProphaseAnemometryData> collect = prophaseAnemometryData.stream().filter(p -> p.getTs().getTime() >= start && p.getTs().getTime() < start2).collect(Collectors.toList());
+                BigDecimal windShear = CalculationUtil.getWindShear(collect, heights);
+                if (collect.size() > 0) {
+                    WindTowerCalculationData windTowerCalculationData = new WindTowerCalculationData();
+                    windTowerCalculationData.setEquipmentId(equipmentId);
+                    windTowerCalculationData.setValue(windShear);
+                    windTowerCalculationData.setEbId(shearDayList.getId());
+                    windTowerCalculationData.setTime(new Date(start1));
+                    windTowerCalculationDataList.add(windTowerCalculationData);
+                    list.add(windTowerCalculationData);
+                } else {
+                    log.error("计算设备:{}  源数据为空,无法计算 日平均风切变", equipmentId);
+                }
+            }
+        } catch (Exception e) {
+            log.error("设备编号{}日平均风切变计算错误", equipmentId, e);
+            e.printStackTrace();
+        }
+        log.info("设备编号{}日平均风切变计算完成", equipmentId);
+        return list;
+    }
+
+    /**
+     * 计算月风切变入库
+     *
+     * @param startTime   开始时间
+     * @param endTime     结束时间
+     * @param equipmentId 设备id
+     * @return
+     */
+    public ArrayList<WindTowerCalculationData> shearMonth(Date startTime, Date endTime, String
+            equipmentId, List<WindTowerCalculationData> windTowerCalculationDataList
+            , Map<String, EquipmentAttribute> equipmentAttributeMap, WindTowerInfo
+                                                                  windTowerInfo, List<ProphaseAnemometryData> prophaseAnemometryDataList) {
+        //获取时间段所有统计数据
+        ArrayList<WindTowerCalculationData> list = new ArrayList<>();
+        try {
+            //获取月平均综合风切变字段
+            String ebIdMonth = equipmentAttributeMap.get("windShearMonth").getId();
+
+            String heights = windTowerInfo.getHeights();
+            List<ProphaseAnemometryData> collect = prophaseAnemometryDataList.stream().filter(p -> p.getTs().getTime() >= startTime.getTime()
+                    && p.getTs().getTime() < endTime.getTime() && null != p.getWsAve() && p.getWsAve() >= 3).collect(Collectors.toList());
+            BigDecimal windShear = CalculationUtil.getWindShear(collect, heights.split(","));
+
+            if (collect.size() > 0) {
+                WindTowerCalculationData windTowerCalculationData = new WindTowerCalculationData();
+                windTowerCalculationData.setEbId(ebIdMonth);
+                windTowerCalculationData.setTime(startTime);
+                windTowerCalculationData.setEquipmentId(equipmentId);
+                windTowerCalculationData.setValue(windShear);
+                list.add(windTowerCalculationData);
+            } else {
+                log.error("计算设备:{}  源数据为空,无法计算 月平均风月切变", equipmentId);
+            }
+        } catch (Exception e) {
+            log.error("设备编号{}月平均风月切变计算错误{}", equipmentId, e);
+        }
+        log.info("设备编号{}月平均风切变计算完成", equipmentId);
+        return list;
+    }
+
+    /**
+     * 玫瑰图 数据计算
+     */
+    public void roseMonth(Date startTime, Date endTime, String equipmentId
+            , List<ProphaseAnemometryData> prophaseAnemometryDataList, List<ProphaseWeatherData> prophaseWeatherDataList
+            , Map<String, EquipmentAttribute> equipmentAttributeMap, WindTowerInfo windTowerInfo) {
+
+        //风数据
+        List<ProphaseAnemometryData> anemometryDataList = prophaseAnemometryDataList.stream().filter(p -> p.getTs().getTime() >= startTime.getTime()
+                && p.getTs().getTime() <= endTime.getTime()).collect(Collectors.toList());
+        //环境数据
+        List<ProphaseWeatherData> weatherDataList = prophaseWeatherDataList.stream().filter(p -> p.getTs().getTime() >= startTime.getTime()
+                && p.getTs().getTime() <= endTime.getTime()).collect(Collectors.toList());
+
+        ArrayList<WindDirectionStatisticsData> list = new ArrayList<>();
+        //获取所有层高
+        String[] heights = windTowerInfo.getWdHeights().split(",");
+        if (!anemometryDataList.isEmpty() && !weatherDataList.isEmpty()) {
+            //风向玫瑰图
+            ArrayList<WindDirectionStatisticsData> wdRose = wdRose(startTime, endTime, equipmentId, anemometryDataList, equipmentAttributeMap, heights);
+            list.addAll(wdRose);
+            //风功率玫瑰图
+            ArrayList<WindDirectionStatisticsData> powerRose = powerRose(startTime, endTime, equipmentId, anemometryDataList, weatherDataList, equipmentAttributeMap, heights);
+            list.addAll(powerRose);
+            //湍流玫瑰图
+            ArrayList<WindDirectionStatisticsData> turRose = turRose(startTime, endTime, equipmentId, anemometryDataList, equipmentAttributeMap, heights);
+            list.addAll(turRose);
+            //风切变玫瑰图
+            ArrayList<WindDirectionStatisticsData> windShearRose = windShearRose(startTime, endTime, equipmentId, anemometryDataList, equipmentAttributeMap, heights);
+            list.addAll(windShearRose);
+            windDirectionStatisticsDataServiceImpl.saveBatch(list);
+        } else {
+            log.info("设备编号{},{}月,玫瑰图计算失败,缺少测风塔数据^ ^", equipmentId, startTime.getMonth() + 1);
+        }
+
+
+    }
+
+    /**
+     * 风向玫瑰图统计计算
+     */
+    public ArrayList<WindDirectionStatisticsData> wdRose(Date startTime, Date endTime, String
+            equipmentId, List<ProphaseAnemometryData> anemometryDataList, Map<String, EquipmentAttribute> equipmentAttributeMap, String[]
+                                                                 heights) {
+        ArrayList<WindDirectionStatisticsData> list = new ArrayList<>();
+        try {
+            for (String height : heights) {
+                String ebIdMonth = equipmentAttributeMap.get(height + "monthWdRose").getId();
+                //删除时间段所有数据
+                windDirectionStatisticsDataServiceImpl.removeByStartTimeBetweenAndEquipmentIdAndEbId(new Date(startTime.getTime() - 1), endTime, equipmentId, ebIdMonth);
+                //筛选本层风数据
+                List<ProphaseAnemometryData> collect = anemometryDataList.stream().filter(a -> a.getLayerHeight().equals(height)).collect(Collectors.toList());
+                for (WindDirectionEnum value : WindDirectionEnum.values()) {
+
+                    List<ProphaseAnemometryData> forHeightAndWindDirectionEnum = CalculationUtil.getForHeightAndWindDirectionEnum(collect, value);
+                    if (!forHeightAndWindDirectionEnum.isEmpty()) {
+                        WindDirectionStatisticsData windDirectionStatisticsData = new WindDirectionStatisticsData();
+                        windDirectionStatisticsData.setEbId(ebIdMonth);
+                        windDirectionStatisticsData.setTime(startTime);
+                        windDirectionStatisticsData.setEquipmentId(equipmentId);
+                        windDirectionStatisticsData.setDirection(value.name());
+                        windDirectionStatisticsData.setValue(BigDecimal.valueOf(forHeightAndWindDirectionEnum.size()));
+                        list.add(windDirectionStatisticsData);
+                    } else {
+                        log.error("计算设备:{}  源数据为空,无法计算 风向玫瑰图统计", equipmentId);
+                    }
+                }
+            }
+
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return list;
+    }
+
+    /**
+     * 风功率玫瑰图统计计算
+     */
+    public ArrayList<WindDirectionStatisticsData> powerRose(Date startTime, Date endTime, String
+            equipmentId, List<ProphaseAnemometryData> anemometryDataList, List<ProphaseWeatherData> prophaseWeatherDataList, Map<String, EquipmentAttribute> equipmentAttributeMap, String[]
+                                                                    heights) {
+        ArrayList<WindDirectionStatisticsData> list = new ArrayList<>();
+        try {
+            for (String height : heights) {
+                String ebIdMonth = equipmentAttributeMap.get(height + "monthPowerRose").getId();
+                //删除时间段所有数据
+                windDirectionStatisticsDataServiceImpl.removeByStartTimeBetweenAndEquipmentIdAndEbId(startTime, endTime, equipmentId, ebIdMonth);
+                List<ProphaseAnemometryData> collect = anemometryDataList.stream().filter(a -> a.getLayerHeight().equals(height)).collect(Collectors.toList());
+                for (WindDirectionEnum value : WindDirectionEnum.values()) {
+                    List<ProphaseAnemometryData> forHeightAndWindDirectionEnum = CalculationUtil.getForHeightAndWindDirectionEnum(collect, value);
+                    if (!forHeightAndWindDirectionEnum.isEmpty()) {
+                        //根据风向获取风能数
+                        BigDecimal bigDecimal = CalculationUtil.windEnergyDensity(forHeightAndWindDirectionEnum, prophaseWeatherDataList);
+                        // 数据集合
+                        WindDirectionStatisticsData windDirectionStatisticsData = new WindDirectionStatisticsData();
+                        windDirectionStatisticsData.setEbId(ebIdMonth);
+                        windDirectionStatisticsData.setTime(startTime);
+                        windDirectionStatisticsData.setEquipmentId(equipmentId);
+                        windDirectionStatisticsData.setDirection(value.name());
+                        windDirectionStatisticsData.setValue(bigDecimal.equals(new BigDecimal(-99)) ? zero : bigDecimal);
+                        list.add(windDirectionStatisticsData);
+                    } else {
+                        log.error("计算设备:{}  源数据为空,无法计算 风功率玫瑰图统计", equipmentId);
+                    }
+                }
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return list;
+    }
+
+    /**
+     * 湍流玫瑰图统计计算
+     */
+    public ArrayList<WindDirectionStatisticsData> turRose(Date startTime, Date endTime, String
+            equipmentId, List<ProphaseAnemometryData> prophaseAnemometryDataList
+            , Map<String, EquipmentAttribute> equipmentAttributeMap, String[] heights) {
+        BigDecimal zero = new BigDecimal(0);
+        ArrayList<WindDirectionStatisticsData> list = new ArrayList<>();
+        try {
+            for (String height : heights) {
+                String ebIdMonth = equipmentAttributeMap.get(height + "monthTurRose").getId();
+                //删除时间段所有数据
+                windDirectionStatisticsDataServiceImpl.removeByStartTimeBetweenAndEquipmentIdAndEbId(startTime, endTime, equipmentId, ebIdMonth);
+                List<ProphaseAnemometryData> prophaseAnemometryData = prophaseAnemometryDataList.stream().filter(p -> p.getLayerHeight().equals(height)).collect(Collectors.toList());
+                for (WindDirectionEnum value : WindDirectionEnum.values()) {
+                    List<ProphaseAnemometryData> heightAndWindDirectionEnum = CalculationUtil.getForHeightAndWindDirectionEnum(prophaseAnemometryData, value);
+
+                    if (!heightAndWindDirectionEnum.isEmpty()) {
+                        //获取指定层高风速数据
+                        List<BigDecimal> wsForHeight = heightAndWindDirectionEnum.stream().filter(h -> h.getWsAve() != null && h.getWsAve() != 0 && h.getWsAve() != -99).map((ProphaseAnemometryData p) ->
+                                {
+                                    return CalculationUtil.getBigDecimal(p.getWsAve());
+                                }
+                        ).collect(Collectors.toList());
+
+                        //删除值为null的数据
+                        wsForHeight.removeAll(Collections.singletonList(null));
+                        //平均风速
+                        BigDecimal avgWindSpeed = CalculationUtil.getAvgWind(wsForHeight);
+                        //获取指定层高标差数据集合
+                        List<BigDecimal> staForHeight = heightAndWindDirectionEnum.stream().filter(h -> h.getWsSta() != null && h.getWsSta() != 0 && h.getWsSta() != -99).map((ProphaseAnemometryData p) ->
+                                {
+                                    return CalculationUtil.getBigDecimal(p.getWsSta());
+                                }
+                        ).collect(Collectors.toList());
+                        //平均风速标准差
+                        BigDecimal avgWindSpeedSta = CalculationUtil.getAvgWind(staForHeight);
+                        // 湍流
+                        BigDecimal bigDecimal = CalculationUtil.caTurbulenceIntensity(avgWindSpeedSta, avgWindSpeed);
+                        // 数据集合
+                        WindDirectionStatisticsData windDirectionStatisticsData = new WindDirectionStatisticsData();
+                        windDirectionStatisticsData.setEbId(ebIdMonth);
+                        windDirectionStatisticsData.setTime(startTime);
+                        windDirectionStatisticsData.setEquipmentId(equipmentId);
+                        windDirectionStatisticsData.setDirection(value.name());
+                        windDirectionStatisticsData.setValue(bigDecimal.equals(new BigDecimal(-99)) ? zero : bigDecimal);
+                        list.add(windDirectionStatisticsData);
+                    } else {
+                        log.error("计算设备:{}  源数据为空,无法计算 湍流玫瑰图统计", equipmentId);
+                    }
+
+                }
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return list;
+    }
+
+    /**
+     * 风切变玫瑰图统计计算
+     */
+    public ArrayList<WindDirectionStatisticsData> windShearRose(Date startTime, Date endTime, String
+            equipmentId, List<ProphaseAnemometryData> anemometryDataList
+            , Map<String, EquipmentAttribute> equipmentAttributeMap, String[] heights) {
+        ArrayList<WindDirectionStatisticsData> list = new ArrayList<>();
+        //设置最小层高  数值越大越好
+        int heightMin = 100;
+        try {
+            //设置临时层高 用于比较
+            int finalHeight = 10;
+            for (String height : heights) {
+                // 若是此层高是第二同层高
+                if (!height.contains("A")) {
+                    finalHeight = Integer.parseInt(height);
+                } else {
+
+                    continue;
+                }
+                if (finalHeight < heightMin) {
+                    heightMin = Integer.parseInt(height);
+                }
+            }
+            for (String height : heights) {
+                //如果层高等于最小增高则跳出循环
+                if (height.equals(String.valueOf(heightMin))) {
+                    continue;
+                }
+                String ebIdMonth = equipmentAttributeMap.get(height + "monthShearRose").getId();
+                //删除时间段所有数据
+                windDirectionStatisticsDataServiceImpl.removeByStartTimeBetweenAndEquipmentIdAndEbId(startTime, endTime, equipmentId, ebIdMonth);
+                for (WindDirectionEnum value : WindDirectionEnum.values()) {
+
+                    List<ProphaseAnemometryData> heightAndWindDirectionEnum = CalculationUtil.getForHeightAndWindDirectionEnum(anemometryDataList, value);
+                    if (!heightAndWindDirectionEnum.isEmpty()) {
+                        //获取指定层高风速数据
+                        List<BigDecimal> wsForHeight = heightAndWindDirectionEnum.stream().filter(h -> h.getWsAve() != null && h.getWsAve() != 0 && h.getWsAve() != -99 && h.getLayerHeight().equals(height)).map((ProphaseAnemometryData p) ->
+                                {
+                                    return CalculationUtil.getBigDecimal(p.getWsAve());
+                                }
+                        ).collect(Collectors.toList());
+                        //计算当前层高平均风速
+                        BigDecimal avgWindSpeed = CalculationUtil.getAvgWind(wsForHeight);
+                        //获取指定最小层高风速数据
+                        String finalHeightMin = String.valueOf(heightMin);
+                        List<BigDecimal> wsMinForHeight = heightAndWindDirectionEnum.stream().filter(h -> h.getWsAve() != null && h.getWsAve() != 0 && h.getWsAve() != -99 && h.getLayerHeight().equals(finalHeightMin)).map((ProphaseAnemometryData p) ->
+                                {
+                                    return CalculationUtil.getBigDecimal(p.getWsAve());
+                                }
+                        ).collect(Collectors.toList());
+                        //计算最小层高平均风速
+                        BigDecimal minAvgWindSpeed = CalculationUtil.getAvgWind(wsMinForHeight);
+                        BigDecimal bigDecimal = new BigDecimal(-99);
+
+                        if (minAvgWindSpeed.compareTo(BigDecimal.ZERO) != 0) {
+                            //计算风切变值
+                            bigDecimal = CalculationUtil.caWindShear(avgWindSpeed, minAvgWindSpeed, new BigDecimal(height), new BigDecimal(heightMin));
+                        }
+                        // 数据集合
+                        WindDirectionStatisticsData windDirectionStatisticsData = new WindDirectionStatisticsData();
+                        windDirectionStatisticsData.setEbId(ebIdMonth);
+                        windDirectionStatisticsData.setTime(startTime);
+                        windDirectionStatisticsData.setEquipmentId(equipmentId);
+                        windDirectionStatisticsData.setDirection(value.name());
+                        windDirectionStatisticsData.setValue(bigDecimal.equals(new BigDecimal(-99)) ? zero : bigDecimal);
+                        list.add(windDirectionStatisticsData);
+                    }
+
+                }
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return list;
+    }
+
+    /**
+     * 获取风况数据(平均风速,风功率密度)
+     *
+     * @param bigDecimalList 风速数据
+     * @return
+     */
+    public SpeedAndDensityDto getSpeedAndDensityDto
+    (List<BigDecimal> bigDecimalList, List<ProphaseAnemometryData> anemometryData, List<ProphaseWeatherData> weatherData) {
+
+        SpeedAndDensityDto speedAndDensityDto = new SpeedAndDensityDto();
+        BigDecimal avgWindSpeed = BigDecimal.valueOf(bigDecimalList.stream().collect(Collectors.averagingDouble(BigDecimal::doubleValue)));
+        speedAndDensityDto.setWindSpeed(avgWindSpeed);
+        speedAndDensityDto.setWindPowerDensity(CalculationUtil.windEnergyDensity(anemometryData, weatherData));
+
+        return speedAndDensityDto;
+    }
+
+
+}

+ 4 - 256
neim-biz/src/main/java/com/jiayue/biz/service/impl/WindDirectionStatisticsDataServiceImpl.java

@@ -1,25 +1,18 @@
 package com.jiayue.biz.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.jiayue.biz.domain.EquipmentAttribute;
-import com.jiayue.biz.domain.ProphaseAnemometryData;
-import com.jiayue.biz.domain.ProphaseWeatherData;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.jiayue.biz.domain.WindDirectionStatisticsData;
-import com.jiayue.biz.eunms.WindDirectionEnum;
 import com.jiayue.biz.mapper.WindDirectionStatisticsDataMapper;
 import com.jiayue.biz.service.WindDirectionStatisticsDataService;
 import com.jiayue.biz.service.WindTowerDataParentTableService;
 import com.jiayue.biz.service.WindTowerInfoService;
-import com.jiayue.biz.util.CalculationUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import org.springframework.transaction.annotation.Transactional;
 
-import java.math.BigDecimal;
-import java.util.*;
-import java.util.stream.Collectors;
+import java.util.Date;
+import java.util.List;
 
 
 /**
@@ -31,7 +24,7 @@ import java.util.stream.Collectors;
 @Slf4j
 @Service
 public class WindDirectionStatisticsDataServiceImpl extends ServiceImpl<WindDirectionStatisticsDataMapper, WindDirectionStatisticsData> implements WindDirectionStatisticsDataService {
-    private final BigDecimal zero = new BigDecimal(0);
+   
     @Autowired
     private final WindTowerInfoService windTowerInfoService;
     @Autowired
@@ -82,250 +75,5 @@ public class WindDirectionStatisticsDataServiceImpl extends ServiceImpl<WindDire
         remove(wrapper);
     }
 
-    @Transactional
-    /*玫瑰图*/
-    public void roseMonth(Date startTime, Date endTime, String equipmentId, List<ProphaseAnemometryData> prophaseAnemometryDataList, List<ProphaseWeatherData> prophaseWeatherDataList, List<EquipmentAttribute> equipmentAttributeList) {
-        //该测风塔一年的数据
-//        List<Map<String, Object>> windTowerDataParentTableListMap = windTowerDataParentTableMaps.stream().filter(w -> Long.parseLong(w.get("time").toString()) >= startTime.getTime() &&
-//                Long.parseLong(w.get("time").toString()) <= endTime.getTime()).collect(Collectors.toList());
-
-        //风数据
-        List<ProphaseAnemometryData> anemometryDataList = prophaseAnemometryDataList.stream().filter(p -> p.getTs().getTime() >= startTime.getTime() && p.getTs().getTime() <= endTime.getTime()).collect(Collectors.toList());
-        //环境数据
-        List<ProphaseWeatherData> weatherDataList = prophaseWeatherDataList.stream().filter(p -> p.getTs().getTime() >= startTime.getTime() && p.getTs().getTime() <= endTime.getTime()).collect(Collectors.toList());
-
-        ArrayList<WindDirectionStatisticsData> list = new ArrayList<>();
-        //获取所有层高
-        String[] heights = windTowerInfoService.getByEquipmentNo(equipmentId).get(0).getWdHeights().split(",");
-        if (!anemometryDataList.isEmpty() && !weatherDataList.isEmpty()) {
-            //风向玫瑰图
-            ArrayList<WindDirectionStatisticsData> wdRose = wdRose(startTime, endTime, equipmentId, anemometryDataList, equipmentAttributeList, heights);
-            list.addAll(wdRose);
-            //风功率玫瑰图
-            ArrayList<WindDirectionStatisticsData> powerRose = powerRose(startTime, endTime, equipmentId, anemometryDataList, weatherDataList, equipmentAttributeList, heights);
-            list.addAll(powerRose);
-            //湍流玫瑰图
-            ArrayList<WindDirectionStatisticsData> turRose = turRose(startTime, endTime, equipmentId, anemometryDataList, equipmentAttributeList, heights);
-            list.addAll(turRose);
-            //风切变玫瑰图
-            ArrayList<WindDirectionStatisticsData> windShearRose = windShearRose(startTime, endTime, equipmentId, anemometryDataList, equipmentAttributeList, heights);
-            list.addAll(windShearRose);
-            saveBatch(list);
-        } else {
-            log.info("设备编号{},{}月,玫瑰图计算失败,缺少测风塔数据^ ^", equipmentId, startTime.getMonth() + 1);
-        }
-
-
-    }
-
-    /**
-     * 风向玫瑰图统计计算
-     */
-    public ArrayList<WindDirectionStatisticsData> wdRose(Date startTime, Date endTime, String equipmentId, List<ProphaseAnemometryData> anemometryDataList, List<EquipmentAttribute> equipmentAttributeList, String[] heights) {
-        ArrayList<WindDirectionStatisticsData> list = new ArrayList<>();
-        try {
-            for (String height : heights) {
-                String ebIdMonth = equipmentAttributeList.stream().filter(w -> w.getFieldName().equals(height + "monthWdRose")).collect(Collectors.toList()).get(0).getId();
-                //删除时间段所有数据
-                removeByStartTimeBetweenAndEquipmentIdAndEbId(new Date(startTime.getTime() - 1), endTime, equipmentId, ebIdMonth);
-                //筛选本层风数据
-                List<ProphaseAnemometryData> collect = anemometryDataList.stream().filter(a -> a.getLayerHeight().equals(height)).collect(Collectors.toList());
-                for (WindDirectionEnum value : WindDirectionEnum.values()) {
-
-                    List<ProphaseAnemometryData> forHeightAndWindDirectionEnum = CalculationUtil.getForHeightAndWindDirectionEnum(collect, value);
-                    if (!forHeightAndWindDirectionEnum.isEmpty()) {
-                        WindDirectionStatisticsData windDirectionStatisticsData = new WindDirectionStatisticsData();
-                        windDirectionStatisticsData.setEbId(ebIdMonth);
-                        windDirectionStatisticsData.setTime(startTime);
-                        windDirectionStatisticsData.setEquipmentId(equipmentId);
-                        windDirectionStatisticsData.setDirection(value.name());
-                        windDirectionStatisticsData.setValue(BigDecimal.valueOf(forHeightAndWindDirectionEnum.size()));
-                        list.add(windDirectionStatisticsData);
-                    }
-                }
-            }
-            // 入库
-//            saveBatch(list);
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-        return list;
-    }
-
-    /**
-     * 风功率玫瑰图统计计算
-     */
-    public ArrayList<WindDirectionStatisticsData> powerRose(Date startTime, Date endTime, String equipmentId, List<ProphaseAnemometryData> anemometryDataList, List<ProphaseWeatherData> prophaseWeatherDataList,List<EquipmentAttribute> equipmentAttributeList, String[] heights) {
-        ArrayList<WindDirectionStatisticsData> list = new ArrayList<>();
-        try {
-            for (String height : heights) {
-                String ebIdMonth = equipmentAttributeList.stream().filter(w -> w.getFieldName().equals(height + "monthPowerRose")).collect(Collectors.toList()).get(0).getId();
-                //删除时间段所有数据
-                removeByStartTimeBetweenAndEquipmentIdAndEbId(startTime, endTime, equipmentId, ebIdMonth);
-                List<ProphaseAnemometryData> collect = anemometryDataList.stream().filter(a -> a.getLayerHeight().equals(height)).collect(Collectors.toList());
-                for (WindDirectionEnum value : WindDirectionEnum.values()) {
-                    //根据设备属性风向获取数据
-//                    List<Map<String, Object>> windTowerDataParentTableMap = CalculationUtil.getForHeightAndWindDirectionEnum(anemometryDataList, value);
-                    List<ProphaseAnemometryData> forHeightAndWindDirectionEnum = CalculationUtil.getForHeightAndWindDirectionEnum(collect, value);
-                    if (!forHeightAndWindDirectionEnum.isEmpty()) {
-
-                        //根据风向获取风能数
-                        BigDecimal bigDecimal = CalculationUtil.windEnergyDensity(forHeightAndWindDirectionEnum, prophaseWeatherDataList);
-                        // 数据集合
-                        WindDirectionStatisticsData windDirectionStatisticsData = new WindDirectionStatisticsData();
-                        windDirectionStatisticsData.setEbId(ebIdMonth);
-                        windDirectionStatisticsData.setTime(startTime);
-                        windDirectionStatisticsData.setEquipmentId(equipmentId);
-                        windDirectionStatisticsData.setDirection(value.name());
-                        windDirectionStatisticsData.setValue(bigDecimal.equals(new BigDecimal(-99)) ? zero : bigDecimal);
-                        list.add(windDirectionStatisticsData);
-                    }
-
-                }
-            }
-            // 入库
-//            saveBatch(list);
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-        return list;
-    }
-
-    /**
-     * 湍流玫瑰图统计计算
-     */
-    public ArrayList<WindDirectionStatisticsData> turRose(Date startTime, Date endTime, String equipmentId,  List<ProphaseAnemometryData> prophaseAnemometryDataList, List<EquipmentAttribute> equipmentAttributeList, String[] heights) {
-        BigDecimal zero = new BigDecimal(0);
-        ArrayList<WindDirectionStatisticsData> list = new ArrayList<>();
-        try {
-            for (String height : heights) {
-                String ebIdMonth = equipmentAttributeList.stream().filter(w -> w.getFieldName().equals(height + "monthTurRose")).collect(Collectors.toList()).get(0).getId();
-                //删除时间段所有数据
-                removeByStartTimeBetweenAndEquipmentIdAndEbId(startTime, endTime, equipmentId, ebIdMonth);
-                List<ProphaseAnemometryData> prophaseAnemometryData = prophaseAnemometryDataList.stream().filter(p -> p.getLayerHeight().equals(height)).collect(Collectors.toList());
-                for (WindDirectionEnum value : WindDirectionEnum.values()) {
-//                    List<Map<String, Object>> windTowerDataParentTableMap = CalculationUtil.getForHeightAndWindDirectionEnum(windTowerDataParentTableMaps, height, value);
-                    List<ProphaseAnemometryData> heightAndWindDirectionEnum = CalculationUtil.getForHeightAndWindDirectionEnum(prophaseAnemometryData, value);
-
-
-                    if (!heightAndWindDirectionEnum.isEmpty()) {
-                        //获取指定层高风速数据
-                        List<BigDecimal> wsForHeight = heightAndWindDirectionEnum.stream().filter(h -> h.getWsAve() != null && h.getWsAve() != 0 && h.getWsAve() != -99).map((ProphaseAnemometryData p) ->
-                                {
-                                    return CalculationUtil.getBigDecimal(p.getWsAve());
-                                }
-                        ).collect(Collectors.toList());
-
-                        //删除值为null的数据
-                        wsForHeight.removeAll(Collections.singletonList(null));
-                        //平均风速
-                        BigDecimal avgWindSpeed = CalculationUtil.getAvgWind(wsForHeight);
-                        //获取指定层高标差数据集合
-                        List<BigDecimal> staForHeight = heightAndWindDirectionEnum.stream().filter(h -> h.getWsSta() != null && h.getWsSta() != 0 && h.getWsSta() != -99).map((ProphaseAnemometryData p) ->
-                                {
-                                    return CalculationUtil.getBigDecimal(p.getWsSta());
-                                }
-                        ).collect(Collectors.toList());
-                        //平均风速标准差
-                        BigDecimal avgWindSpeedSta = CalculationUtil.getAvgWind(staForHeight);
-                        // 湍流
-                        BigDecimal bigDecimal = CalculationUtil.caTurbulenceIntensity(avgWindSpeedSta, avgWindSpeed);
-                        // 数据集合
-                        WindDirectionStatisticsData windDirectionStatisticsData = new WindDirectionStatisticsData();
-                        windDirectionStatisticsData.setEbId(ebIdMonth);
-                        windDirectionStatisticsData.setTime(startTime);
-                        windDirectionStatisticsData.setEquipmentId(equipmentId);
-                        windDirectionStatisticsData.setDirection(value.name());
-                        windDirectionStatisticsData.setValue(bigDecimal.equals(new BigDecimal(-99)) ? zero : bigDecimal);
-                        list.add(windDirectionStatisticsData);
-                    }
-
-                }
-            }
-            // 入库
-//            saveBatch(list);
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-        return list;
-    }
-
-    /**
-     * 风切变玫瑰图统计计算
-     */
-    public ArrayList<WindDirectionStatisticsData> windShearRose(Date startTime, Date endTime, String equipmentId, List<ProphaseAnemometryData> anemometryDataList, List<EquipmentAttribute> equipmentAttributeList, String[] heights) {
-        ArrayList<WindDirectionStatisticsData> list = new ArrayList<>();
-        //设置最小层高  数值越大越好
-        int heightMin = 100;
-        try {
-            //设置临时层高 用于比较
-            int finalHeight = 10;
-            for (String height : heights) {
-                // 若是此层高是第二同层高
-                if (!height.contains("A")) {
-                    finalHeight = Integer.parseInt(height);
-                } else {
-//                    finalHeight = Integer.parseInt(height.substring(0,height.length()-1));
-                    continue;
-                }
-                if (finalHeight < heightMin) {
-                    heightMin = Integer.parseInt(height);
-                }
-            }
-            for (String height : heights) {
-                //如果层高等于最小增高则跳出循环
-                if (height.equals(String.valueOf(heightMin))) {
-                    continue;
-                }
-                String ebIdMonth = equipmentAttributeList.stream().filter(w -> w.getFieldName().equals(height + "monthShearRose")).collect(Collectors.toList()).get(0).getId();
-                //删除时间段所有数据
-                removeByStartTimeBetweenAndEquipmentIdAndEbId(startTime, endTime, equipmentId, ebIdMonth);
-                for (WindDirectionEnum value : WindDirectionEnum.values()) {
-
-//                    List<Map<String, Object>> windTowerDataParentTableMap = CalculationUtil.getForHeightAndWindDirectionEnum(anemometryDataList, value);
-                    List<ProphaseAnemometryData> heightAndWindDirectionEnum = CalculationUtil.getForHeightAndWindDirectionEnum(anemometryDataList, value);
-                    if (!heightAndWindDirectionEnum.isEmpty()) {
-                        //获取指定层高风速数据
-                        List<BigDecimal> wsForHeight = heightAndWindDirectionEnum.stream().filter(h -> h.getWsAve() != null && h.getWsAve() != 0  && h.getWsAve() != -99 && h.getLayerHeight().equals(height)).map((ProphaseAnemometryData p) ->
-                                {
-                                    return CalculationUtil.getBigDecimal(p.getWsAve());
-                                }
-                        ).collect(Collectors.toList());
-                        //计算当前层高平均风速
-                        BigDecimal avgWindSpeed = CalculationUtil.getAvgWind(wsForHeight);
-                        //获取指定最小层高风速数据
-                        String finalHeightMin = String.valueOf(heightMin);
-                        List<BigDecimal> wsMinForHeight = heightAndWindDirectionEnum.stream().filter(h -> h.getWsAve() != null && h.getWsAve() != 0  && h.getWsAve() != -99 && h.getLayerHeight().equals(finalHeightMin)).map((ProphaseAnemometryData p) ->
-                                {
-                                    return CalculationUtil.getBigDecimal(p.getWsAve());
-                                }
-                        ).collect(Collectors.toList());
-                        //计算最小层高平均风速
-                        BigDecimal minAvgWindSpeed = CalculationUtil.getAvgWind(wsMinForHeight);
-                        BigDecimal bigDecimal = new BigDecimal(-99);
-
-                        if (minAvgWindSpeed.compareTo(BigDecimal.ZERO) != 0) {
-                            //计算风切变值
-                            bigDecimal = CalculationUtil.caWindShear(avgWindSpeed, minAvgWindSpeed, new BigDecimal(height), new BigDecimal(heightMin));
-                        }
-                        // 数据集合
-                        WindDirectionStatisticsData windDirectionStatisticsData = new WindDirectionStatisticsData();
-                        windDirectionStatisticsData.setEbId(ebIdMonth);
-                        windDirectionStatisticsData.setTime(startTime);
-                        windDirectionStatisticsData.setEquipmentId(equipmentId);
-                        windDirectionStatisticsData.setDirection(value.name());
-                        windDirectionStatisticsData.setValue(bigDecimal.equals(new BigDecimal(-99)) ? zero : bigDecimal);
-                        list.add(windDirectionStatisticsData);
-                    }
-
-                }
-            }
-            // 入库
-//            saveBatch(list);
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-        return list;
-    }
 
 }

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 175 - 1103
neim-biz/src/main/java/com/jiayue/biz/service/impl/WindTowerCalculationDataServiceImpl.java


+ 14 - 7
neim-biz/src/main/java/com/jiayue/biz/util/CalculationUtil.java

@@ -91,7 +91,10 @@ public class CalculationUtil {
             if (anemometryData.size() != 0) {
                 BigDecimal wpdSum = new BigDecimal(0);
                 for (ProphaseAnemometryData anemometryDatum : anemometryData) {
-                    List<ProphaseWeatherData> collect = weatherData.stream().filter(w -> w.getTs().getTime() == anemometryDatum.getTs().getTime() && anemometryDatum.getWsAve() != null && anemometryDatum.getWsAve() != -99).collect(Collectors.toList());
+                    List<ProphaseWeatherData> collect = weatherData.stream()
+                            .filter(w -> w.getTs().getTime() == anemometryDatum.getTs().getTime()
+                                    && anemometryDatum.getWsAve() != null && anemometryDatum.getWsAve() != -99
+                                    && w.getAirDensity() != null && w.getAirDensity() != -99).collect(Collectors.toList());
                     if (collect.size() > 0) {
                         wpdSum = wpdSum.add(getWpdCalculate(getBigDecimal(collect.get(0).getAirDensity()), getBigDecimal(anemometryDatum.getWsAve())));
                     }
@@ -99,7 +102,7 @@ public class CalculationUtil {
                 density = wpdSum.divide(BigDecimal.valueOf(anemometryData.size()), 2, RoundingMode.HALF_UP);
             }
         } catch (Exception e) {
-            log.error("计算风风能密度时发生错误");
+            log.error("计算风风能密度时发生错误:{}", e);
         } finally {
             return density;
         }
@@ -234,7 +237,7 @@ public class CalculationUtil {
      */
     public static List<BigDecimal> getData24(List<WindTowerCalculationData> awsList) {
 
-        Long hour = 3600000l;
+        Long hour = 3600000L;
 
         Date systemDate = new Date();
 
@@ -375,7 +378,10 @@ public class CalculationUtil {
         return value;
     }
 
-    //计算综合风切变
+    /**
+     * 计算综合风切变
+     */
+
     public static BigDecimal getWindShear(List<ProphaseAnemometryData> prophaseAnemometryData, String[] heights) {
         BigDecimal sumWShear = BigDecimal.ZERO;
         BigDecimal total = BigDecimal.ZERO;
@@ -388,7 +394,8 @@ public class CalculationUtil {
                 return getBigDecimal(p.getWsAve());
             }).collect(Collectors.averagingDouble(BigDecimal::doubleValue))).setScale(8, RoundingMode.HALF_UP);
             //筛选低层高
-            List<String> heightList = new ArrayList<>(Arrays.asList(heights)).stream().filter(s -> Integer.valueOf(CalculationUtil.getNumberFromString(maxHeight)) > Integer.valueOf(CalculationUtil.getNumberFromString(s))).collect(Collectors.toList());
+            List<String> heightList = new ArrayList<>(Arrays.asList(heights)).stream()
+                    .filter(s -> Integer.valueOf(CalculationUtil.getNumberFromString(maxHeight)) > Integer.valueOf(CalculationUtil.getNumberFromString(s))).collect(Collectors.toList());
             //计算风切变
             for (String minHeight : heightList) {
                 if (minHeight.contains("A")) {
@@ -398,7 +405,7 @@ public class CalculationUtil {
                 BigDecimal wsAveMin = new BigDecimal(prophaseAnemometryData.stream().filter(p -> p.getLayerHeight().equals(minHeight)).map(p -> {
                     return getBigDecimal(p.getWsAve());
                 }).collect(Collectors.averagingDouble(BigDecimal::doubleValue))).setScale(8, RoundingMode.HALF_UP);
-//                BigDecimal wsAveMin = getAvgWind(minHeightForWsList);
+
                 double z = new BigDecimal(getNumberFromString(maxHeight)).divide(new BigDecimal(getNumberFromString(minHeight)), 8, RoundingMode.HALF_UP).doubleValue();
                 //计算log 层高
                 double z1 = Math.log10(z);
@@ -407,7 +414,7 @@ public class CalculationUtil {
                             .divide(BigDecimal.valueOf(z1), 8, RoundingMode.HALF_UP);
                     sumWShear = sumWShear.add(shear);
                     total = total.add(BigDecimal.ONE);
-//                    System.out.println(" height = " + maxHeight + "====" + wsAveForMax + "====" + minHeight + "====" + wsAveMin + "======" + shear);
+
                 }
             }
         }

+ 14 - 0
neim-biz/src/main/java/com/jiayue/biz/util/CommonUtil.java

@@ -1,7 +1,9 @@
 package com.jiayue.biz.util;
 
+import com.jiayue.biz.controller.HomePageController;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
+import org.springframework.boot.system.ApplicationHome;
 
 import java.io.*;
 import java.net.URI;
@@ -391,4 +393,16 @@ public abstract class CommonUtil {
     }
 
 
+    /**
+     * 获取项目所在路径
+     *
+     * @return
+     */
+    public static String getRealPath() {
+        ApplicationHome h = new ApplicationHome(HomePageController.class);
+        File jarF = h.getSource();
+
+        return jarF.getParentFile().toString();
+    }
+
 }

+ 12 - 2
neim-biz/src/main/java/com/jiayue/biz/util/DateTimeUtil.java

@@ -5,8 +5,6 @@ import com.sun.istack.internal.NotNull;
 import lombok.SneakyThrows;
 import org.apache.commons.lang3.time.DateUtils;
 
-import com.sun.istack.internal.NotNull;
-
 import java.text.ParseException;
 import java.text.ParsePosition;
 import java.text.SimpleDateFormat;
@@ -195,6 +193,18 @@ public class DateTimeUtil {
     }
 
     /**
+     * 将长时间格式时间转换为字符串 yyyy-MM-dd HH:mm:ss
+     *
+     * @param dateDate
+     * @return
+     */
+    public static String getFormatDateStr(Long dateDate) {
+        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        String dateString = formatter.format(dateDate);
+        return dateString;
+    }
+
+    /**
      * 将时间格式字符串转换为时间 HH:mm
      *
      * @param strDate

+ 3 - 10
neim-biz/src/main/resources/application-dev.yml

@@ -6,22 +6,15 @@ spring:
       max-request-size: 200MB
   data:
     mongodb:
-      host: 192.168.1.208
-      port: 27017
-      database: neim
-      username: root
-      password: '!QAZ2root'
-      authentication-database: admin
+      uri: mongodb://mongodb:123456@192.168.1.208:27017/neim
   datasource:
     dynamic:
       primary: mysql #设置默认的数据源或者数据源组,默认值即为master
       datasource:
         mysql:
-          url: jdbc:mysql://192.168.1.205:3306/nerp-test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true
-#          url: jdbc:mysql://49.4.78.194:17136/nerp-test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true
-          #url: jdbc:mysql://168.178.8.2:3306/nerp-db-v2?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true
+          url: jdbc:mysql://192.168.10.73:3306/neim_db?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true
           username: root
-          password: '!QAZ2root'
+          password: 'poi123.mnb'
           driver-class-name: com.mysql.cj.jdbc.Driver
           type: com.alibaba.druid.pool.DruidDataSource
           druid:

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 20
neim-biz/src/main/resources/html/ie.html


BIN
neim-biz/src/main/resources/html/ie.html.gz


BIN
neim-biz/src/main/resources/img/bg.png


BIN
neim-biz/src/main/resources/img/fengche.png


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
neim-biz/src/main/resources/static/css/app.60c5599b.css


BIN
neim-biz/src/main/resources/static/css/app.60c5599b.css.gz


+ 0 - 1
neim-biz/src/main/resources/static/css/chunk-1208fcbe.793cbdf1.css

@@ -1 +0,0 @@
-.icon-body[data-v-0273f142]{width:100%;padding:10px}.icon-body .icon-list[data-v-0273f142]{height:200px;overflow-y:scroll}.icon-body .icon-list div[data-v-0273f142]{height:30px;line-height:30px;margin-bottom:-5px;cursor:pointer;width:33%;float:left}.icon-body .icon-list span[data-v-0273f142]{display:inline-block;vertical-align:-.15em;fill:currentColor;overflow:hidden}

BIN
neim-biz/src/main/resources/static/css/chunk-1208fcbe.793cbdf1.css.gz


+ 0 - 1
neim-biz/src/main/resources/static/css/chunk-171ca186.99047b9c.css

@@ -1 +0,0 @@
-.login{position:fixed;height:100%;width:100%;background-image:url(../../static/img/background.a568162c.svg);background-size:cover;background-color:#2d3a4b}.title{font-size:24px;font-weight:400;color:#eee;margin:0 auto 30px auto;text-align:center}.login-form{position:absolute;left:0;right:0;max-width:100%;margin:120px auto;border-radius:6px;width:355px;padding:25px 25px 5px 25px}.login-form .el-input{height:38px}.login-form .el-input input{height:38px;background:transparent;border:0;-webkit-appearance:none;border:1px solid hsla(0,0%,100%,.1);border-radius:5px;color:#eee}.login-form .el-input input:-webkit-autofill{-webkit-box-shadow:0 0 0 1000px #2d3a4b inset!important;-webkit-text-fill-color:#fff!important}.login-form .el-form-item{background:rgba(0,0,0,.1);color:#454545}.login-form .input-icon{height:39px;width:14px;margin-left:2px}.login-tip{font-size:13px;text-align:center;color:#bfbfbf}.login-code{width:33%;height:38px;float:right}.login-code img{cursor:pointer;vertical-align:middle}.el-login-footer{height:40px;line-height:40px;position:fixed;bottom:0;width:100%;text-align:center;color:#fff;font-family:Arial;font-size:12px;letter-spacing:1px}.login-code-img{height:38px}

BIN
neim-biz/src/main/resources/static/css/chunk-171ca186.99047b9c.css.gz


+ 0 - 1
neim-biz/src/main/resources/static/css/chunk-24c54c5f.25ee122e.css

@@ -1 +0,0 @@
-.logBox[data-v-7d89f008]{height:4vh;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-pack:distribute;justify-content:space-around;color:#fff}.logTitle[data-v-7d89f008]{width:40%;margin-top:3%}.logTitle[data-v-7d89f008] .border-box-content{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.myTable[data-v-7d89f008]{width:95%;height:86vh;margin-left:2%}.tableBox[data-v-7d89f008] .el-table,.tableBox[data-v-7d89f008] .el-table__expanded-cell,[data-v-7d89f008] .el-table td,[data-v-7d89f008] .el-table th,[data-v-7d89f008] .el-table tr{color:#fff;background-color:transparent}[data-v-7d89f008] .tableBox tbody tr:hover>td{background-color:unset!important}

BIN
neim-biz/src/main/resources/static/css/chunk-24c54c5f.25ee122e.css.gz


+ 0 - 1
neim-biz/src/main/resources/static/css/chunk-28506e6c.1487a511.css

@@ -1 +0,0 @@
-.coolDowning{background:#cdcdcd;border-color:#cdcdcd}

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
neim-biz/src/main/resources/static/css/chunk-2af653b1.55d20a16.css


BIN
neim-biz/src/main/resources/static/css/chunk-2af653b1.55d20a16.css.gz


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
neim-biz/src/main/resources/static/css/chunk-32ea1202.153aa359.css


BIN
neim-biz/src/main/resources/static/css/chunk-32ea1202.153aa359.css.gz


+ 0 - 1
neim-biz/src/main/resources/static/css/chunk-345dd7f2.bbc9fa95.css

@@ -1 +0,0 @@
-.errPage-container[data-v-f2e02586]{width:800px;max-width:100%;margin:100px auto}.errPage-container .pan-back-btn[data-v-f2e02586]{background:#008489;color:#fff;border:none!important}.errPage-container .pan-gif[data-v-f2e02586]{margin:0 auto;display:block}.errPage-container .pan-img[data-v-f2e02586]{display:block;margin:0 auto;width:100%}.errPage-container .text-jumbo[data-v-f2e02586]{font-size:60px;font-weight:700;color:#484848}.errPage-container .list-unstyled[data-v-f2e02586]{font-size:14px}.errPage-container .list-unstyled li[data-v-f2e02586]{padding-bottom:5px}.errPage-container .list-unstyled a[data-v-f2e02586]{color:#008489;text-decoration:none}.errPage-container .list-unstyled a[data-v-f2e02586]:hover{text-decoration:underline}

BIN
neim-biz/src/main/resources/static/css/chunk-345dd7f2.bbc9fa95.css.gz


+ 0 - 1
neim-biz/src/main/resources/static/css/chunk-3724ee0c.c7a6b184.css

@@ -1 +0,0 @@
-.box-card[data-v-47b1ec30]{height:90vh}.seachBox[data-v-47b1ec30]{display:-webkit-box;display:-ms-flexbox;display:flex;margin:.5%;height:10%}.conditionOne[data-v-47b1ec30],.conditionTwo[data-v-47b1ec30],.seachBtu[data-v-47b1ec30]{display:inline-block}.conditionTwo[data-v-47b1ec30],.seachBtu[data-v-47b1ec30]{margin-left:.5%}#TPChart[data-v-47b1ec30]{width:100%;height:calc(38vh - 10px)}.block[data-v-47b1ec30]{float:right}

BIN
neim-biz/src/main/resources/static/css/chunk-3724ee0c.c7a6b184.css.gz


+ 0 - 1
neim-biz/src/main/resources/static/css/chunk-3ca6096f.9f7e2498.css

@@ -1 +0,0 @@
-.seachBox[data-v-42378e7e]{display:-webkit-box;display:-ms-flexbox;display:flex;margin:.5%}.conditionOne[data-v-42378e7e],.conditionTwo[data-v-42378e7e],.seachBtu[data-v-42378e7e]{display:inline-block}.conditionTwo[data-v-42378e7e],.seachBtu[data-v-42378e7e]{margin-left:.5%}.mainBox[data-v-42378e7e]{width:99%;margin-left:.5%}#tunInChart[data-v-42378e7e]{width:100%;height:calc(74vh - 5px)}.block[data-v-42378e7e]{float:right}

BIN
neim-biz/src/main/resources/static/css/chunk-3ca6096f.9f7e2498.css.gz


+ 0 - 1
neim-biz/src/main/resources/static/css/chunk-444dbb2e.3e10cd59.css

@@ -1 +0,0 @@
-.icon-ul[data-v-2fa68d6e]{margin:0;padding:0;font-size:0}.icon-ul li[data-v-2fa68d6e]{list-style-type:none;text-align:center;font-size:14px;display:inline-block;width:16.66%;-webkit-box-sizing:border-box;box-sizing:border-box;height:108px;padding:15px 6px 6px 6px;cursor:pointer;overflow:hidden}.icon-ul li[data-v-2fa68d6e]:hover{background:#f2f2f2}.icon-ul li.active-item[data-v-2fa68d6e]{background:#e1f3fb;color:#7a6df0}.icon-ul li>i[data-v-2fa68d6e]{font-size:30px;line-height:50px}.icon-dialog[data-v-2fa68d6e] .el-dialog{border-radius:8px;margin-bottom:0;margin-top:4vh!important;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;max-height:92vh;overflow:hidden;-webkit-box-sizing:border-box;box-sizing:border-box}.icon-dialog[data-v-2fa68d6e] .el-dialog .el-dialog__header{padding-top:14px}.icon-dialog[data-v-2fa68d6e] .el-dialog .el-dialog__body{margin:0 20px 20px 20px;padding:0;overflow:auto}

BIN
neim-biz/src/main/resources/static/css/chunk-444dbb2e.3e10cd59.css.gz


+ 0 - 1
neim-biz/src/main/resources/static/css/chunk-46876428.680532d0.css

@@ -1 +0,0 @@
-.box-card[data-v-1f688162]{height:90vh}.seachBox[data-v-1f688162]{display:-webkit-box;display:-ms-flexbox;display:flex;margin:.5%;height:10%}.conditionOne[data-v-1f688162],.conditionTwo[data-v-1f688162],.seachBtu[data-v-1f688162]{display:inline-block}.conditionTwo[data-v-1f688162],.seachBtu[data-v-1f688162]{margin-left:.5%}#TPChart[data-v-1f688162]{width:100%;height:calc(38vh - 10px)}.block[data-v-1f688162]{float:right}

BIN
neim-biz/src/main/resources/static/css/chunk-46876428.680532d0.css.gz


+ 0 - 1
neim-biz/src/main/resources/static/css/chunk-47fed2d0.f9e52dca.css

@@ -1 +0,0 @@
-.user-info-head[data-v-4c17c724]{position:relative;display:inline-block;height:120px}.user-info-head[data-v-4c17c724]:hover:after{content:"+";position:absolute;left:0;right:0;top:0;bottom:0;color:#eee;background:rgba(0,0,0,.5);font-size:24px;font-style:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;cursor:pointer;line-height:110px;border-radius:50%}

BIN
neim-biz/src/main/resources/static/css/chunk-47fed2d0.f9e52dca.css.gz


+ 0 - 1
neim-biz/src/main/resources/static/css/chunk-48223c1b.139f8fef.css

@@ -1 +0,0 @@
-.box-card[data-v-8644617c]{height:90vh}.seachBox[data-v-8644617c]{display:-webkit-box;display:-ms-flexbox;display:flex;margin:.5%;height:10%}.conditionOne[data-v-8644617c],.conditionTwo[data-v-8644617c],.seachBtu[data-v-8644617c]{display:inline-block}.conditionTwo[data-v-8644617c],.seachBtu[data-v-8644617c]{margin-left:.5%}#TPChart[data-v-8644617c]{width:100%;height:calc(38vh - 10px)}.block[data-v-8644617c]{float:right}

BIN
neim-biz/src/main/resources/static/css/chunk-48223c1b.139f8fef.css.gz


+ 0 - 1
neim-biz/src/main/resources/static/css/chunk-55d183ec.4e8637e7.css

@@ -1 +0,0 @@
-.icons-container[data-v-101db740]{margin:10px 20px 0;overflow:hidden}.icons-container .icon-item[data-v-101db740]{margin:20px;height:85px;text-align:center;width:100px;float:left;font-size:30px;color:#24292e;cursor:pointer}.icons-container span[data-v-101db740]{display:block;font-size:16px;margin-top:10px}.icons-container .disabled[data-v-101db740]{pointer-events:none}

BIN
neim-biz/src/main/resources/static/css/chunk-55d183ec.4e8637e7.css.gz


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 4
neim-biz/src/main/resources/static/css/chunk-57c7bd1b.84f98409.css


BIN
neim-biz/src/main/resources/static/css/chunk-57c7bd1b.84f98409.css.gz


+ 0 - 1
neim-biz/src/main/resources/static/css/chunk-59e3a2aa.db9979c1.css

@@ -1 +0,0 @@
-#map[data-v-5d53008e]{width:100%;height:83vh;border-radius:10px}.mapTitleBox[data-v-5d53008e]{height:4vh;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-pack:distribute;justify-content:space-around}.mapTitle[data-v-5d53008e]{width:10%;color:#fff}.mapTitle[data-v-5d53008e] .border-box-content{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.tdt-top[data-v-5d53008e],[data-v-5d53008e] .tdt-bottom{display:none}

BIN
neim-biz/src/main/resources/static/css/chunk-59e3a2aa.db9979c1.css.gz


+ 0 - 1
neim-biz/src/main/resources/static/css/chunk-5a5e4b3e.95f72f1d.css

@@ -1 +0,0 @@
-.box-card[data-v-5d2528c4]{height:90vh}.seachBox[data-v-5d2528c4]{display:-webkit-box;display:-ms-flexbox;display:flex;margin:.5%}.conditionOne[data-v-5d2528c4],.conditionThree[data-v-5d2528c4],.conditionTwo[data-v-5d2528c4],.seachBtu[data-v-5d2528c4]{display:inline-block}.conditionThree[data-v-5d2528c4],.conditionTwo[data-v-5d2528c4],.seachBtu[data-v-5d2528c4]{margin-left:.5%}#shearChart[data-v-5d2528c4]{display:inline-block;width:100%;height:calc(38vh - 10px)}.block[data-v-5d2528c4]{float:right}[data-v-5d2528c4] .el-descriptions-item__label.is-bordered-label{width:49.5%;color:#1f2d3d;text-align:center}[data-v-5d2528c4] .el-descriptions :not(.is-bordered) .el-descriptions-item__cell{text-align:center}

BIN
neim-biz/src/main/resources/static/css/chunk-5a5e4b3e.95f72f1d.css.gz


+ 0 - 1
neim-biz/src/main/resources/static/css/chunk-5b83c289.ce2a2394.css

@@ -1 +0,0 @@
-.hljs{display:block;background:#fff;padding:.5em;color:#333;overflow-x:auto}.hljs-comment,.hljs-meta{color:#969896}.hljs-emphasis,.hljs-quote,.hljs-strong,.hljs-template-variable,.hljs-variable{color:#df5000}.hljs-keyword,.hljs-selector-tag,.hljs-type{color:#d73a49}.hljs-attribute,.hljs-bullet,.hljs-literal,.hljs-symbol{color:#0086b3}.hljs-name,.hljs-section{color:#63a35c}.hljs-tag{color:#333}.hljs-attr,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-id,.hljs-selector-pseudo,.hljs-title{color:#6f42c1}.hljs-addition{color:#55a532;background-color:#eaffea}.hljs-deletion{color:#bd2c00;background-color:#ffecec}.hljs-link{text-decoration:underline}.hljs-number{color:#005cc5}.hljs-string{color:#032f62}

BIN
neim-biz/src/main/resources/static/css/chunk-5b83c289.ce2a2394.css.gz


+ 0 - 1
neim-biz/src/main/resources/static/css/chunk-5bcac654.179c4f24.css

@@ -1 +0,0 @@
-.seachBox[data-v-851b3c4c]{display:-webkit-box;display:-ms-flexbox;display:flex;margin:.5%}.conditionOne[data-v-851b3c4c],.conditionThree[data-v-851b3c4c],.conditionTwo[data-v-851b3c4c],.seachBtu[data-v-851b3c4c]{display:inline-block}.conditionThree[data-v-851b3c4c],.conditionTwo[data-v-851b3c4c],.seachBtu[data-v-851b3c4c]{margin-left:.5%}.tableDiv[data-v-851b3c4c]{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-pack:distribute;justify-content:space-around}.tableBox[data-v-851b3c4c]{width:49%}.block[data-v-851b3c4c]{float:right}#charts[data-v-851b3c4c]{width:100%;height:calc(74vh - 5px)}

BIN
neim-biz/src/main/resources/static/css/chunk-5bcac654.179c4f24.css.gz


+ 0 - 1
neim-biz/src/main/resources/static/css/chunk-5e857f95.daa871e9.css

@@ -1 +0,0 @@
-.block[data-v-11fd29cc]{display:-webkit-box;display:-ms-flexbox;display:flex}.conOne[data-v-11fd29cc],.myButton[data-v-11fd29cc]{margin-left:.5%}.dialogFooter[data-v-11fd29cc]{width:100%;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;margin-top:1.5%}.summaryBox[data-v-11fd29cc]{float:left;margin-top:.5%;left:1%}

BIN
neim-biz/src/main/resources/static/css/chunk-5e857f95.daa871e9.css.gz


+ 0 - 1
neim-biz/src/main/resources/static/css/chunk-67417c65.43ccdbe8.css

@@ -1 +0,0 @@
-.seachBox[data-v-413a157a]{display:-webkit-box;display:-ms-flexbox;display:flex;margin:.5%}.conditionOne[data-v-413a157a],.conditionThree[data-v-413a157a],.conditionTwo[data-v-413a157a],.seachBtu[data-v-413a157a]{display:inline-block}.conditionThree[data-v-413a157a],.conditionTwo[data-v-413a157a],.seachBtu[data-v-413a157a]{margin-left:.5%}.tableDiv[data-v-413a157a]{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-pack:distribute;justify-content:space-around}.tableBox[data-v-413a157a]{width:49%}.block[data-v-413a157a]{float:right}#charts[data-v-413a157a]{width:100%;height:calc(74vh - 5px)}

BIN
neim-biz/src/main/resources/static/css/chunk-67417c65.43ccdbe8.css.gz


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
neim-biz/src/main/resources/static/css/chunk-6a51e97f.5a402cd2.css


BIN
neim-biz/src/main/resources/static/css/chunk-6a51e97f.5a402cd2.css.gz


+ 0 - 1
neim-biz/src/main/resources/static/css/chunk-6ad04947.f9e52dca.css

@@ -1 +0,0 @@
-.user-info-head[data-v-4c17c724]{position:relative;display:inline-block;height:120px}.user-info-head[data-v-4c17c724]:hover:after{content:"+";position:absolute;left:0;right:0;top:0;bottom:0;color:#eee;background:rgba(0,0,0,.5);font-size:24px;font-style:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;cursor:pointer;line-height:110px;border-radius:50%}

BIN
neim-biz/src/main/resources/static/css/chunk-6ad04947.f9e52dca.css.gz


+ 0 - 1
neim-biz/src/main/resources/static/css/chunk-7c4ca7cb.b3dde55f.css

@@ -1 +0,0 @@
-.pop_btn[data-v-62966b06]{text-align:center;margin-top:20px}.popup-main[data-v-62966b06]{position:relative;margin:10px auto;background:#fff;border-radius:5px;font-size:12px;overflow:hidden}.popup-title[data-v-62966b06]{overflow:hidden;line-height:34px;padding-top:6px;background:#f2f2f2}.popup-result[data-v-62966b06]{-webkit-box-sizing:border-box;box-sizing:border-box;line-height:24px;margin:25px auto;padding:15px 10px 10px;border:1px solid #ccc;position:relative}.popup-result .title[data-v-62966b06]{position:absolute;top:-28px;left:50%;width:140px;font-size:14px;margin-left:-70px;text-align:center;line-height:30px;background:#fff}.popup-result table[data-v-62966b06]{text-align:center;width:100%;margin:0 auto}.popup-result table span[data-v-62966b06]{display:block;width:100%;font-family:arial;line-height:30px;height:30px;white-space:nowrap;overflow:hidden;border:1px solid #e8e8e8}.popup-result-scroll[data-v-62966b06]{font-size:12px;line-height:24px;height:10em;overflow-y:auto}

BIN
neim-biz/src/main/resources/static/css/chunk-7c4ca7cb.b3dde55f.css.gz


+ 0 - 1
neim-biz/src/main/resources/static/css/chunk-7ca6e6a6.2e9373c8.css

@@ -1 +0,0 @@
-.seachBox[data-v-9571f3ec]{display:-webkit-box;display:-ms-flexbox;display:flex;margin:.5%}.conditionOne[data-v-9571f3ec],.conditionThree[data-v-9571f3ec],.conditionTwo[data-v-9571f3ec],.seachBtu[data-v-9571f3ec]{display:inline-block}.conditionThree[data-v-9571f3ec],.conditionTwo[data-v-9571f3ec],.seachBtu[data-v-9571f3ec]{margin-left:.5%}#powerChart[data-v-9571f3ec],#roseChart[data-v-9571f3ec],#shearChart[data-v-9571f3ec],#tunInRoseChart[data-v-9571f3ec]{display:inline-block;width:50%;height:calc(38vh - 10px)}

BIN
neim-biz/src/main/resources/static/css/chunk-7ca6e6a6.2e9373c8.css.gz


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
neim-biz/src/main/resources/static/css/chunk-7d80f20e.4b262291.css


BIN
neim-biz/src/main/resources/static/css/chunk-7d80f20e.4b262291.css.gz


+ 0 - 1
neim-biz/src/main/resources/static/css/chunk-7d993ace.3a987f25.css

@@ -1 +0,0 @@
-.register{position:fixed;height:100%;width:100%;background-image:url(../../static/img/background.a568162c.svg);background-size:cover;background-color:#2d3a4b}.title{font-size:24px;font-weight:400;color:#eee;margin:0 auto 30px auto;text-align:center}.register-form{position:absolute;left:0;right:0;max-width:100%;margin:120px auto;border-radius:6px;width:355px;padding:25px 25px 5px 25px}.register-form .el-input{height:38px}.register-form .el-input input{height:38px;background:transparent;border:0;-webkit-appearance:none;border:1px solid hsla(0,0%,100%,.1);border-radius:5px;color:#eee}.register-form .el-input input:-webkit-autofill{-webkit-box-shadow:0 0 0 1000px #2d3a4b inset!important;-webkit-text-fill-color:#fff!important}.register-form .el-form-item{background:rgba(0,0,0,.1);color:#454545}.register-form .input-icon{height:39px;width:14px;margin-left:2px}.register-tip{font-size:13px;text-align:center;color:#bfbfbf}.register-code{width:33%;height:38px;float:right}.register-code img{cursor:pointer;vertical-align:middle}.el-register-footer{height:40px;line-height:40px;position:fixed;bottom:0;width:100%;text-align:center;color:#fff;font-family:Arial;font-size:12px;letter-spacing:1px}.register-code-img{height:38px}

BIN
neim-biz/src/main/resources/static/css/chunk-7d993ace.3a987f25.css.gz


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
neim-biz/src/main/resources/static/css/chunk-b8e2922c.26edb5dd.css


BIN
neim-biz/src/main/resources/static/css/chunk-b8e2922c.26edb5dd.css.gz


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
neim-biz/src/main/resources/static/css/chunk-c28ad000.17fbdb6b.css


BIN
neim-biz/src/main/resources/static/css/chunk-c28ad000.17fbdb6b.css.gz


Kaikkia tiedostoja ei voida näyttää, sillä liian monta tiedostoa muuttui tässä diffissä