Browse Source

实时采集井相关、预警参数动态调整

zhao.renji 4 days ago
parent
commit
08cb65b085
76 changed files with 3176 additions and 63 deletions
  1. 33 2
      pom.xml
  2. 154 0
      yujing-common/src/main/java/com/cn/tianji/common/CommonUtils.java
  3. 49 0
      yujing-common/src/main/java/com/cn/tianji/common/Sm4Util.java
  4. 6 2
      yujing-common/src/main/java/com/cn/tianji/entity/WellDrillingSICP.java
  5. 71 0
      yujing-common/src/main/java/com/cn/tianji/entity/YjComprehensiveLog.java
  6. 71 0
      yujing-common/src/main/java/com/cn/tianji/entity/YjComprehensiveRealLog.java
  7. 42 0
      yujing-common/src/main/java/com/cn/tianji/entity/YjComprehensiveWarnIds.java
  8. 1 1
      yujing-common/src/main/java/com/cn/tianji/mapper/WellDrillingMapper.java
  9. 13 0
      yujing-common/src/main/java/com/cn/tianji/mapper/YjComprehensiveLogMapper.java
  10. 14 0
      yujing-common/src/main/java/com/cn/tianji/mapper/YjComprehensiveRealLogMapper.java
  11. 14 0
      yujing-common/src/main/java/com/cn/tianji/mapper/YjComprehensiveWarnIdsMapper.java
  12. 5 0
      yujing-common/src/main/java/com/cn/tianji/service/ComprehensiveWarnService.java
  13. 2 0
      yujing-common/src/main/java/com/cn/tianji/service/HookLoadWarnLogService.java
  14. 2 0
      yujing-common/src/main/java/com/cn/tianji/service/PumpingPressureWarnLogService.java
  15. 2 0
      yujing-common/src/main/java/com/cn/tianji/service/TorqueWarnLogService.java
  16. 2 0
      yujing-common/src/main/java/com/cn/tianji/service/TotalPoolVolumeWarnLogService.java
  17. 3 0
      yujing-common/src/main/java/com/cn/tianji/service/WellDrillingService.java
  18. 7 0
      yujing-common/src/main/java/com/cn/tianji/service/YjComprehensiveLogService.java
  19. 10 0
      yujing-common/src/main/java/com/cn/tianji/service/YjComprehensiveRealLogService.java
  20. 12 0
      yujing-common/src/main/java/com/cn/tianji/service/YjComprehensiveWarnIdsService.java
  21. 3 0
      yujing-common/src/main/java/com/cn/tianji/service/YjRealTimeLogService.java
  22. 11 1
      yujing-common/src/main/java/com/cn/tianji/service/impl/HookLoadWarnLogServiceImpl.java
  23. 11 0
      yujing-common/src/main/java/com/cn/tianji/service/impl/PumpingPressureWarnLogServiceImpl.java
  24. 11 1
      yujing-common/src/main/java/com/cn/tianji/service/impl/TorqueWarnLogServiceImpl.java
  25. 12 1
      yujing-common/src/main/java/com/cn/tianji/service/impl/TotalPoolVolumeWarnLogServiceImpl.java
  26. 45 3
      yujing-common/src/main/java/com/cn/tianji/service/impl/WellDrillingServiceImpl.java
  27. 16 0
      yujing-common/src/main/java/com/cn/tianji/service/impl/YjComprehensiveLogServiceImpl.java
  28. 28 0
      yujing-common/src/main/java/com/cn/tianji/service/impl/YjComprehensiveRealLogServiceImpl.java
  29. 16 0
      yujing-common/src/main/java/com/cn/tianji/service/impl/YjComprehensiveWarnIdsServiceImpl.java
  30. 12 4
      yujing-common/src/main/java/com/cn/tianji/service/impl/YjRealTimeLogServiceImpl.java
  31. 6 0
      yujing-common/src/main/resources/mapper/YjComprehensiveLogMapper.xml
  32. 6 0
      yujing-common/src/main/resources/mapper/YjComprehensiveRealLogMapper.xml
  33. 6 0
      yujing-common/src/main/resources/mapper/YjComprehensiveWarnIdsMapper.xml
  34. 7 1
      yujing-condition-identification/src/main/java/com/cn/tianji/ConditionIdentificationApplication.java
  35. 37 0
      yujing-condition-identification/src/main/java/com/cn/tianji/config/DataSourceDecryptConfig.java
  36. 46 0
      yujing-condition-identification/src/main/java/com/cn/tianji/controller/SicpToLtdController.java
  37. 6 0
      yujing-condition-identification/src/main/java/com/cn/tianji/controller/WorkingConditionCalculationController.java
  38. 897 0
      yujing-condition-identification/src/main/java/com/cn/tianji/param/SicpImportParam.java
  39. 2 0
      yujing-condition-identification/src/main/java/com/cn/tianji/service/Impl/DataSupplementationServiceImpl.java
  40. 367 0
      yujing-condition-identification/src/main/java/com/cn/tianji/service/Impl/SicpToLtdImportServiceImpl.java
  41. 7 0
      yujing-condition-identification/src/main/java/com/cn/tianji/service/Impl/WorkingConditionCalculationServiceImpl.java
  42. 10 0
      yujing-condition-identification/src/main/java/com/cn/tianji/service/SicpToLtdImportService.java
  43. 2 0
      yujing-condition-identification/src/main/java/com/cn/tianji/service/WorkingConditionCalculationService.java
  44. 27 0
      yujing-condition-identification/src/main/java/com/cn/tianji/task/Task.java
  45. 5 6
      yujing-condition-identification/src/main/resources/config/application-prod.yml
  46. 8 4
      yujing-condition-identification/src/main/resources/config/application.yml
  47. 4 0
      yujing-hook-load-warning/pom.xml
  48. 5 1
      yujing-hook-load-warning/src/main/java/com/cn/tianji/HookLoadWarningApplication.java
  49. 37 0
      yujing-hook-load-warning/src/main/java/com/cn/tianji/config/DataSourceDecryptConfig.java
  50. 6 1
      yujing-hook-load-warning/src/main/resources/config/application.yml
  51. 2 2
      yujing-hook-load-warning/src/main/resources/logback.xml
  52. 8 3
      yujing-pull/pom.xml
  53. 5 1
      yujing-pull/src/main/java/com/cn/tianji/PullApplication.java
  54. 37 0
      yujing-pull/src/main/java/com/cn/tianji/config/DataSourceDecryptConfig.java
  55. 12 0
      yujing-pull/src/main/java/com/cn/tianji/controller/TaskTestController.java
  56. 16 0
      yujing-pull/src/main/java/com/cn/tianji/dto/JhPullTestDto.java
  57. 8 0
      yujing-pull/src/main/java/com/cn/tianji/service/TestPullDataService.java
  58. 193 0
      yujing-pull/src/main/java/com/cn/tianji/service/impl/TestPullDataServiceImpl.java
  59. 4 0
      yujing-pull/src/main/java/com/cn/tianji/task/PullDataTask.java
  60. 2 2
      yujing-pull/src/main/java/com/cn/tianji/task/PullSICPDataTask.java
  61. 9 1
      yujing-pull/src/main/resources/config/application.yml
  62. 4 0
      yujing-pumping-pressure/pom.xml
  63. 5 1
      yujing-pumping-pressure/src/main/java/com/cn/tianji/PumpingPressureApplication.java
  64. 37 0
      yujing-pumping-pressure/src/main/java/com/cn/tianji/config/DataSourceDecryptConfig.java
  65. 7 2
      yujing-pumping-pressure/src/main/resources/config/application.yml
  66. 4 0
      yujing-torque/pom.xml
  67. 5 1
      yujing-torque/src/main/java/com/cn/tianji/TorqueApplication.java
  68. 37 0
      yujing-torque/src/main/java/com/cn/tianji/config/DataSourceDecryptConfig.java
  69. 20 16
      yujing-torque/src/main/resources/config/application.yml
  70. 4 0
      yujing-total-pool-volume/pom.xml
  71. 5 1
      yujing-total-pool-volume/src/main/java/com/cn/tianji/TotalPoolVolumeApplication.java
  72. 37 0
      yujing-total-pool-volume/src/main/java/com/cn/tianji/config/DataSourceDecryptConfig.java
  73. 15 5
      yujing-total-pool-volume/src/main/resources/config/application.yml
  74. 1 0
      yujing-warning-calculation/pom.xml
  75. 46 0
      yujing-warning-calculation/src/main/java/com/cn/tianji/common/CaffeineCacheUtil.java
  76. 484 0
      yujing-warning-calculation/src/main/java/com/cn/tianji/service/impl/ComprehensiveWarnServiceImpl.java

+ 33 - 2
pom.xml

@@ -114,7 +114,7 @@
         <dependency>
         <dependency>
             <groupId>org.apache.rocketmq</groupId>
             <groupId>org.apache.rocketmq</groupId>
             <artifactId>rocketmq-spring-boot-starter</artifactId>
             <artifactId>rocketmq-spring-boot-starter</artifactId>
-            <version>2.1.1</version>
+            <version>2.3.3</version>
         </dependency>
         </dependency>
 <!--        <dependency>-->
 <!--        <dependency>-->
 <!--            <groupId>com.aliyun.openservices</groupId>-->
 <!--            <groupId>com.aliyun.openservices</groupId>-->
@@ -125,7 +125,13 @@
         <dependency>
         <dependency>
             <groupId>cn.hutool</groupId>
             <groupId>cn.hutool</groupId>
             <artifactId>hutool-all</artifactId>
             <artifactId>hutool-all</artifactId>
-            <version>5.8.12</version>
+            <version>5.8.24</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.bouncycastle</groupId>
+            <artifactId>bcprov-jdk15on</artifactId>
+            <version>1.68</version> <!-- 使用最新版本 -->
         </dependency>
         </dependency>
 
 
         <dependency>
         <dependency>
@@ -133,6 +139,31 @@
             <artifactId>lombok</artifactId>
             <artifactId>lombok</artifactId>
             <optional>true</optional>
             <optional>true</optional>
         </dependency>
         </dependency>
+
+        <dependency>
+            <groupId>com.github.ben-manes.caffeine</groupId>
+            <artifactId>caffeine</artifactId>
+            <version>2.6.2</version>
+        </dependency>
+
+        <dependency>
+            <groupId>cn.afterturn</groupId>
+            <artifactId>easypoi-spring-boot-starter</artifactId>
+            <version>4.4.0</version>
+        </dependency>
+
+        <!-- 添加XML解析器依赖 -->
+        <dependency>
+            <groupId>xerces</groupId>
+            <artifactId>xercesImpl</artifactId>
+            <version>2.12.2</version>
+        </dependency>
+        <dependency>
+            <groupId>xml-apis</groupId>
+            <artifactId>xml-apis</artifactId>
+            <version>1.4.01</version>
+        </dependency>
+
     </dependencies>
     </dependencies>
 
 
     <build>
     <build>

+ 154 - 0
yujing-common/src/main/java/com/cn/tianji/common/CommonUtils.java

@@ -1,11 +1,15 @@
 package com.cn.tianji.common;
 package com.cn.tianji.common;
 
 
+import com.cn.tianji.entity.WellDrilling;
+import com.cn.tianji.entity.WellDrillingSICP;
+import com.cn.tianji.util.CommonUtil;
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.EnumUtils;
 import org.apache.commons.lang3.EnumUtils;
 
 
 import java.lang.reflect.Method;
 import java.lang.reflect.Method;
 import java.math.BigDecimal;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.math.RoundingMode;
+import java.text.ParseException;
 import java.util.*;
 import java.util.*;
 
 
 @Slf4j
 @Slf4j
@@ -148,4 +152,154 @@ public class CommonUtils {
         return false;
         return false;
     }
     }
 
 
+    /**
+     * 经纬数据转黄河数据
+     * @param item
+     * @return
+     */
+    public static WellDrilling sicpToLtd(WellDrillingSICP item) {
+        WellDrilling model = new WellDrilling();
+        model.setJh(item.getJh());
+        model.setTid(item.getTIME());
+        model.setTime(item.getTIME());
+        model.setId(BigDecimal.valueOf(-999.25));
+        try {
+            model.setDepth(CommonUtil.convertStringToBigDecimal(item.getDMEA()));
+            model.setVdepth(CommonUtil.convertStringToBigDecimal(item.getDVER()));
+            model.setLagtime(CommonUtil.convertStringToBigDecimal(item.getTRTT()));
+            model.setLagstrokes(CommonUtil.convertStringToBigDecimal(item.getLSTK()));
+            model.setBitdepth(CommonUtil.convertStringToBigDecimal(item.getDBTM()));
+            model.setKellyin(CommonUtil.convertStringToBigDecimal(item.getKELLYIN()));
+            model.setHkh(CommonUtil.convertStringToBigDecimal(item.getBPOS()));
+            model.setHks(CommonUtil.convertStringToBigDecimal(item.getBSPD()));
+            model.setWoh(CommonUtil.convertStringToBigDecimal(item.getHKLA()));
+            model.setRpm(CommonUtil.convertStringToBigDecimal(item.getRPMA()));
+
+            model.setWob(CommonUtil.convertStringToBigDecimal(item.getWOBA()));
+            BigDecimal tqa= CommonUtil.convertStringToBigDecimal(item.getTQA());
+            if(tqa.compareTo(BigDecimal.valueOf(0.0))>0){
+                model.setTorque(tqa);
+            }else{
+                model.setTorque(CommonUtil.convertStringToBigDecimal(item.getTTQA()));
+            }
+            model.setTdTorque(CommonUtil.convertStringToBigDecimal(item.getTTQA()));
+            model.setSpp(CommonUtil.convertStringToBigDecimal(item.getSPPA()));
+            model.setWhp(CommonUtil.convertStringToBigDecimal(item.getCHKP()));
+            model.setPump1(CommonUtil.convertStringToBigDecimal(item.getSPM1()));
+            model.setPump2(CommonUtil.convertStringToBigDecimal(item.getSPM2()));
+            model.setPump3(CommonUtil.convertStringToBigDecimal(item.getSPM3()));
+            model.setPumptotal(CommonUtil.convertStringToBigDecimal(item.getTSPM()));
+
+            model.setStrokes1(CommonUtil.convertStringToBigDecimal(item.getSTROKES1()));
+            model.setStrokes2(CommonUtil.convertStringToBigDecimal(item.getSTROKES2()));
+            model.setStrokes3(CommonUtil.convertStringToBigDecimal(item.getSTROKES3()));
+            model.setStrokestotal(CommonUtil.convertStringToBigDecimal(item.getSTKC()));
+            model.setVopInst(CommonUtil.convertStringToBigDecimal(item.getVOP_INST()));
+            model.setVopMavg(CommonUtil.convertStringToBigDecimal(item.getVOP_MAVG()));
+            model.setFlowin(CommonUtil.convertStringToBigDecimal(item.getMFIA()));
+            model.setFlowout(CommonUtil.convertStringToBigDecimal(item.getMFOA()));
+            model.setFlowoutpercent(CommonUtil.convertStringToBigDecimal(item.getMFOP()));
+            model.setMwin(CommonUtil.convertStringToBigDecimal(item.getMDIA()));
+
+            model.setMwout(CommonUtil.convertStringToBigDecimal(item.getMDOA()));
+            model.setTempin(CommonUtil.convertStringToBigDecimal(item.getMTIA()));
+            model.setTempout(CommonUtil.convertStringToBigDecimal(item.getMTOA()));
+            model.setCondin(CommonUtil.convertStringToBigDecimal(item.getMCOA()));
+            model.setCondout(CommonUtil.convertStringToBigDecimal(item.getMCIA()));
+            model.setPit1(CommonUtil.convertStringToBigDecimal(item.getTV01()));
+            model.setPit2(CommonUtil.convertStringToBigDecimal(item.getTV02()));
+            model.setPit3(CommonUtil.convertStringToBigDecimal(item.getTV03()));
+            model.setPit4(CommonUtil.convertStringToBigDecimal(item.getTV04()));
+            model.setPit5(CommonUtil.convertStringToBigDecimal(item.getTV05()));
+            model.setPit6(CommonUtil.convertStringToBigDecimal(item.getTV06()));
+            model.setPit7(CommonUtil.convertStringToBigDecimal(item.getTV07()));
+            model.setPit8(CommonUtil.convertStringToBigDecimal(item.getTV08()));
+            model.setPit9(CommonUtil.convertStringToBigDecimal(item.getTV09()));
+            model.setPit10(CommonUtil.convertStringToBigDecimal(item.getTV10()));
+            model.setPit11(CommonUtil.convertStringToBigDecimal(item.getTV11()));
+            model.setPit12(CommonUtil.convertStringToBigDecimal(item.getTV12()));
+            model.setPittotal(CommonUtil.convertStringToBigDecimal(item.getTVT()));
+
+            model.setC1(CommonUtil.convertStringToBigDecimal(item.getMETH()));
+            model.setC2(CommonUtil.convertStringToBigDecimal(item.getETH()));
+            model.setC3(CommonUtil.convertStringToBigDecimal(item.getPRP()));
+            model.setIc4(CommonUtil.convertStringToBigDecimal(item.getIBUT()));
+            model.setNc4(CommonUtil.convertStringToBigDecimal(item.getNBUT()));
+            model.setIc5(CommonUtil.convertStringToBigDecimal(item.getIPEN()));
+            model.setNc5(CommonUtil.convertStringToBigDecimal(item.getNPEN()));
+            model.setEc5(CommonUtil.convertStringToBigDecimal(item.getEPEN()));
+            model.setIc6(CommonUtil.convertStringToBigDecimal(item.getIHEX()));
+            model.setNc6(CommonUtil.convertStringToBigDecimal(item.getNHEX()));
+
+            model.setStat(BigDecimal.valueOf(-999.25));
+            model.setLagdepth(BigDecimal.valueOf(-999.25));
+            model.setBitoff(BigDecimal.valueOf(-999.25));
+            model.setWohCalc(BigDecimal.valueOf(-999.25));
+            model.setFloatWeight(BigDecimal.valueOf(-999.25));
+            model.setRopInst(BigDecimal.valueOf(-999.25));
+            model.setRopMavg(BigDecimal.valueOf(-999.25));
+            model.setEcd(BigDecimal.valueOf(-999.25));
+            model.setTriptandvol(BigDecimal.valueOf(-999.25));
+            model.setActpittotal(BigDecimal.valueOf(-999.25));
+            model.setGainlossvol(BigDecimal.valueOf(-999.25));
+            model.setTg(BigDecimal.valueOf(-999.25));
+            model.setCo2(BigDecimal.valueOf(-999.25));
+            model.setH2(BigDecimal.valueOf(-999.25));
+            model.setH2s1(BigDecimal.valueOf(-999.25));
+            model.setH2s2(BigDecimal.valueOf(-999.25));
+            model.setH2s3(BigDecimal.valueOf(-999.25));
+            model.setH2s4(BigDecimal.valueOf(-999.25));
+            model.setH2s5(BigDecimal.valueOf(-999.25));
+            model.setH2s6(BigDecimal.valueOf(-999.25));
+            model.setH2s7(BigDecimal.valueOf(-999.25));
+            model.setH2s8(BigDecimal.valueOf(-999.25));
+
+            model.setStringlen(BigDecimal.valueOf(-999.25));
+            model.setCurpipe(BigDecimal.valueOf(-999.25));
+            model.setBitno(BigDecimal.valueOf(-999.25));
+            model.setBitsize(BigDecimal.valueOf(-999.25));
+            model.setBittype(BigDecimal.valueOf(-999.25));
+            model.setBitrun(BigDecimal.valueOf(-999.25));
+            model.setBittime(BigDecimal.valueOf(-999.25));
+            model.setBitdrilltime(BigDecimal.valueOf(-999.25));
+            model.setBitcost(BigDecimal.valueOf(-999.25));
+            model.setTotaldays(BigDecimal.valueOf(-999.25));
+
+            model.setStandsdone(BigDecimal.valueOf(-999.25));
+            model.setStandstogo(BigDecimal.valueOf(-999.25));
+            model.setTripoverpull(BigDecimal.valueOf(-999.25));
+            model.setDc(BigDecimal.valueOf(-999.25));
+            model.setSigma(BigDecimal.valueOf(-999.25));
+            model.setFree95(BigDecimal.valueOf(-999.25));
+            model.setFree96(BigDecimal.valueOf(-999.25));
+            model.setFree97(BigDecimal.valueOf(-999.25));
+            model.setFree98(BigDecimal.valueOf(-999.25));
+            model.setFree99(BigDecimal.valueOf(-999.25));
+            model.setFree100(BigDecimal.valueOf(-999.25));
+            model.setFree101(BigDecimal.valueOf(-999.25));
+            model.setFree102(BigDecimal.valueOf(-999.25));
+            model.setFree103(BigDecimal.valueOf(-999.25));
+            model.setFree104(BigDecimal.valueOf(-999.25));
+            model.setFree105(BigDecimal.valueOf(-999.25));
+            model.setFree106(BigDecimal.valueOf(-999.25));
+            model.setFree107(BigDecimal.valueOf(-999.25));
+            model.setFree108(BigDecimal.valueOf(-999.25));
+            model.setFree109(BigDecimal.valueOf(-999.25));
+            model.setFree110(BigDecimal.valueOf(-999.25));
+            model.setFree111(BigDecimal.valueOf(-999.25));
+            model.setFree112(BigDecimal.valueOf(-999.25));
+            model.setFree113(BigDecimal.valueOf(-999.25));
+            model.setFree114(BigDecimal.valueOf(-999.25));
+            model.setFree115(BigDecimal.valueOf(-999.25));
+            model.setFree116(BigDecimal.valueOf(-999.25));
+            model.setFree117(BigDecimal.valueOf(-999.25));
+            model.setFree118(BigDecimal.valueOf(-999.25));
+            model.setFree119(BigDecimal.valueOf(-999.25));
+            model.setFree120(BigDecimal.valueOf(-999.25));
+        } catch (ParseException e) {
+            e.printStackTrace();
+        }
+        return model;
+    }
+
 }
 }

+ 49 - 0
yujing-common/src/main/java/com/cn/tianji/common/Sm4Util.java

@@ -0,0 +1,49 @@
+package com.cn.tianji.common;
+
+
+
+import cn.hutool.core.util.CharsetUtil;
+import cn.hutool.crypto.symmetric.SM4;
+import org.bouncycastle.jce.provider.BouncyCastleProvider;
+
+import java.nio.charset.StandardCharsets;
+import java.security.Security;
+
+public class Sm4Util {
+    static {
+        // 添加BouncyCastle加密提供程序
+        Security.addProvider(new BouncyCastleProvider());
+    }
+    // 32字节密钥(示例:需替换为实际密钥)
+    private static final byte[] SECRET_KEY = "TJ#ZJFUZNYJ@2025".getBytes(StandardCharsets.UTF_8);
+    // 添加配置前缀标识
+    public static final String ENC_PREFIX = "sm4:";
+
+    private static final SM4 sm4 = new SM4(SECRET_KEY);
+
+    public static String encrypt(String plaintext) {
+        return ENC_PREFIX + sm4.encryptHex(plaintext, CharsetUtil.CHARSET_UTF_8);
+    }
+
+    public static String decrypt(String ciphertext) {
+        if (ciphertext.startsWith(ENC_PREFIX)) {
+            return sm4.decryptStr(ciphertext.substring(ENC_PREFIX.length()));
+        }
+        return ciphertext; // 返回原始值(未加密情况)
+    }
+
+    public static void main(String[] args) {
+        String jtznyj = encrypt("jtznyj#2021");
+        String jtgcyth2018 = encrypt("Sljtyw_2018");
+        String zjfzqk = encrypt("zjfzqk@2019");
+        String zjycs = encrypt("Zjy_2019");
+        String wlwmro = encrypt("Wlw_2020");
+        String tj_zjgc = encrypt("ZjgcTJ#zjgc@2024");
+        System.out.println("jtznyj:"+jtznyj);
+        System.out.println("jtgcyth2018:"+jtgcyth2018);
+        System.out.println("zjfzqk:"+zjfzqk);
+        System.out.println("zjycs:"+zjycs);
+        System.out.println("wlwmro:"+wlwmro);
+        System.out.println("tj_zjgc:"+tj_zjgc);
+    }
+}

+ 6 - 2
yujing-common/src/main/java/com/cn/tianji/entity/WellDrillingSICP.java

@@ -333,7 +333,7 @@ public class WellDrillingSICP implements Serializable {
     /**
     /**
      *硫化氢5(平均)
      *硫化氢5(平均)
      */
      */
-    @JSONField(name = "hs4a")
+    @JSONField(name = "hs5a")
     private String HS5A;
     private String HS5A;
 
 
     /**
     /**
@@ -396,6 +396,10 @@ public class WellDrillingSICP implements Serializable {
     @JSONField(name = "sigma")
     @JSONField(name = "sigma")
     private String SIGMA;
     private String SIGMA;
 
 
+
+
+
+    /***/
     /**
     /**
      *方入
      *方入
      */
      */
@@ -523,7 +527,7 @@ public class WellDrillingSICP implements Serializable {
     private String LHQBFHLLINE;
     private String LHQBFHLLINE;
 
 
     /**
     /**
-     *井号
+     *DCSN
      */
      */
     @JSONField(name = "dcsn")
     @JSONField(name = "dcsn")
     private String DCSN;
     private String DCSN;

+ 71 - 0
yujing-common/src/main/java/com/cn/tianji/entity/YjComprehensiveLog.java

@@ -0,0 +1,71 @@
+package com.cn.tianji.entity;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 综合异常日志信息;
+ *
+ * @author : http://www.chiner.pro
+ * @date : 2025-4-9
+ */
+@TableName("yj_comprehensive_log")
+@Data
+public class YjComprehensiveLog implements Serializable{
+    /**
+     * 主键
+     */
+    @TableId
+    private String id;
+    /**
+     * 井号
+     */
+    private String jh;
+    /**
+     * 预警时间
+     */
+    private String warnTime;
+    /**
+     * 预警类别:卡钻、溢流、井漏
+     */
+    private String warnType;
+    /**
+     * 预警内容
+     */
+    private String warnContent;
+    /**
+     * 预警级别
+     */
+    private BigDecimal warnLevel;
+    /**
+     * 预警段工况
+     */
+    private String workingCondition;
+
+    /**
+     * 预警段动作
+     */
+    private String motion;
+
+    /**
+     * 井深
+     */
+    private BigDecimal depth;
+    /**
+     * 起点时间
+     */
+    private Date startTime;
+    /**
+     * 结束时间
+     */
+    private Date endTime;
+    /**
+     * 创建时间
+     */
+    private Date createTime;
+}

+ 71 - 0
yujing-common/src/main/java/com/cn/tianji/entity/YjComprehensiveRealLog.java

@@ -0,0 +1,71 @@
+package com.cn.tianji.entity;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 综合异常日志实时信息;
+ *
+ * @author : http://www.chiner.pro
+ * @date : 2025-4-9
+ */
+@TableName("yj_comprehensive_real_log")
+@Data
+public class YjComprehensiveRealLog implements Serializable{
+    /**
+     * 主键
+     */
+    @TableId
+    private String id;
+    /**
+     * 井号
+     */
+    private String jh;
+    /**
+     * 预警时间
+     */
+    private String warnTime;
+    /**
+     * 预警类别:卡钻、溢流、井漏
+     */
+    private String warnType;
+    /**
+     * 预警内容
+     */
+    private String warnContent;
+    /**
+     * 预警级别
+     */
+    private Double warnLevel;
+    /**
+     * 预警点工况
+     */
+    private String workingCondition;
+
+    /**
+     * 井深
+     */
+    private String motion;
+
+    /**
+     * 预警段工况
+     */
+    private BigDecimal depth;
+    /**
+     * 起点时间
+     */
+    private Date startTime;
+    /**
+     * 结束时间
+     */
+    private Date endTime;
+    /**
+     * 创建时间
+     */
+    private Date createTime;
+}

+ 42 - 0
yujing-common/src/main/java/com/cn/tianji/entity/YjComprehensiveWarnIds.java

@@ -0,0 +1,42 @@
+package com.cn.tianji.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.TableId;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import lombok.Data;
+
+/**
+ * 综合复杂预警主键;
+ *
+ * @author : http://www.chiner.pro
+ * @date : 2025-4-9
+ */
+@TableName("yj_comprehensive_warn_ids")
+@Data
+public class YjComprehensiveWarnIds implements Serializable {
+    /**
+     * 主键
+     */
+    @TableId
+    private String id;
+    /**
+     * 复杂主键
+     */
+    private String comprehensiveId;
+    /**
+     * 预警数据主键
+     */
+    private String warnId;
+    /**
+     * 预警类别
+     */
+    private String warnType;
+    /**
+     * 创建时间
+     */
+    private Date createTime;
+
+}

+ 1 - 1
yujing-common/src/main/java/com/cn/tianji/mapper/WellDrillingMapper.java

@@ -15,7 +15,7 @@ import java.util.List;
 @Mapper
 @Mapper
 public interface WellDrillingMapper extends BaseMapper<WellDrilling> {
 public interface WellDrillingMapper extends BaseMapper<WellDrilling> {
 
 
-    void createTable(@Param("tableName") String paramString, @Param("timeStamp") long paramLong);
+    void createTable(@Param("tableName") String tableName, @Param("timeStamp") long paramLong);
 
 
     @Select({"select table_name from USER_TABLES"})
     @Select({"select table_name from USER_TABLES"})
     List<String> tableNames();
     List<String> tableNames();

+ 13 - 0
yujing-common/src/main/java/com/cn/tianji/mapper/YjComprehensiveLogMapper.java

@@ -0,0 +1,13 @@
+package com.cn.tianji.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cn.tianji.entity.YjComprehensiveLog;
+import org.apache.ibatis.annotations.Mapper;
+/**
+ * 综合异常日志信息;(yj_comprehensive_log)表数据库访问层
+ * @author : http://www.chiner.pro
+ * @date : 2025-4-9
+ */
+@Mapper
+public interface YjComprehensiveLogMapper  extends BaseMapper<YjComprehensiveLog> {
+}

+ 14 - 0
yujing-common/src/main/java/com/cn/tianji/mapper/YjComprehensiveRealLogMapper.java

@@ -0,0 +1,14 @@
+package com.cn.tianji.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cn.tianji.entity.YjComprehensiveRealLog;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 综合异常日志信息;(yj_comprehensive_log)表数据库访问层
+ * @author : http://www.chiner.pro
+ * @date : 2025-4-9
+ */
+@Mapper
+public interface YjComprehensiveRealLogMapper extends BaseMapper<YjComprehensiveRealLog> {
+}

+ 14 - 0
yujing-common/src/main/java/com/cn/tianji/mapper/YjComprehensiveWarnIdsMapper.java

@@ -0,0 +1,14 @@
+package com.cn.tianji.mapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cn.tianji.entity.YjComprehensiveWarnIds;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * 综合复杂预警主键;(yj_comprehensive_warn_ids)表数据库访问层
+ * @author : http://www.chiner.pro
+ * @date : 2025-4-9
+ */
+@Mapper
+public interface YjComprehensiveWarnIdsMapper  extends BaseMapper<YjComprehensiveWarnIds>{
+}

+ 5 - 0
yujing-common/src/main/java/com/cn/tianji/service/ComprehensiveWarnService.java

@@ -0,0 +1,5 @@
+package com.cn.tianji.service;
+
+public interface ComprehensiveWarnService {
+    void comprehensiveWarnJhList();
+}

+ 2 - 0
yujing-common/src/main/java/com/cn/tianji/service/HookLoadWarnLogService.java

@@ -67,4 +67,6 @@ public interface HookLoadWarnLogService extends IService<HookLoadWarnLog> {
                                                   BigDecimal mobilDrillingToolsMaxWoh,BigDecimal mobilDrillingToolsMinWoh,
                                                   BigDecimal mobilDrillingToolsMaxWoh,BigDecimal mobilDrillingToolsMinWoh,
                                                   String mobilDrillingToolsEndTime,BigDecimal hkhStart,BigDecimal hkhEnd,
                                                   String mobilDrillingToolsEndTime,BigDecimal hkhStart,BigDecimal hkhEnd,
                                                   BigDecimal wohHkhRes,BigDecimal warnValue);
                                                   BigDecimal wohHkhRes,BigDecimal warnValue);
+
+    BigDecimal getCountByJh(String jh, String startTime, String endTime);
 }
 }

+ 2 - 0
yujing-common/src/main/java/com/cn/tianji/service/PumpingPressureWarnLogService.java

@@ -55,4 +55,6 @@ public interface PumpingPressureWarnLogService  extends IService<PumpingPressure
     PumpingPressureWarnLog createPumpingPressureWarnLog(String jh, String workingCondition , String motion, Date warnTime, BigDecimal warnSpp,BigDecimal warnTotalPump,
     PumpingPressureWarnLog createPumpingPressureWarnLog(String jh, String workingCondition , String motion, Date warnTime, BigDecimal warnSpp,BigDecimal warnTotalPump,
                                                         Date referenceTime,BigDecimal referenceSpp,BigDecimal referenceTotalPump,BigDecimal totalPumpSub,BigDecimal sppSub,
                                                         Date referenceTime,BigDecimal referenceSpp,BigDecimal referenceTotalPump,BigDecimal totalPumpSub,BigDecimal sppSub,
                                                         BigDecimal sppWarnValue,BigDecimal pumpWarnValue);
                                                         BigDecimal sppWarnValue,BigDecimal pumpWarnValue);
+
+    BigDecimal getCountByJh(String jh, String startTime, String endTime);
 }
 }

+ 2 - 0
yujing-common/src/main/java/com/cn/tianji/service/TorqueWarnLogService.java

@@ -67,4 +67,6 @@ public interface TorqueWarnLogService extends IService<TorqueWarnLog> {
      * @param model 扭矩实体类数据
      * @param model 扭矩实体类数据
      */
      */
     void saveTorqueWarnLog(TorqueWarnLog model);
     void saveTorqueWarnLog(TorqueWarnLog model);
+
+    BigDecimal getCountByJh(String jh, String startTime, String endTime);
 }
 }

+ 2 - 0
yujing-common/src/main/java/com/cn/tianji/service/TotalPoolVolumeWarnLogService.java

@@ -59,4 +59,6 @@ public interface TotalPoolVolumeWarnLogService extends IService<TotalPoolVolumeW
     TotalPoolVolumeWarnLog createTotalPoolVolumeWarnLog(String jh, String workingCondition , String motion, String warnType, Date warnTime, BigDecimal warnPittotal, BigDecimal referenceValue, Date referenceStartTime,
     TotalPoolVolumeWarnLog createTotalPoolVolumeWarnLog(String jh, String workingCondition , String motion, String warnType, Date warnTime, BigDecimal warnPittotal, BigDecimal referenceValue, Date referenceStartTime,
                                                         Date referenceEndTime, BigDecimal rateStartPittotal, Date rateStartTime, Date rateEndTime, BigDecimal pittotalSub, BigDecimal ratePittotalSub, BigDecimal referenceWarnValue,
                                                         Date referenceEndTime, BigDecimal rateStartPittotal, Date rateStartTime, Date rateEndTime, BigDecimal pittotalSub, BigDecimal ratePittotalSub, BigDecimal referenceWarnValue,
                                                         BigDecimal rateWarnValue, String sizeStr);
                                                         BigDecimal rateWarnValue, String sizeStr);
+
+    BigDecimal getCountByJh(String jh,String warnType, String startTime, String endTime);
 }
 }

+ 3 - 0
yujing-common/src/main/java/com/cn/tianji/service/WellDrillingService.java

@@ -1,5 +1,6 @@
 package com.cn.tianji.service;
 package com.cn.tianji.service;
 
 
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.cn.tianji.entity.WellDrilling;
 import com.cn.tianji.entity.WellDrilling;
@@ -25,5 +26,7 @@ public interface WellDrillingService extends IService<WellDrilling> {
 
 
     List<WellDrilling> sicpToLtdData(List<WellDrillingSICP> sicpList);
     List<WellDrilling> sicpToLtdData(List<WellDrillingSICP> sicpList);
 
 
+    JSONObject getWorkingConditionByJhAndTime(String jh, String startTime, String endTime);
+
     WellDrilling sicpToLtd(WellDrillingSICP item);
     WellDrilling sicpToLtd(WellDrillingSICP item);
 }
 }

+ 7 - 0
yujing-common/src/main/java/com/cn/tianji/service/YjComprehensiveLogService.java

@@ -0,0 +1,7 @@
+package com.cn.tianji.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.cn.tianji.entity.YjComprehensiveLog;
+
+public interface YjComprehensiveLogService extends IService<YjComprehensiveLog> {
+}

+ 10 - 0
yujing-common/src/main/java/com/cn/tianji/service/YjComprehensiveRealLogService.java

@@ -0,0 +1,10 @@
+package com.cn.tianji.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.cn.tianji.entity.YjComprehensiveRealLog;
+
+import java.util.List;
+
+public interface YjComprehensiveRealLogService extends IService<YjComprehensiveRealLog> {
+    List<YjComprehensiveRealLog> getRealTimeLogByJh(String jh);
+}

+ 12 - 0
yujing-common/src/main/java/com/cn/tianji/service/YjComprehensiveWarnIdsService.java

@@ -0,0 +1,12 @@
+package com.cn.tianji.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.cn.tianji.entity.YjComprehensiveWarnIds;
+
+/**
+ * 综合复杂预警主键;(yj_comprehensive_warn_ids)表服务接口
+ * @author : http://www.chiner.pro
+ * @date : 2025-4-9
+ */
+public interface YjComprehensiveWarnIdsService extends IService<YjComprehensiveWarnIds> {
+}

+ 3 - 0
yujing-common/src/main/java/com/cn/tianji/service/YjRealTimeLogService.java

@@ -9,4 +9,7 @@ public interface YjRealTimeLogService extends IService<YjRealTimeLog> {
     void saveRealTimeLog(List<String> jhLit);
     void saveRealTimeLog(List<String> jhLit);
 
 
     void updateBatchJhStatus();
     void updateBatchJhStatus();
+
+    List<String> getRealTimeLogJhList();
+
 }
 }

+ 11 - 1
yujing-common/src/main/java/com/cn/tianji/service/impl/HookLoadWarnLogServiceImpl.java

@@ -1,7 +1,7 @@
 package com.cn.tianji.service.impl;
 package com.cn.tianji.service.impl;
 
 
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.core.util.StrUtil;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper;
 import com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.cn.tianji.entity.HookLoadWarnLog;
 import com.cn.tianji.entity.HookLoadWarnLog;
@@ -239,4 +239,14 @@ public class HookLoadWarnLogServiceImpl  extends ServiceImpl<HookLoadWarnLogMapp
         model.setCreateTime(new Date());
         model.setCreateTime(new Date());
         return model;
         return model;
     }
     }
+
+    @Override
+    public BigDecimal getCountByJh(String jh, String startTime, String endTime){
+        QueryWrapper<HookLoadWarnLog> wrapper=new QueryWrapper<>();
+        wrapper.lambda().eq(HookLoadWarnLog::getJh,jh);
+        wrapper.apply("WARN_TIME >= to_date({0},'yyyy-mm-dd hh24:mi:ss')", startTime);
+        wrapper.apply("WARN_TIME<= to_date({0},'yyyy-mm-dd hh24:mi:ss')", endTime);
+        long count = this.count(wrapper);
+        return BigDecimal.valueOf(count);
+    }
 }
 }

+ 11 - 0
yujing-common/src/main/java/com/cn/tianji/service/impl/PumpingPressureWarnLogServiceImpl.java

@@ -1,6 +1,7 @@
 package com.cn.tianji.service.impl;
 package com.cn.tianji.service.impl;
 
 
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper;
 import com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.cn.tianji.entity.PumpingPressureWarnLog;
 import com.cn.tianji.entity.PumpingPressureWarnLog;
@@ -117,4 +118,14 @@ public class PumpingPressureWarnLogServiceImpl  extends ServiceImpl<PumpingPress
         model.setCreateTime(new Date());
         model.setCreateTime(new Date());
         return model;
         return model;
     }
     }
+
+    @Override
+    public BigDecimal getCountByJh(String jh, String startTime, String endTime){
+        QueryWrapper<PumpingPressureWarnLog> wrapper=new QueryWrapper<>();
+        wrapper.lambda().eq(PumpingPressureWarnLog::getJh,jh);
+        wrapper.apply("WARN_TIME >= to_date({0},'yyyy-mm-dd hh24:mi:ss')", startTime);
+        wrapper.apply("WARN_TIME<= to_date({0},'yyyy-mm-dd hh24:mi:ss')", endTime);
+        long count = this.count(wrapper);
+        return BigDecimal.valueOf(count);
+    }
 }
 }

+ 11 - 1
yujing-common/src/main/java/com/cn/tianji/service/impl/TorqueWarnLogServiceImpl.java

@@ -1,13 +1,13 @@
 package com.cn.tianji.service.impl;
 package com.cn.tianji.service.impl;
 
 
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper;
 import com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.cn.tianji.entity.TorqueWarnLog;
 import com.cn.tianji.entity.TorqueWarnLog;
 import com.cn.tianji.mapper.TorqueWarnLogMapper;
 import com.cn.tianji.mapper.TorqueWarnLogMapper;
 import com.cn.tianji.service.TorqueWarnLogService;
 import com.cn.tianji.service.TorqueWarnLogService;
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 
 
 import javax.annotation.Resource;
 import javax.annotation.Resource;
@@ -168,4 +168,14 @@ public class TorqueWarnLogServiceImpl  extends ServiceImpl<TorqueWarnLogMapper,
         model.setWarnDes(warnDes);
         model.setWarnDes(warnDes);
         insert(model);
         insert(model);
     }
     }
+
+    @Override
+    public BigDecimal getCountByJh(String jh, String startTime, String endTime){
+        QueryWrapper<TorqueWarnLog> wrapper=new QueryWrapper<>();
+        wrapper.lambda().eq(TorqueWarnLog::getJh,jh);
+        wrapper.apply("WARN_START_TIME >= to_date({0},'yyyy-mm-dd hh24:mi:ss')", startTime);
+        wrapper.apply("WARN_START_TIME<= to_date({0},'yyyy-mm-dd hh24:mi:ss')", endTime);
+        long count = this.count(wrapper);
+        return BigDecimal.valueOf(count);
+    }
 }
 }

+ 12 - 1
yujing-common/src/main/java/com/cn/tianji/service/impl/TotalPoolVolumeWarnLogServiceImpl.java

@@ -1,6 +1,7 @@
 package com.cn.tianji.service.impl;
 package com.cn.tianji.service.impl;
 
 
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper;
 import com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.cn.tianji.entity.TotalPoolVolumeWarnLog;
 import com.cn.tianji.entity.TotalPoolVolumeWarnLog;
@@ -10,7 +11,6 @@ import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 
 
-import javax.xml.crypto.Data;
 import java.math.BigDecimal;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.math.RoundingMode;
 import java.text.SimpleDateFormat;
 import java.text.SimpleDateFormat;
@@ -133,4 +133,15 @@ public class TotalPoolVolumeWarnLogServiceImpl  extends ServiceImpl<TotalPoolVol
         model.setCreateTime(new Date());
         model.setCreateTime(new Date());
         return model;
         return model;
     }
     }
+
+    @Override
+    public BigDecimal getCountByJh(String jh,String warnType, String startTime, String endTime){
+        QueryWrapper<TotalPoolVolumeWarnLog> wrapper=new QueryWrapper<>();
+        wrapper.lambda().eq(TotalPoolVolumeWarnLog::getJh,jh);
+        wrapper.lambda().eq(TotalPoolVolumeWarnLog::getTotalWarnType,warnType);
+        wrapper.apply("WARN_TIME >= to_date({0},'yyyy-mm-dd hh24:mi:ss')", startTime);
+        wrapper.apply("WARN_TIME<= to_date({0},'yyyy-mm-dd hh24:mi:ss')", endTime);
+        long count = this.count(wrapper);
+        return BigDecimal.valueOf(count);
+    }
 }
 }

+ 45 - 3
yujing-common/src/main/java/com/cn/tianji/service/impl/WellDrillingServiceImpl.java

@@ -1,5 +1,6 @@
 package com.cn.tianji.service.impl;
 package com.cn.tianji.service.impl;
 
 
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.cn.tianji.entity.WellDrilling;
 import com.cn.tianji.entity.WellDrilling;
@@ -40,7 +41,7 @@ public class WellDrillingServiceImpl extends ServiceImpl<WellDrillingMapper, Wel
     public String getTableCode(String AJH) {
     public String getTableCode(String AJH) {
         //井号预处理
         //井号预处理
         String s = AJH.replace('-', '_').toUpperCase();
         String s = AJH.replace('-', '_').toUpperCase();
-        return "\"LTD_" + s ;
+        return "LTD_" + s ;
     }
     }
 
 
     @Override
     @Override
@@ -64,8 +65,8 @@ public class WellDrillingServiceImpl extends ServiceImpl<WellDrillingMapper, Wel
     };
     };
 
 
     @Override
     @Override
-    public void createTable(String paramString, long paramLong){
-       mapper.createTable(paramString,paramLong);
+    public void createTable(String tableName, long paramLong){
+       mapper.createTable(tableName,paramLong);
     };
     };
 
 
 
 
@@ -80,6 +81,47 @@ public class WellDrillingServiceImpl extends ServiceImpl<WellDrillingMapper, Wel
         return saveList ;
         return saveList ;
     }
     }
 
 
+    /**
+     * 根据井号、时间获取整体工况
+     * @param jh 井号
+     * @param startTime 开始时间
+     * @param endTime 结束时间
+     */
+    @Override
+    public JSONObject getWorkingConditionByJhAndTime(String jh, String startTime, String endTime){
+        JSONObject res=new JSONObject();
+        //井号转表明
+        String tableCode = getTableCode(jh);
+        QueryWrapper<WellDrilling> wrapper=new QueryWrapper<>();
+        wrapper.apply("TO_DATE(SUBSTR(TIME, 1, 19), 'yyyy-MM-dd HH24:mi:ss') > to_date({0},'yyyy-mm-dd hh24:mi:ss')", startTime);
+        wrapper.apply("TO_DATE(SUBSTR(TIME, 1, 19), 'yyyy-MM-dd HH24:mi:ss') <= to_date({0},'yyyy-mm-dd hh24:mi:ss')", endTime);
+        List<WellDrilling> list = this.selectListOrcale(tableCode, wrapper);
+        if(!list.isEmpty()){
+            // 统计工况数量
+            long qxzCount = list.stream().filter(w -> "起下钻".equals(w.getOperatingMode())).count();
+            long zjCount = list.stream().filter(w -> "钻进".equals(w.getOperatingMode())).count();
+
+            // 处理数量相同的情况
+            if(qxzCount == zjCount && !list.isEmpty()){
+                int halfIndex = (int) Math.ceil(list.size() * 0.5);
+                List<WellDrilling> subList = list.subList(halfIndex, list.size());
+                qxzCount = subList.stream().filter(w -> "起下钻".equals(w.getOperatingMode())).count();
+                zjCount = subList.stream().filter(w -> "钻进".equals(w.getOperatingMode())).count();
+            }
+            String motion = list.get(list.size() - 1).getMotion();
+            BigDecimal depth = list.get(list.size() - 1).getDepth();
+           String workingCondition= qxzCount > zjCount ? "起下钻" : "钻进";
+            res.put("motion",motion);
+            res.put("depth",depth);
+            res.put("workingCondition",workingCondition);
+            // 判断最终工况
+            return res;
+        }else{
+            res.put("workingCondition","未知");
+        }
+        return res; // 默认返回未知工况
+    }
+
     @Override
     @Override
     public WellDrilling sicpToLtd(WellDrillingSICP item) {
     public WellDrilling sicpToLtd(WellDrillingSICP item) {
         WellDrilling model = new WellDrilling();
         WellDrilling model = new WellDrilling();

+ 16 - 0
yujing-common/src/main/java/com/cn/tianji/service/impl/YjComprehensiveLogServiceImpl.java

@@ -0,0 +1,16 @@
+package com.cn.tianji.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.cn.tianji.entity.YjComprehensiveLog;
+import com.cn.tianji.mapper.YjComprehensiveLogMapper;
+import com.cn.tianji.service.YjComprehensiveLogService;
+import org.springframework.stereotype.Service;
+
+/**
+ * 综合异常日志信息;(yj_comprehensive_log)表服务实现类
+ * @author : http://www.chiner.pro
+ * @date : 2025-4-9
+ */
+@Service
+public class YjComprehensiveLogServiceImpl extends ServiceImpl<YjComprehensiveLogMapper, YjComprehensiveLog> implements YjComprehensiveLogService {
+}

+ 28 - 0
yujing-common/src/main/java/com/cn/tianji/service/impl/YjComprehensiveRealLogServiceImpl.java

@@ -0,0 +1,28 @@
+package com.cn.tianji.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.cn.tianji.entity.YjComprehensiveRealLog;
+import com.cn.tianji.mapper.YjComprehensiveRealLogMapper;
+import com.cn.tianji.service.YjComprehensiveRealLogService;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 综合异常日志信息;(yj_comprehensive_log)表服务实现类
+ * @author : http://www.chiner.pro
+ * @date : 2025-4-9
+ */
+@Service
+public class YjComprehensiveRealLogServiceImpl extends ServiceImpl<YjComprehensiveRealLogMapper, YjComprehensiveRealLog> implements YjComprehensiveRealLogService {
+
+
+    @Override
+    public List<YjComprehensiveRealLog> getRealTimeLogByJh(String jh) {
+        QueryWrapper<YjComprehensiveRealLog> wrapper = new QueryWrapper<>();
+        wrapper.lambda().eq(YjComprehensiveRealLog::getJh,jh);
+        List<YjComprehensiveRealLog> list = this.list(wrapper);
+        return list;
+    }
+}

+ 16 - 0
yujing-common/src/main/java/com/cn/tianji/service/impl/YjComprehensiveWarnIdsServiceImpl.java

@@ -0,0 +1,16 @@
+package com.cn.tianji.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.cn.tianji.entity.YjComprehensiveWarnIds;
+import com.cn.tianji.mapper.YjComprehensiveWarnIdsMapper;
+import com.cn.tianji.service.YjComprehensiveWarnIdsService;
+import org.springframework.stereotype.Service;
+
+/**
+ * 综合复杂预警主键;(yj_comprehensive_warn_ids)表服务实现类
+ * @author : http://www.chiner.pro
+ * @date : 2025-4-9
+ */
+@Service
+public class YjComprehensiveWarnIdsServiceImpl extends ServiceImpl<YjComprehensiveWarnIdsMapper, YjComprehensiveWarnIds> implements YjComprehensiveWarnIdsService {
+}

+ 12 - 4
yujing-common/src/main/java/com/cn/tianji/service/impl/YjRealTimeLogServiceImpl.java

@@ -1,24 +1,22 @@
 package com.cn.tianji.service.impl;
 package com.cn.tianji.service.impl;
 
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.cn.tianji.common.StringUtils;
 import com.cn.tianji.common.StringUtils;
 import com.cn.tianji.entity.YjRealTimeLog;
 import com.cn.tianji.entity.YjRealTimeLog;
 import com.cn.tianji.mapper.YjRealTimeLogMapper;
 import com.cn.tianji.mapper.YjRealTimeLogMapper;
 import com.cn.tianji.service.WellDrillingService;
 import com.cn.tianji.service.WellDrillingService;
-import com.cn.tianji.service.YjDrillingDataSupplementationLogService;
 import com.cn.tianji.service.YjRealTimeLogService;
 import com.cn.tianji.service.YjRealTimeLogService;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 
 
 import javax.annotation.Resource;
 import javax.annotation.Resource;
 import java.text.ParseException;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.text.SimpleDateFormat;
-import java.time.Duration;
-import java.time.LocalDate;
-import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
 import java.time.format.DateTimeFormatter;
 import java.util.ArrayList;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.Date;
 import java.util.List;
 import java.util.List;
+import java.util.stream.Collectors;
 
 
 @Service
 @Service
 public class YjRealTimeLogServiceImpl extends ServiceImpl<YjRealTimeLogMapper, YjRealTimeLog> implements YjRealTimeLogService {
 public class YjRealTimeLogServiceImpl extends ServiceImpl<YjRealTimeLogMapper, YjRealTimeLog> implements YjRealTimeLogService {
@@ -114,4 +112,14 @@ public class YjRealTimeLogServiceImpl extends ServiceImpl<YjRealTimeLogMapper, Y
             this.updateBatchById(list);
             this.updateBatchById(list);
         }
         }
     }
     }
+
+    @Override
+    public List<String> getRealTimeLogJhList() {
+        QueryWrapper<YjRealTimeLog> wrapper = new QueryWrapper<>();
+        wrapper.lambda().eq(YjRealTimeLog::getStatus,"在线");
+        List<YjRealTimeLog> list = this.list(wrapper);
+        List<String> JhList = list.stream().map(YjRealTimeLog::getJh).collect(Collectors.toList());
+        return JhList;
+    }
+
 }
 }

+ 6 - 0
yujing-common/src/main/resources/mapper/YjComprehensiveLogMapper.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="com.cn.tianji.mapper.YjComprehensiveLogMapper">
+
+</mapper>

+ 6 - 0
yujing-common/src/main/resources/mapper/YjComprehensiveRealLogMapper.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="com.cn.tianji.mapper.YjComprehensiveRealLogMapper">
+
+</mapper>

+ 6 - 0
yujing-common/src/main/resources/mapper/YjComprehensiveWarnIdsMapper.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="com.cn.tianji.mapper.YjComprehensiveWarnIdsMapper">
+
+</mapper>

+ 7 - 1
yujing-condition-identification/src/main/java/com/cn/tianji/ConditionIdentificationApplication.java

@@ -1,16 +1,22 @@
 package com.cn.tianji;
 package com.cn.tianji;
 
 
 
 
+import com.cn.tianji.config.DataSourceDecryptConfig;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.ConfigurableApplicationContext;
+import org.springframework.scheduling.annotation.EnableScheduling;
 
 
 /**
 /**
  * @author Zhao RenJi
  * @author Zhao RenJi
  */
  */
 @SpringBootApplication
 @SpringBootApplication
+@EnableScheduling
 public class ConditionIdentificationApplication {
 public class ConditionIdentificationApplication {
     public static void main(String[] args) {
     public static void main(String[] args) {
-        SpringApplication.run(ConditionIdentificationApplication.class, args);
+        ConfigurableApplicationContext context =SpringApplication.run(ConditionIdentificationApplication.class, args);
+        DataSourceDecryptConfig config = context.getBean(DataSourceDecryptConfig.class);
+        System.out.println("DataSourceDecryptConfig 加载状态: " + (config != null ? "成功" : "失败"));
         System.out.println("ConditionIdentification启动");
         System.out.println("ConditionIdentification启动");
     }
     }
 }
 }

+ 37 - 0
yujing-condition-identification/src/main/java/com/cn/tianji/config/DataSourceDecryptConfig.java

@@ -0,0 +1,37 @@
+package com.cn.tianji.config;
+
+import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DataSourceProperty;
+import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceProperties;
+import com.cn.tianji.common.Sm4Util;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
+import org.springframework.context.annotation.Configuration;
+
+import javax.annotation.PostConstruct;
+import javax.annotation.Resource;
+
+@Configuration
+@ConditionalOnClass(DynamicDataSourceProperties.class)
+@Slf4j
+public class DataSourceDecryptConfig {
+    @Resource
+    private DynamicDataSourceProperties properties;
+
+    @PostConstruct
+    public void decryptDataSourcePasswords() {
+        log.warn("开始解密数据源密码...");
+        // 解密主数据源密码
+        decryptPassword(properties.getDatasource().get(properties.getPrimary()));
+
+        // 解密所有从数据源密码
+        properties.getDatasource().values().forEach(this::decryptPassword);
+        log.warn("解密数据源密码完成...");
+    }
+
+    private void decryptPassword(DataSourceProperty property) {
+        String password = property.getPassword();
+        if (password != null && password.startsWith(Sm4Util.ENC_PREFIX)) {
+            property.setPassword(Sm4Util.decrypt(password));
+        }
+    }
+}

+ 46 - 0
yujing-condition-identification/src/main/java/com/cn/tianji/controller/SicpToLtdController.java

@@ -0,0 +1,46 @@
+package com.cn.tianji.controller;
+
+import com.cn.tianji.common.Result;
+import com.cn.tianji.service.SicpToLtdImportService;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+@RestController
+@RequestMapping("/sicpToLtd")
+public class SicpToLtdController {
+
+    @Resource
+    private SicpToLtdImportService sicpToLtdImportService;
+
+
+    /**
+     * 创建井表
+     *
+     * @param creatTableJh
+     * @return
+     */
+    @RequestMapping(value = "/createTable", method = RequestMethod.POST)
+    public Result<?> createTable(@RequestParam("creatTableJh")String creatTableJh) {
+        sicpToLtdImportService.createTable(creatTableJh);
+        return  Result.OK();
+    }
+
+    /**
+     * 通过excel导入数据
+     *
+     * @param request
+     * @param response
+     * @return
+     */
+    @RequestMapping(value = "/importData", method = RequestMethod.POST)
+    public Result<?> importData(HttpServletRequest request, HttpServletResponse response) {
+        sicpToLtdImportService.importData(request, response);
+        return  Result.OK();
+    }
+}

+ 6 - 0
yujing-condition-identification/src/main/java/com/cn/tianji/controller/WorkingConditionCalculationController.java

@@ -31,4 +31,10 @@ public class WorkingConditionCalculationController {
         return Result.OK();
         return Result.OK();
     }
     }
 
 
+    @GetMapping("/comprehensiveWarnJhList")
+    public Result<?> comprehensiveWarnJhList(){
+        workingConditionCalculationService.comprehensiveWarnJhList();
+        return Result.OK();
+    }
+
 }
 }

+ 897 - 0
yujing-condition-identification/src/main/java/com/cn/tianji/param/SicpImportParam.java

@@ -0,0 +1,897 @@
+package com.cn.tianji.param;
+
+import cn.afterturn.easypoi.excel.annotation.Excel;
+import com.alibaba.fastjson.annotation.JSONField;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import java.util.Date;
+
+@Data
+public class SicpImportParam  implements Serializable {
+
+    /**
+     *井号
+     */
+    @JSONField(name = "jh")
+    @Excel(name = "井号", orderNum = "0")
+    private String jh;
+
+    /**
+     *施工单位
+     */
+    @JSONField(name = "sgdw")
+    @Excel(name = "施工单位", orderNum = "1")
+    private String sgdw;
+
+    /**
+     *工况
+     */
+    @JSONField(name = "gk")
+    @Excel(name = "工况", orderNum = "2")
+    private String gk;
+
+    /**
+     *井标识
+     */
+    @JSONField(name = "jid")
+    @Excel(name = "井标识", orderNum = "3")
+    private String jid;
+
+    /**
+     *井眼标识
+     */
+    @JSONField(name = "jyid")
+    @Excel(name = "井眼标识", orderNum = "4")
+    private String jyid;
+
+    /**
+     *作业标识
+     */
+    @JSONField(name = "zyid")
+    @Excel(name = "作业标识", orderNum = "5")
+    private String zyid;
+
+    /**
+     *记录标识
+     */
+    @JSONField(name = "rid")
+    @Excel(name = "记录标识", orderNum = "6")
+    private String rid;
+
+    /**
+     *序列标识
+     */
+    @JSONField(name = "sqid")
+    @Excel(name = "序列标识", orderNum = "7")
+    private String sqid;
+
+    /**
+     *时间
+     */
+    @JSONField(name = "time")
+    @Excel(name = "时间", orderNum = "8")
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime time;
+
+    /**
+     *活动码
+     */
+    @JSONField(name = "actc")
+    @Excel(name = "活动码", orderNum = "9")
+    private String actc;
+
+    /**
+     *钻头深度(测量)
+     */
+    @JSONField(name = "dbtm")
+    @Excel(name = "钻头深度(测量)", orderNum = "10")
+    private String dbtm;
+
+    /**
+     *钻头深度(垂直)
+     */
+    @JSONField(name = "dbtv")
+    @Excel(name = "钻头深度(垂直)", orderNum = "11")
+    private String dbtv;
+
+    /**
+     *井眼深度(测量)
+     */
+    @JSONField(name = "dmea")
+    @Excel(name = "井眼深度(测量)", orderNum = "12")
+    private String dmea;
+
+    /**
+     *井眼深度(垂直)
+     */
+    @JSONField(name = "dver")
+    @Excel(name = "井眼深度(垂直)", orderNum = "13")
+    private String dver;
+
+    /**
+     *大钩位置
+     */
+    @JSONField(name = "bpos")
+    @Excel(name = "大钩位置", orderNum = "14")
+    private String bpos;
+
+    /**
+     *机械钻速(平均)
+     */
+    @JSONField(name = "ropa")
+    @Excel(name = "机械钻速(平均)", orderNum = "15")
+    private String ropa;
+
+    /**
+     *大钩负荷(平均)
+     */
+    @JSONField(name = "hkla")
+    @Excel(name = "大钩负荷(平均)", orderNum = "16")
+    private String hkla;
+
+    /**
+     *大钩负荷(最大)
+     */
+    @JSONField(name = "hklx")
+    @Excel(name = "大钩负荷(最大)", orderNum = "17")
+    private String hklx;
+
+    /**
+     *钻压(地面,平均)
+     */
+    @JSONField(name = "woba")
+    @Excel(name = "钻压(地面,平均)", orderNum = "18")
+    private String woba;
+
+    /**
+     *钻压(地面,最大)
+     */
+    @JSONField(name = "wobx")
+    @Excel(name = "钻压(地面,最大)", orderNum = "19")
+    private String wobx;
+
+    /**
+     *转盘扭矩(地面,平均)
+     */
+    @JSONField(name = "tqa")
+    @Excel(name = "转盘扭矩(地面,平均)", orderNum = "20")
+    private String tqa;
+
+    /**
+     *转盘扭矩(地面,最大)
+     */
+    @JSONField(name = "tqx")
+    @Excel(name = "转盘扭矩(地面,最大)", orderNum = "21")
+    private String tqx;
+
+    /**
+     *转盘速度(地面,平均)
+     */
+    @JSONField(name = "rpma")
+    @Excel(name = "转盘速度(地面,平均)", orderNum = "22")
+    private String rpma;
+
+    /**
+     *立管压力(平均)
+     */
+    @JSONField(name = "sppa")
+    @Excel(name = "立管压力(平均)", orderNum = "23")
+    private String sppa;
+
+    /**
+     *套管压力
+     */
+    @JSONField(name = "chkp")
+    @Excel(name = "套管压力", orderNum = "24")
+    private String chkp;
+
+    /**
+     *1#泵冲速
+     */
+    @JSONField(name = "spm1")
+    @Excel(name = "1#泵冲速", orderNum = "25")
+    private String spm1;
+
+    /**
+     *2#泵冲速
+     */
+    @JSONField(name = "spm2")
+    @Excel(name = "2#泵冲速", orderNum = "26")
+    private String spm2;
+
+    /**
+     *3#泵冲速
+     */
+    @JSONField(name = "spm3")
+    @Excel(name = "3#泵冲速", orderNum = "27")
+    private String spm3;
+
+    /**
+     *泥浆池体积(活动)
+     */
+    @JSONField(name = "tva")
+    @Excel(name = "泥浆池体积(活动)", orderNum = "28")
+    private String tva;
+
+    /**
+     *泥浆池体积变化(活动)
+     */
+    @JSONField(name = "tvca")
+    @Excel(name = "泥浆池体积变化(活动)", orderNum = "29")
+    private String tvca;
+
+    /**
+     *出口泥浆流量%
+     */
+    @JSONField(name = "mfop")
+    @Excel(name = "出口泥浆流量%", orderNum = "30")
+    private String mfop;
+
+    /**
+     *出口泥浆流量(平均)
+     */
+    @JSONField(name = "mfoa")
+    @Excel(name = "出口泥浆流量(平均)", orderNum = "31")
+    private String mfoa;
+
+    /**
+     *入口泥浆流量(平均)
+     */
+    @JSONField(name = "mfia")
+    @Excel(name = "入口泥浆流量(平均)", orderNum = "32")
+    private String mfia;
+
+    /**
+     *出口泥浆密度(平均)
+     */
+    @JSONField(name = "mdoa")
+    @Excel(name = "出口泥浆密度(平均)", orderNum = "33")
+    private String mdoa;
+
+    /**
+     *入口泥浆密度(平均)
+     */
+    @JSONField(name = "mdia")
+    @Excel(name = "入口泥浆密度(平均)", orderNum = "34")
+    private String mdia;
+
+    /**
+     *出口泥浆温度(平均)
+     */
+    @JSONField(name = "mtoa")
+    @Excel(name = "出口泥浆温度(平均)", orderNum = "35")
+    private String mtoa;
+
+    /**
+     *入口泥浆温度(平均)
+     */
+    @JSONField(name = "mtia")
+    @Excel(name = "入口泥浆温度(平均)", orderNum = "36")
+    private String mtia;
+
+    /**
+     *出口泥浆电导率(平均)
+     */
+    @JSONField(name = "mcoa")
+    @Excel(name = "出口泥浆电导率(平均)", orderNum = "37")
+    private String mcoa;
+
+    /**
+     *入口泥浆电导率(平均)
+     */
+    @JSONField(name = "mcia")
+    @Excel(name = "入口泥浆电导率(平均)", orderNum = "38")
+    private String mcia;
+
+    /**
+     *泵冲数(总计)
+     */
+    @JSONField(name = "stkc")
+    @Excel(name = "泵冲数(总计)", orderNum = "39")
+    private String stkc;
+
+    /**
+     *迟到泵冲
+     */
+    @JSONField(name = "lstk")
+    @Excel(name = "迟到泵冲", orderNum = "40")
+    private String lstk;
+
+    /**
+     *迟到井深(测量)
+     */
+    @JSONField(name = "drtm")
+    @Excel(name = "迟到井深(测量)", orderNum = "41")
+    private String drtm;
+
+    /**
+     *全烃(平均)
+     */
+    @JSONField(name = "gasa")
+    @Excel(name = "全烃(平均)", orderNum = "42")
+    private String gasa;
+
+    /**
+     *迟到时间
+     */
+    @JSONField(name = "trtt")
+    @Excel(name = "迟到时间", orderNum = "43")
+    private String trtt;
+
+    /**
+     *大钩速度
+     */
+    @JSONField(name = "bspd")
+    @Excel(name = "大钩速度", orderNum = "44")
+    private String bspd;
+
+    /**
+     *顶驱转速
+     */
+    @JSONField(name = "trpma")
+    @Excel(name = "顶驱转速", orderNum = "45")
+    private String trpma;
+
+    /**
+     *顶驱扭矩(平均)
+     */
+    @JSONField(name = "ttqa")
+    @Excel(name = "顶驱扭矩(平均)", orderNum = "46")
+    private String ttqa;
+
+    /**
+     *顶驱扭矩(最大)
+     */
+    @JSONField(name = "ttqx")
+    @Excel(name = "顶驱扭矩(最大)", orderNum = "47")
+    private String ttqx;
+
+    /**
+     *二氧化碳(平均)
+     */
+    @JSONField(name = "co2a")
+    @Excel(name = "二氧化碳(平均)", orderNum = "48")
+    private String co2a;
+
+    /**
+     *硫化氢1(平均)
+     */
+    @JSONField(name = "hs1a")
+    @Excel(name = "硫化氢1(平均)", orderNum = "49")
+    private String hs1a;
+
+    /**
+     *硫化氢2(平均)
+     */
+    @JSONField(name = "hs2a")
+    @Excel(name = "硫化氢2(平均)", orderNum = "50")
+    private String hs2a;
+
+    /**
+     *硫化氢3(平均)
+     */
+    @JSONField(name = "hs3a")
+    @Excel(name = "硫化氢3(平均)", orderNum = "51")
+    private String hs3a;
+
+    /**
+     *硫化氢4(平均)
+     */
+    @JSONField(name = "hs4a")
+    @Excel(name = "硫化氢4(平均)", orderNum = "52")
+    private String hs4a;
+
+    /**
+     *硫化氢5(平均)
+     */
+    @JSONField(name = "hs5a")
+    @Excel(name = "硫化氢5(平均)", orderNum = "53")
+    private String hs5a;
+
+    /**
+     *硫化氢6(平均)
+     */
+    @JSONField(name = "hs6a")
+    @Excel(name = "硫化氢6(平均)", orderNum = "54")
+    private String hs6a;
+
+    /**
+     *硫化氢7(平均)
+     */
+    @JSONField(name = "hs7a")
+    @Excel(name = "硫化氢7(平均)", orderNum = "55")
+    private String hs7a;
+
+    /**
+     *硫化氢8(平均)
+     */
+    @JSONField(name = "hs8a")
+    @Excel(name = "硫化氢8(平均)", orderNum = "56")
+    private String hs8a;
+
+    /**
+     *可燃气1
+     */
+    @JSONField(name = "cbg1a")
+    @Excel(name = "可燃气1", orderNum = "57")
+    private String cbg1a;
+
+    /**
+     *可燃气2
+     */
+    @JSONField(name = "cbg2a")
+    @Excel(name = "可燃气2", orderNum = "58")
+    private String cbg2a;
+
+    /**
+     *可燃气3
+     */
+    @JSONField(name = "cbg3a")
+    @Excel(name = "可燃气3", orderNum = "59")
+    private String cbg3a;
+
+    /**
+     *可燃气4
+     */
+    @JSONField(name = "cbg4a")
+    @Excel(name = "可燃气4", orderNum = "60")
+    private String cbg4a;
+
+    /**
+     *提钻超拉
+     */
+    @JSONField(name = "trip_over_pull")
+    @Excel(name = "提钻超拉", orderNum = "61")
+    private String trip_over_pull;
+
+    /**
+     *DC指数
+     */
+    @JSONField(name = "dc")
+    @Excel(name = "DC指数", orderNum = "62")
+    private String dc;
+
+    /**
+     *SIGMA指数
+     */
+    @JSONField(name = "sigma")
+    @Excel(name = "SIGMA指数", orderNum = "63")
+    private String sigma;
+
+
+
+
+    /***/
+    /**
+     *方入
+     */
+    @JSONField(name = "kellyin")
+    @Excel(name = "方入", orderNum = "64")
+    private String kellyin;
+
+    /**
+     *钻具视重
+     */
+    @JSONField(name = "float_weight")
+    @Excel(name = "钻具视重", orderNum = "65")
+    private String float_weight;
+
+    /**
+     *瞬时钻时
+     */
+    @JSONField(name = "rop_inst")
+    @Excel(name = "瞬时钻时", orderNum = "66")
+    private String rop_inst;
+
+    /**
+     *上米钻时
+     */
+    @JSONField(name = "rop_mavg")
+    @Excel(name = "上米钻时", orderNum = "67")
+    private String rop_mavg;
+
+    /**
+     *钻时
+     */
+    @JSONField(name = "rop")
+    @Excel(name = "钻时", orderNum = "68")
+    private String rop;
+
+    /**
+     *瞬间钻速
+     */
+    @JSONField(name = "vop_inst")
+    @Excel(name = "瞬间钻速", orderNum = "69")
+    private String vop_inst;
+
+    /**
+     *上米钻速
+     */
+    @JSONField(name = "vop_mavg")
+    @Excel(name = "上米钻速", orderNum = "70")
+    private String vop_mavg;
+
+    /**
+     *总泵冲
+     */
+    @JSONField(name = "tspm")
+    @Excel(name = "总泵冲", orderNum = "71")
+    private String tspm;
+
+    /**
+     *泵冲1累计数
+     */
+    @JSONField(name = "strokes1")
+    @Excel(name = "泵冲1累计数", orderNum = "72")
+    private String strokes1;
+
+    /**
+     *泵冲2累计数
+     */
+    @JSONField(name = "strokes2")
+    @Excel(name = "泵冲2累计数", orderNum = "73")
+    private String strokes2;
+
+    /**
+     *泵冲3累计数
+     */
+    @JSONField(name = "strokes3")
+    @Excel(name = "泵冲3累计数", orderNum = "74")
+    private String strokes3;
+
+    /**
+     *等效循环密度
+     */
+    @JSONField(name = "ecd")
+    @Excel(name = "等效循环密度", orderNum = "75")
+    private String ecd;
+
+    /**
+     *起下钻池体积
+     */
+    @JSONField(name = "triptandvol")
+    @Excel(name = "起下钻池体积", orderNum = "76")
+    private String triptandvol;
+
+    /**
+     *氢气
+     */
+    @JSONField(name = "h2")
+    @Excel(name = "氢气", orderNum = "77")
+    private String h2;
+
+    /**
+     *已提下立柱数
+     */
+    @JSONField(name = "standsdone")
+    @Excel(name = "已提下立柱数", orderNum = "78")
+    private String standsdone;
+
+    /**
+     *未提下立柱数
+     */
+    @JSONField(name = "standstogo")
+    @Excel(name = "未提下立柱数", orderNum = "79")
+    private String standstogo;
+
+    /**
+     *D指数
+     */
+    @JSONField(name = "d")
+    @Excel(name = "D指数", orderNum = "80")
+    private String d;
+
+    /**
+     *湿度比
+     */
+    @JSONField(name = "sdb")
+    @Excel(name = "湿度比", orderNum = "81")
+    private String sdb;
+
+    /**
+     *平衡比
+     */
+    @JSONField(name = "phb")
+    @Excel(name = "平衡比", orderNum = "82")
+    private String phb;
+
+    /**
+     *特性比
+     */
+    @JSONField(name = "txb")
+    @Excel(name = "特性比", orderNum = "83")
+    private String txb;
+
+    /**
+     *h2s百分含量-line(ppm)
+     */
+    @JSONField(name = "lhqbfhlline")
+    @Excel(name = "h2s百分含量-line(ppm)", orderNum = "84")
+    private String lhqbfhlline;
+
+    /**
+     *DCSN
+     */
+    @JSONField(name = "dcsn")
+    @Excel(name = "DCSN", orderNum = "85")
+    private String dcsn;
+
+    /**
+     *sigma趋向
+     */
+    @JSONField(name = "sigmaqx")
+    @Excel(name = "sigma趋向", orderNum = "86")
+    private String sigmaqx;
+
+    /**
+     *sigma孔隙度
+     */
+    @JSONField(name = "sigmakxd")
+    @Excel(name = "sigma孔隙度", orderNum = "87")
+    private String sigmakxd;
+
+    /**
+     *dcs孔隙度
+     */
+    @JSONField(name = "dcskxd")
+    @Excel(name = "dcs孔隙度", orderNum = "88")
+    private String dcskxd;
+
+    /**
+     *sigma地压梯度(g/cm3)
+     */
+    @JSONField(name = "sigmadytd")
+    @Excel(name = "sigma地压梯度(g/cm3)", orderNum = "89")
+    private String sigmadytd;
+
+    /**
+     *sigma破压梯度(g/cm3)
+     */
+    @JSONField(name = "sigmapytd")
+    @Excel(name = "sigma破压梯度(g/cm3)", orderNum = "90")
+    private String sigmapytd;
+
+    /**
+     *地层孔隙压力梯度估价(kg/m3)
+     */
+    @JSONField(name = "fppg")
+    @Excel(name = "地层孔隙压力梯度估价(kg/m3)", orderNum = "91")
+    private String fppg;
+
+    /**
+     *地层破裂压力梯度估价(kg/m3)
+     */
+    @JSONField(name = "ffpg")
+    @Excel(name = "地层破裂压力梯度估价(kg/m3)", orderNum = "92")
+    private String ffpg;
+
+
+    /**
+     *起下钻1号池体积(m3)
+     */
+    @JSONField(name = "ttv1")
+    @Excel(name = "起下钻1号池体积(m3)", orderNum = "93")
+    private String ttv1;
+
+    /**
+     *起下钻2号池体积(m3)
+     */
+    @JSONField(name = "ttv2")
+    @Excel(name = "起下钻2号池体积(m3)", orderNum = "94")
+    private String ttv2;
+
+    /**
+     *池体积(总计)(m3)
+     */
+    @JSONField(name = "tvt")
+    @Excel(name = "池体积(总计)(m3)", orderNum = "95")
+    private String tvt;
+
+    /**
+     *1号池体积(m3)
+     */
+    @JSONField(name = "tv01")
+    @Excel(name = "1号池体积(m3)", orderNum = "96")
+    private String tv01;
+
+    /**
+     *2号池体积(m3)
+     */
+    @JSONField(name = "tv02")
+    @Excel(name = "2号池体积(m3)", orderNum = "97")
+    private String tv02;
+
+    /**
+     *3号池体积(m3)
+     */
+    @JSONField(name = "tv03")
+    @Excel(name = "3号池体积(m3)", orderNum = "98")
+    private String tv03;
+
+    /**
+     *4号池体积(m3)
+     */
+    @JSONField(name = "tv04")
+    @Excel(name = "4号池体积(m3)", orderNum = "99")
+    private String tv04;
+
+    /**
+     *5号池体积(m3)
+     */
+    @JSONField(name = "tv05")
+    @Excel(name = "5号池体积(m3)", orderNum = "100")
+    private String tv05;
+
+    /**
+     *6号池体积(m3)
+     */
+    @JSONField(name = "tv06")
+    @Excel(name = "6号池体积(m3)", orderNum = "101")
+    private String tv06;
+
+    /**
+     *7号池体积(m3)
+     */
+    @JSONField(name = "tv07")
+    @Excel(name = "7号池体积(m3)", orderNum = "102")
+    private String tv07;
+
+    /**
+     *8号池体积(m3)
+     */
+    @JSONField(name = "tv08")
+    @Excel(name = "8号池体积(m3)", orderNum = "103")
+    private String tv08;
+
+    /**
+     *9号池体积(m3)
+     */
+    @JSONField(name = "tv09")
+    @Excel(name = "9号池体积(m3)", orderNum = "104")
+    private String tv09;
+
+    /**
+     *10号池体积(m3)
+     */
+    @JSONField(name = "tv10")
+    @Excel(name = "10号池体积(m3)", orderNum = "105")
+    private String tv10;
+
+    /**
+     *11号池体积(m3)
+     */
+    @JSONField(name = "tv11")
+    @Excel(name = "11号池体积(m3)", orderNum = "106")
+    private String tv11;
+
+    /**
+     *12号池体积(m3)
+     */
+    @JSONField(name = "tv12")
+    @Excel(name = "12号池体积(m3)", orderNum = "107")
+    private String tv12;
+
+    /**
+     *甲烷(C1)(%)
+     */
+    @JSONField(name = "meth")
+    @Excel(name = "甲烷(C1)(%)", orderNum = "108")
+    private String meth;
+
+    /**
+     *乙烷(C2)(%)
+     */
+    @JSONField(name = "eth")
+    @Excel(name = "乙烷(C2)(%)", orderNum = "109")
+    private String eth;
+
+    /**
+     *丙烷(C3)(%)
+     */
+    @JSONField(name = "prp")
+    @Excel(name = "丙烷(C3)(%)", orderNum = "110")
+    private String prp;
+
+    /**
+     *异丁烷(iC4)(%)
+     */
+    @JSONField(name = "ibut")
+    @Excel(name = "异丁烷(iC4)(%)", orderNum = "111")
+    private String ibut;
+
+    /**
+     *正丁烷(NC4)(%)
+     */
+    @JSONField(name = "nbut")
+    @Excel(name = "正丁烷(NC4)(%)", orderNum = "112")
+    private String nbut;
+
+    /**
+     *异戊烷(iC5)(%)
+     */
+    @JSONField(name = "ipen")
+    @Excel(name = "异戊烷(iC5)(%)", orderNum = "113")
+    private String ipen;
+
+    /**
+     *正戊烷(NC5)(%)
+     */
+    @JSONField(name = "npen")
+    @Excel(name = "正戊烷(NC5)(%)", orderNum = "114")
+    private String npen;
+
+    /**
+     *新戊烷(EC5)(%)
+     */
+    @JSONField(name = "epen")
+    @Excel(name = "新戊烷(EC5)(%)", orderNum = "115")
+    private String epen;
+
+    /**
+     *异己烷(iC6)(%)
+     */
+    @JSONField(name = "ihex")
+    @Excel(name = "异己烷(iC6)(%)", orderNum = "116")
+    private String ihex;
+
+    /**
+     *正己烷(NC6)(%)
+     */
+    @JSONField(name = "nhex")
+    @Excel(name = "正己烷(NC6)(%)", orderNum = "117")
+    private String nhex;
+
+    /**
+     *备用1
+     */
+    @JSONField(name = "spr1")
+    @Excel(name = "备用1", orderNum = "118")
+    private String spr1;
+
+    /**
+     *备用2
+     */
+    @JSONField(name = "spr2")
+    @Excel(name = "备用2", orderNum = "119")
+    private String spr2;
+
+    /**
+     *备用3
+     */
+    @JSONField(name = "spr3")
+    @Excel(name = "备用3", orderNum = "120")
+    private String spr3;
+
+    /**
+     *备用4
+     */
+    @JSONField(name = "spr4")
+    @Excel(name = "备用4", orderNum = "121")
+    private String spr4;
+
+    /**
+     *备用5
+     */
+    @JSONField(name = "spr5")
+    @Excel(name = "备用5", orderNum = "122")
+    private String spr5;
+
+//        /**
+//     *进入时间
+//     */
+//    @JSONField(name = "jrtime")
+//    @Excel(name = "进入时间", orderNum = "123")
+//    private String JRTIME;
+//
+//    /**
+//     *来源单位
+//     */
+//    @JSONField(name = "sourceunit")
+//    @Excel(name = "来源单位", orderNum = "124")
+//    private String SOURCEUNIT;
+}

+ 2 - 0
yujing-condition-identification/src/main/java/com/cn/tianji/service/Impl/DataSupplementationServiceImpl.java

@@ -134,4 +134,6 @@ public class DataSupplementationServiceImpl implements DataSupplementationServic
         return wellDrillingService.selectListOrcale(tableName,wrapper);
         return wellDrillingService.selectListOrcale(tableName,wrapper);
     }
     }
 
 
+
+
 }
 }

+ 367 - 0
yujing-condition-identification/src/main/java/com/cn/tianji/service/Impl/SicpToLtdImportServiceImpl.java

@@ -0,0 +1,367 @@
+package com.cn.tianji.service.Impl;
+
+import cn.afterturn.easypoi.excel.ExcelImportUtil;
+import cn.afterturn.easypoi.excel.entity.ImportParams;
+import cn.afterturn.easypoi.handler.inter.IReadHandler;
+import com.cn.tianji.common.CommonUtils;
+import com.cn.tianji.entity.WellDrilling;
+import com.cn.tianji.entity.WellDrillingSICP;
+import com.cn.tianji.param.SicpImportParam;
+import com.cn.tianji.service.SicpToLtdImportService;
+import com.cn.tianji.service.WellDrillingService;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.exception.ExceptionUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.MultipartHttpServletRequest;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.InputStream;
+import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.atomic.AtomicReference;
+
+@Service
+@Slf4j
+public class SicpToLtdImportServiceImpl implements SicpToLtdImportService {
+
+    @Resource
+    private WellDrillingService wellDrillingService;
+
+    @Override
+    public void  createTable(String creatTableJh){
+        String tableCode = wellDrillingService.getTableCode(creatTableJh);
+        wellDrillingService.createTable(tableCode,System.currentTimeMillis());
+    };
+
+    @Override
+    public void importData(HttpServletRequest request, HttpServletResponse response) {
+        MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
+        Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
+//        for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {
+//            MultipartFile file = entity.getValue();
+//            List<SicpImportParam> importData = getImportData(file);
+//            List<WellDrillingSICP> wellDrillingSICPS = importToSicpList(importData);
+//            List<WellDrilling> ltdList = SicpToLtdList(wellDrillingSICPS);
+//            String jh = ltdList.get(0).getJh();
+//            log.info("第一条数据:{},",ltdList.get(0));
+//            String tableCode = wellDrillingService.getTableCode(jh);
+//            batchInsertData(tableCode, ltdList, 100);
+//           // wellDrillingService.insertTableBatch(tableCode,ltdList);
+//            log.info("导入数据长度:{}",ltdList.size());
+//        }
+        for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {
+            MultipartFile file = entity.getValue();
+            // 检查文件大小,超过50M使用流式处理
+            if (file.getSize() > 50 * 1024 * 1024) {
+                log.info("检测到大文件({}MB),启用流式导入", file.getSize() / (1024 * 1024));
+                streamImportData(file);
+            } else {
+                log.info("文件大小正常({}MB),使用常规导入", file.getSize() / (1024 * 1024));
+                batchImportData(file);
+            }
+        }
+    }
+
+    /**
+     * 流式导入大文件数据
+     */
+    private void streamImportData(MultipartFile file) {
+        ImportParams params = new ImportParams();
+        params.setTitleRows(0);
+        params.setHeadRows(1);
+        params.setNeedVerify(true);
+        params.setReadRows(1000);
+
+        // 使用原子变量保证线程安全
+        final AtomicInteger processedRows = new AtomicInteger(0);
+        final AtomicInteger batchCount = new AtomicInteger(0);
+        final AtomicReference<String> tableCode = new AtomicReference<>();
+
+        try (InputStream inputStream = file.getInputStream()) { // 使用try-with-resources自动关闭流
+            ExcelImportUtil.importExcelBySax(inputStream, SicpImportParam.class, params,
+                    new IReadHandler<SicpImportParam>() {
+                        private List<WellDrilling> batchList = new ArrayList<>(100);
+
+                        @Override
+                        public void handler(SicpImportParam obj) {
+                            try {
+                                WellDrillingSICP sicpData = importToSicp(obj);
+                                WellDrilling ltdData = CommonUtils.sicpToLtd(sicpData);
+                                ltdData.setMotion("未识别");
+                                ltdData.setOperatingMode("未识别");
+
+                                batchList.add(ltdData);
+                                int currentCount = processedRows.incrementAndGet();
+
+                                // 提前初始化表名
+                                if (tableCode.get() == null) {
+                                    tableCode.set(wellDrillingService.getTableCode(ltdData.getJh()));
+                                }
+
+                                if (batchList.size() >= 100) {
+                                    batchInsertData(tableCode.get(), batchList, 100);
+                                    batchList.clear();
+                                    batchCount.incrementAndGet();
+
+                                    // 优化日志输出频率
+                                    if (currentCount % 500 == 0) {
+                                        log.info("流式导入进度: 已处理 {} 行数据", currentCount);
+                                    }
+                                }
+                            } catch (Exception e) {
+                                log.error("处理第{}行数据时出错 - 数据内容: {} - 错误详情: {}",
+                                        processedRows.get(), obj.toString(), e.getMessage());
+                            }
+                        }
+
+                        @Override
+                        public void doAfterAll() {
+                            if (tableCode.get() != null && !batchList.isEmpty()) {
+                                batchInsertData(tableCode.get(), batchList, 100);
+                                log.info("流式导入完成: 总共处理 {} 行数据,分 {} 批次",
+                                        processedRows.get(), batchCount.incrementAndGet());
+                            }
+                            batchList.clear(); // 确保释放内存
+                        }
+                    });
+        } catch (Exception e) {
+            log.error("流式导入失败: {}", ExceptionUtils.getStackTrace(e)); // 输出完整堆栈
+            throw new RuntimeException("文件导入失败: " + e.getMessage(), e);
+        }
+    }
+
+    /**
+     * 常规批量导入(适用于小文件)
+     */
+    private void batchImportData(MultipartFile file) {
+        try {
+            List<SicpImportParam> importData = getImportData(file);
+            List<WellDrillingSICP> wellDrillingSICPS = importToSicpList(importData);
+            List<WellDrilling> ltdList = SicpToLtdList(wellDrillingSICPS);
+
+            if (!ltdList.isEmpty()) {
+                String jh = ltdList.get(0).getJh();
+                String tableCode = wellDrillingService.getTableCode(jh);
+                batchInsertData(tableCode, ltdList, 100);
+                log.info("常规导入完成: 导入 {} 条数据", ltdList.size());
+            }
+        } catch (Exception e) {
+            log.error("常规导入失败: {}", e.getMessage());
+            throw new RuntimeException("文件导入失败: " + e.getMessage(), e);
+        }
+    }
+
+    /**
+     * 分批插入数据
+     */
+    private void batchInsertData(String tableCode, List<WellDrilling> dataList, int batchSize) {
+        int total = dataList.size();
+        int batchCount = (int) Math.ceil((double) total / batchSize);
+
+        for (int i = 0; i < batchCount; i++) {
+            int fromIndex = i * batchSize;
+            int toIndex = Math.min(fromIndex + batchSize, total);
+            List<WellDrilling> batchList = dataList.subList(fromIndex, toIndex);
+
+            // 创建新ArrayList避免subList的潜在问题
+            wellDrillingService.insertTableBatch(tableCode, new ArrayList<>(batchList));
+            log.info("批次 {}/{}: 插入 {} 条数据", i + 1, batchCount, batchList.size());
+        }
+    }
+
+
+    public List<SicpImportParam> getImportData(MultipartFile file) {
+        ImportParams params = new ImportParams();
+        params.setTitleRows(0);    // 标题行(第1行)
+        params.setHeadRows(1);     // 表头行(第2行)
+        params.setNeedVerify(true);// 开启校验
+        List<SicpImportParam> res = new ArrayList<>();
+        try {
+            res = ExcelImportUtil.importExcel(file.getInputStream(), SicpImportParam.class, params);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+        return res;
+    }
+
+    public List<WellDrilling> SicpToLtdList(List<WellDrillingSICP> sicpWellDataByJhTime) {
+        List<WellDrilling> saveList = new ArrayList<>();
+        sicpWellDataByJhTime.forEach(item -> {
+            WellDrilling wellDrilling = CommonUtils.sicpToLtd(item);
+            wellDrilling.setMotion("未识别");
+            wellDrilling.setOperatingMode("未识别");
+            saveList.add(wellDrilling);
+        });
+        return saveList;
+    }
+
+    public List<WellDrillingSICP> importToSicpList(List<SicpImportParam> importData) {
+        List<WellDrillingSICP> saveList = new ArrayList<>();
+        importData.forEach(item -> {
+            WellDrillingSICP wellDrillingSICP = importToSicp(item);
+            saveList.add(wellDrillingSICP);
+        });
+        return saveList;
+    }
+
+    public WellDrillingSICP importToSicp(SicpImportParam param) {
+        WellDrillingSICP model = new WellDrillingSICP();
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+        model.setJh(param.getJh());
+        model.setSgdw(param.getSgdw());
+        model.setGk(param.getGk());
+        model.setJID(param.getJid());
+        model.setJYID(param.getJyid());
+        model.setZYID(param.getZyid());
+
+        model.setRID(param.getRid());
+        model.setSQID(param.getSqid());
+        model.setTIME(param.getTime().format(formatter));
+        model.setACTC(param.getActc());
+        model.setDBTM(param.getDbtm());
+        model.setDBTV(param.getDbtv());
+        model.setDMEA(param.getDmea());
+        model.setDVER(param.getDver());
+        model.setBPOS(param.getBpos());
+        model.setROPA(param.getRopa());
+        model.setHKLA(param.getHkla());
+        model.setHKLX(param.getHklx());
+        model.setWOBA(param.getWoba());
+        model.setWOBX(param.getWobx());
+        model.setTQA(param.getTqa());
+        model.setTQX(param.getTqx());
+        model.setRPMA(param.getRpma());
+        model.setSPPA(param.getSppa());
+        model.setCHKP(param.getChkp());
+
+        model.setSPM1(param.getSpm1());
+        model.setSPM2(param.getSpm2());
+        model.setSPM2(param.getSpm2());
+
+        model.setTVA(param.getTva());
+        model.setTVCA(param.getTvca());
+        model.setMFOP(param.getMfop());
+        model.setMFOA(param.getMfoa());
+        model.setMFOA(param.getMfoa());
+        model.setMFIA(param.getMfia());
+        model.setMDOA(param.getMdoa());
+        model.setMTOA(param.getMtoa());
+        model.setMTIA(param.getMtia());
+
+        model.setMCOA(param.getMcoa());
+        model.setMCIA(param.getMcia());
+
+        model.setSTKC(param.getStkc());
+        model.setLSTK(param.getLstk());
+        model.setDRTM(param.getDrtm());
+        model.setGASA(param.getGasa());
+        model.setTRTT(param.getTrtt());
+        model.setBSPD(param.getBspd());
+
+        model.setTRPMA(param.getTrpma());
+        model.setTTQA(param.getTtqa());
+        model.setTTQX(param.getTtqx());
+        model.setCO2A(param.getCo2a());
+
+        model.setHS1A(param.getHs1a());
+        model.setHS2A(param.getHs2a());
+        model.setHS3A(param.getHs3a());
+        model.setHS4A(param.getHs4a());
+        model.setHS5A(param.getHs5a());
+        model.setHS6A(param.getHs6a());
+        model.setHS7A(param.getHs7a());
+        model.setHS8A(param.getHs8a());
+
+        model.setCBG1A(param.getCbg1a());
+        model.setCBG2A(param.getCbg2a());
+        model.setCBG3A(param.getCbg3a());
+        model.setCBG4A(param.getCbg4a());
+
+        model.setTRIP_OVER_PULL(param.getTrip_over_pull());
+        model.setDC(param.getDc());
+        model.setSIGMA(param.getSigma());
+
+        model.setKELLYIN(param.getKellyin());
+        model.setFLOAT_WEIGHT(param.getFloat_weight());
+        model.setROP_INST(param.getRop_inst());
+        model.setROP_MAVG(param.getRop_mavg());
+        model.setROP(param.getRop());
+        model.setVOP_INST(param.getVop_inst());
+        model.setVOP_MAVG(param.getVop_mavg());
+        model.setTSPM(param.getTspm());
+        model.setSTROKES1(param.getStrokes1());
+        model.setSTROKES2(param.getStrokes2());
+        model.setSTROKES3(param.getStrokes3());
+        model.setECD(param.getEcd());
+        model.setTRIPTANDVOL(param.getTriptandvol());
+
+        model.setH2(param.getH2());
+        model.setSTANDSDONE(param.getStandsdone());
+        model.setSTANDSTOGO(param.getStandstogo());
+        model.setD(param.getD());
+
+        model.setPHB(param.getPhb());
+        model.setTXB(param.getTxb());
+        model.setLHQBFHLLINE(param.getLhqbfhlline());
+        model.setDCSN(param.getDcsn());
+
+        model.setSIGMAQX(param.getSigmaqx());
+        model.setSIGMAKXD(param.getSigmakxd());
+        model.setDCSKXD(param.getDcskxd());
+        model.setSIGMADYTD(param.getSigmadytd());
+        model.setSIGMAPYTD(param.getSigmapytd());
+
+        model.setFPPG(param.getFppg());
+        model.setFFPG(param.getFfpg());
+        model.setTTV1(param.getTtv1());
+        model.setTTV2(param.getTtv2());
+        model.setTVT(param.getTvt());
+
+
+
+
+
+
+        // 池体积字段 TV01-TV12
+        model.setTV01(param.getTv01());
+        model.setTV02(param.getTv02());
+        model.setTV03(param.getTv03());
+        model.setTV04(param.getTv04());
+        model.setTV05(param.getTv05());
+        model.setTV06(param.getTv06());
+        model.setTV07(param.getTv07());
+        model.setTV08(param.getTv08());
+        model.setTV09(param.getTv09());
+        model.setTV10(param.getTv10());
+        model.setTV11(param.getTv11());
+        model.setTV12(param.getTv12());
+
+
+        // 气体成分字段
+        model.setMETH(param.getMeth());
+        model.setETH(param.getEth());
+        model.setPRP(param.getPrp());
+        model.setIBUT(param.getIbut());
+        model.setNBUT(param.getNbut());
+        model.setIPEN(param.getIpen());
+        model.setNPEN(param.getNpen());
+        model.setEPEN(param.getEpen());
+        model.setIHEX(param.getIhex());
+        model.setNHEX(param.getNhex());
+
+        // 备用字段
+        model.setSPR1(param.getSpr1());
+        model.setSPR2(param.getSpr2());
+        model.setSPR3(param.getSpr3());
+        model.setSPR4(param.getSpr4());
+        model.setSPR5(param.getSpr5());
+        return model;
+    }
+
+}

+ 7 - 0
yujing-condition-identification/src/main/java/com/cn/tianji/service/Impl/WorkingConditionCalculationServiceImpl.java

@@ -76,6 +76,8 @@ public class WorkingConditionCalculationServiceImpl implements WorkingConditionC
     @Resource
     @Resource
     private YjPumpingWarnValueService pumpingWarnValueService;
     private YjPumpingWarnValueService pumpingWarnValueService;
 
 
+    @Resource
+    private ComprehensiveWarnService comprehensiveWarnService;
 
 
     @Resource
     @Resource
     private RedisUtil redisUtil;
     private RedisUtil redisUtil;
@@ -541,4 +543,9 @@ public class WorkingConditionCalculationServiceImpl implements WorkingConditionC
         return yjPumpingWarnValue;
         return yjPumpingWarnValue;
     }
     }
 
 
+    @Override
+    public void comprehensiveWarnJhList(){
+        comprehensiveWarnService.comprehensiveWarnJhList();
+    }
+
 }
 }

+ 10 - 0
yujing-condition-identification/src/main/java/com/cn/tianji/service/SicpToLtdImportService.java

@@ -0,0 +1,10 @@
+package com.cn.tianji.service;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+public interface SicpToLtdImportService {
+    void  createTable(String saveJh);
+
+    void importData(HttpServletRequest request, HttpServletResponse response);
+}

+ 2 - 0
yujing-condition-identification/src/main/java/com/cn/tianji/service/WorkingConditionCalculationService.java

@@ -10,4 +10,6 @@ public interface WorkingConditionCalculationService {
      * @param jh
      * @param jh
      */
      */
     public Result<?> workingConditionCalculation(String workingConditionCalculationLogId);
     public Result<?> workingConditionCalculation(String workingConditionCalculationLogId);
+
+    void comprehensiveWarnJhList();
 }
 }

+ 27 - 0
yujing-condition-identification/src/main/java/com/cn/tianji/task/Task.java

@@ -0,0 +1,27 @@
+package com.cn.tianji.task;
+
+import com.cn.tianji.service.WorkingConditionCalculationService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+
+
+/**
+ * 定时任务调度
+ *
+ * @author Zhao RenJi
+ */
+@Component("Task")
+@Slf4j
+public class Task {
+
+    @Resource
+    private WorkingConditionCalculationService workingConditionCalculationService;
+
+//    @Scheduled(cron = "0 0,30 * * * *")
+    public void comprehensiveWarnJhListExecute() {
+        workingConditionCalculationService.comprehensiveWarnJhList();
+    }
+}

+ 5 - 6
yujing-condition-identification/src/main/resources/config/application-prod.yml

@@ -23,28 +23,27 @@ spring:
         maxPoolPreparedStatementPerConnectionSize: 20
         maxPoolPreparedStatementPerConnectionSize: 20
         # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
         # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
         filters: stat,wall,slf4j
         filters: stat,wall,slf4j
-        # 通过connectProperties属性来打开mergeSql功能;慢SQL记录
-        connectionProperties: druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000
+
       datasource:
       datasource:
         master:
         master:
           driver-class-name: oracle.jdbc.OracleDriver
           driver-class-name: oracle.jdbc.OracleDriver
           url: jdbc:oracle:thin:@//10.66.116.46:1521/JT_ZJ
           url: jdbc:oracle:thin:@//10.66.116.46:1521/JT_ZJ
           username: jtznyj
           username: jtznyj
-          password: jtznyj#2021
+          password: sm4:b7594dc6c405b4c538b3c4fda1b299d8 #jtznyj#2021
         chartDataSource:
         chartDataSource:
           driver-class-name: oracle.jdbc.OracleDriver
           driver-class-name: oracle.jdbc.OracleDriver
           url: jdbc:oracle:thin:@//10.66.116.46/jt
           url: jdbc:oracle:thin:@//10.66.116.46/jt
           username: jtgcyth2018
           username: jtgcyth2018
-          password: Sljtyw_2018
+          password: sm4:0b8be0edbf2b1dd8c81c71e10e31b332 #Sljtyw_2018
         yjDataSource:
         yjDataSource:
           driver-class-name: oracle.jdbc.OracleDriver
           driver-class-name: oracle.jdbc.OracleDriver
           url: jdbc:oracle:thin:@//10.66.116.46:1521/JT_LJ
           url: jdbc:oracle:thin:@//10.66.116.46:1521/JT_LJ
           username: tj_zjgc
           username: tj_zjgc
-          password: ZjgcTJ#zjgc@2024
+          password: sm4:cbcb44d61c6086e05cf39c8eab48adbaaa8e81cd743fbd809c2ca6a723b412ac #ZjgcTJ#zjgc@2024
         zjyDataSource:
         zjyDataSource:
           driver-class-name: oracle.jdbc.OracleDriver
           driver-class-name: oracle.jdbc.OracleDriver
           url: jdbc:oracle:thin:@//10.66.116.46:1521/JT_ZJ
           url: jdbc:oracle:thin:@//10.66.116.46:1521/JT_ZJ
           username: zjycs
           username: zjycs
-          password: Zjy_2019
+          password: sm4:9f769933c70034b0daf8ec0ca339522b #Zjy_2019
 #rocketmq:
 #rocketmq:
 #  name-server: localhost:9876	 # 这里需要换成自己的 rocketMq 的地址
 #  name-server: localhost:9876	 # 这里需要换成自己的 rocketMq 的地址

+ 8 - 4
yujing-condition-identification/src/main/resources/config/application.yml

@@ -9,9 +9,13 @@ spring:
     name: yujing-condition-identification
     name: yujing-condition-identification
   mvc:
   mvc:
     static-path-pattern: /**
     static-path-pattern: /**
-    jackson:
-      time-zone: GMT+8
-      date-format: "yyyy-MM-dd HH:mm:ss"
+  jackson:
+    time-zone: GMT+8
+    date-format: "yyyy-MM-dd HH:mm:ss"
+  servlet:
+    multipart:
+      max-file-size: 100MB
+      max-request-size: 100MB
   redis:
   redis:
     database: 0
     database: 0
     host: localhost
     host: localhost
@@ -22,7 +26,7 @@ spring:
         max-wait: -1ms  #最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。
         max-wait: -1ms  #最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。
         min-idle: 0     #最小等待连接中的数量,设 0 为没有限制
         min-idle: 0     #最小等待连接中的数量,设 0 为没有限制
       shutdown-timeout: 100ms
       shutdown-timeout: 100ms
-    password: 123
+    password: YjJcfuwu@2025 #123
     port: 6379
     port: 6379
 logging:
 logging:
   config: classpath:logback.xml
   config: classpath:logback.xml

+ 4 - 0
yujing-hook-load-warning/pom.xml

@@ -22,6 +22,10 @@
             <artifactId>yujing-warning-calculation</artifactId>
             <artifactId>yujing-warning-calculation</artifactId>
             <version>0.0.1-SNAPSHOT</version>
             <version>0.0.1-SNAPSHOT</version>
         </dependency>
         </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-security</artifactId>
+        </dependency>
     </dependencies>
     </dependencies>
     <properties>
     <properties>
         <maven.compiler.source>8</maven.compiler.source>
         <maven.compiler.source>8</maven.compiler.source>

+ 5 - 1
yujing-hook-load-warning/src/main/java/com/cn/tianji/HookLoadWarningApplication.java

@@ -1,7 +1,9 @@
 package com.cn.tianji;
 package com.cn.tianji;
 
 
+import com.cn.tianji.config.DataSourceDecryptConfig;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.ConfigurableApplicationContext;
 
 
 /**
 /**
  * @author Zhao RenJi
  * @author Zhao RenJi
@@ -9,7 +11,9 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
 @SpringBootApplication
 @SpringBootApplication
 public class HookLoadWarningApplication {
 public class HookLoadWarningApplication {
     public static void main(String[] args) {
     public static void main(String[] args) {
-        SpringApplication.run(HookLoadWarningApplication.class, args);
+        ConfigurableApplicationContext context =SpringApplication.run(HookLoadWarningApplication.class, args);
+        DataSourceDecryptConfig config = context.getBean(DataSourceDecryptConfig.class);
+        System.out.println("DataSourceDecryptConfig 加载状态: " + (config != null ? "成功" : "失败"));
         System.out.println("HookLoadWarning启动");
         System.out.println("HookLoadWarning启动");
     }
     }
 }
 }

+ 37 - 0
yujing-hook-load-warning/src/main/java/com/cn/tianji/config/DataSourceDecryptConfig.java

@@ -0,0 +1,37 @@
+package com.cn.tianji.config;
+
+import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DataSourceProperty;
+import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceProperties;
+import com.cn.tianji.common.Sm4Util;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
+import org.springframework.context.annotation.Configuration;
+
+import javax.annotation.PostConstruct;
+import javax.annotation.Resource;
+
+@Configuration
+@ConditionalOnClass(DynamicDataSourceProperties.class)
+@Slf4j
+public class DataSourceDecryptConfig {
+    @Resource
+    private DynamicDataSourceProperties properties;
+
+    @PostConstruct
+    public void decryptDataSourcePasswords() {
+        log.warn("开始解密数据源密码...");
+        // 解密主数据源密码
+        decryptPassword(properties.getDatasource().get(properties.getPrimary()));
+
+        // 解密所有从数据源密码
+        properties.getDatasource().values().forEach(this::decryptPassword);
+        log.warn("解密数据源密码完成...");
+    }
+
+    private void decryptPassword(DataSourceProperty property) {
+        String password = property.getPassword();
+        if (password != null && password.startsWith(Sm4Util.ENC_PREFIX)) {
+            property.setPassword(Sm4Util.decrypt(password));
+        }
+    }
+}

+ 6 - 1
yujing-hook-load-warning/src/main/resources/config/application.yml

@@ -6,6 +6,11 @@ spring:
     active: prod #local prod
     active: prod #local prod
   application:
   application:
     name: yujing-hook-load-warning
     name: yujing-hook-load-warning
+  security:
+    user:
+      name: admin
+      password: YujingHoolLoad@2025
+      roles: ADMIN
   mvc:
   mvc:
     static-path-pattern: /**
     static-path-pattern: /**
     jackson:
     jackson:
@@ -21,7 +26,7 @@ spring:
         max-wait: -1ms  #最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。
         max-wait: -1ms  #最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。
         min-idle: 0     #最小等待连接中的数量,设 0 为没有限制
         min-idle: 0     #最小等待连接中的数量,设 0 为没有限制
       shutdown-timeout: 1000ms
       shutdown-timeout: 1000ms
-    password: #123
+    password: #YjCjfuwu@2025 #123
     port: 6379
     port: 6379
 logging:
 logging:
   config: classpath:logback.xml
   config: classpath:logback.xml

+ 2 - 2
yujing-hook-load-warning/src/main/resources/logback.xml

@@ -97,8 +97,8 @@
         <appender-ref ref="STDOUT" />
         <appender-ref ref="STDOUT" />
         <appender-ref ref="FILE" />
         <appender-ref ref="FILE" />
         <appender-ref ref="ERROR_FILE" />
         <appender-ref ref="ERROR_FILE" />
-        <appender-ref ref="HTML" />
-        <appender-ref ref="FILE_HTML" />
+<!--        <appender-ref ref="HTML" />-->
+<!--        <appender-ref ref="FILE_HTML" />-->
     </root>
     </root>
 
 
 </configuration>
 </configuration>

+ 8 - 3
yujing-pull/pom.xml

@@ -23,10 +23,15 @@
             <version>0.0.1-SNAPSHOT</version>
             <version>0.0.1-SNAPSHOT</version>
         </dependency>
         </dependency>
         <dependency>
         <dependency>
-            <groupId>com.github.ben-manes.caffeine</groupId>
-            <artifactId>caffeine</artifactId>
-            <version>2.6.2</version>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-security</artifactId>
         </dependency>
         </dependency>
+
+<!--        <dependency>-->
+<!--            <groupId>com.github.ben-manes.caffeine</groupId>-->
+<!--            <artifactId>caffeine</artifactId>-->
+<!--            <version>2.6.2</version>-->
+<!--        </dependency>-->
     </dependencies>
     </dependencies>
     <properties>
     <properties>
         <maven.compiler.source>8</maven.compiler.source>
         <maven.compiler.source>8</maven.compiler.source>

+ 5 - 1
yujing-pull/src/main/java/com/cn/tianji/PullApplication.java

@@ -1,7 +1,9 @@
 package com.cn.tianji;
 package com.cn.tianji;
 
 
+import com.cn.tianji.config.DataSourceDecryptConfig;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.ConfigurableApplicationContext;
 import org.springframework.scheduling.annotation.EnableScheduling;
 import org.springframework.scheduling.annotation.EnableScheduling;
 
 
 /**
 /**
@@ -11,7 +13,9 @@ import org.springframework.scheduling.annotation.EnableScheduling;
 @EnableScheduling
 @EnableScheduling
 public class PullApplication {
 public class PullApplication {
     public static void main(String[] args) {
     public static void main(String[] args) {
-        SpringApplication.run(PullApplication.class, args);
+        ConfigurableApplicationContext context =SpringApplication.run(PullApplication.class, args);
+        DataSourceDecryptConfig config = context.getBean(DataSourceDecryptConfig.class);
+        System.out.println("DataSourceDecryptConfig 加载状态: " + (config != null ? "成功" : "失败"));
         System.out.println("实时数据采集启动");
         System.out.println("实时数据采集启动");
     }
     }
 }
 }

+ 37 - 0
yujing-pull/src/main/java/com/cn/tianji/config/DataSourceDecryptConfig.java

@@ -0,0 +1,37 @@
+package com.cn.tianji.config;
+
+import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DataSourceProperty;
+import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceProperties;
+import com.cn.tianji.common.Sm4Util;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
+import org.springframework.context.annotation.Configuration;
+
+import javax.annotation.PostConstruct;
+import javax.annotation.Resource;
+
+@Configuration
+@ConditionalOnClass(DynamicDataSourceProperties.class)
+@Slf4j
+public class DataSourceDecryptConfig {
+    @Resource
+    private DynamicDataSourceProperties properties;
+
+    @PostConstruct
+    public void decryptDataSourcePasswords() {
+        log.warn("开始解密数据源密码...");
+        // 解密主数据源密码
+        decryptPassword(properties.getDatasource().get(properties.getPrimary()));
+
+        // 解密所有从数据源密码
+        properties.getDatasource().values().forEach(this::decryptPassword);
+        log.warn("解密数据源密码完成...");
+    }
+
+    private void decryptPassword(DataSourceProperty property) {
+        String password = property.getPassword();
+        if (password != null && password.startsWith(Sm4Util.ENC_PREFIX)) {
+            property.setPassword(Sm4Util.decrypt(password));
+        }
+    }
+}

+ 12 - 0
yujing-pull/src/main/java/com/cn/tianji/controller/TaskTestController.java

@@ -1,12 +1,15 @@
 package com.cn.tianji.controller;
 package com.cn.tianji.controller;
 
 
 import com.cn.tianji.service.PullSICPDataService;
 import com.cn.tianji.service.PullSICPDataService;
+import com.cn.tianji.service.TestPullDataService;
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 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.bind.annotation.RestController;
 
 
 import javax.annotation.Resource;
 import javax.annotation.Resource;
+import java.math.BigDecimal;
 import java.util.ArrayList;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.List;
 
 
@@ -18,11 +21,15 @@ public class TaskTestController {
     @Resource
     @Resource
     private PullSICPDataService pullSICPDataService;
     private PullSICPDataService pullSICPDataService;
 
 
+    @Resource
+    private TestPullDataService testPullDataService;
+
     @GetMapping("/taskTest")
     @GetMapping("/taskTest")
     public void testPull(){
     public void testPull(){
         pullSICPDataService.updateJh();
         pullSICPDataService.updateJh();
     }
     }
 
 
+
     @GetMapping("/updTableByJhs")
     @GetMapping("/updTableByJhs")
     public void updTableByJhs(){
     public void updTableByJhs(){
         List<String> jhs=new ArrayList<>();
         List<String> jhs=new ArrayList<>();
@@ -36,4 +43,9 @@ public class TaskTestController {
         jhs.add("顺深2斜");
         jhs.add("顺深2斜");
         pullSICPDataService.pullData(jhs);
         pullSICPDataService.pullData(jhs);
     }
     }
+
+    @GetMapping("testPullData")
+    public void testPullData(@RequestParam("duration") Integer duration){
+       // testPullDataService.testPullData(BigDecimal.valueOf(duration));
+    }
 }
 }

+ 16 - 0
yujing-pull/src/main/java/com/cn/tianji/dto/JhPullTestDto.java

@@ -0,0 +1,16 @@
+package com.cn.tianji.dto;
+
+import lombok.Data;
+
+@Data
+public class JhPullTestDto {
+
+
+    private String jh;
+
+    private String startTime;
+
+    private String endTime;
+
+    private String firstTime;
+}

+ 8 - 0
yujing-pull/src/main/java/com/cn/tianji/service/TestPullDataService.java

@@ -0,0 +1,8 @@
+package com.cn.tianji.service;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+public interface TestPullDataService {
+
+}

+ 193 - 0
yujing-pull/src/main/java/com/cn/tianji/service/impl/TestPullDataServiceImpl.java

@@ -0,0 +1,193 @@
+package com.cn.tianji.service.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.cn.tianji.common.CommonUtils;
+import com.cn.tianji.common.RedisUtil;
+import com.cn.tianji.dto.ConditionDeterminationDto;
+import com.cn.tianji.dto.JhPullTestDto;
+import com.cn.tianji.entity.OperatingConditionThreshold;
+import com.cn.tianji.entity.WellDrilling;
+import com.cn.tianji.service.*;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
+import java.util.List;
+
+@Slf4j
+@Service
+public class TestPullDataServiceImpl implements TestPullDataService {
+
+    @Resource
+    private ConditionIdentificationService conditionIdentificationService;
+
+    @Resource
+    private SendWellDrillingMessageService sendWellDrillingMessageService;
+
+    @Resource
+    private OperatingConditionThresholdService operatingConditionThresholdService;
+
+    @Resource
+    private WellDrillingService wellDrillingService;
+
+    @Resource
+    private RedisUtil redisUtil;
+
+    private String catchName = "_Operating";
+
+    public void testPull(){
+        //获取每口井的开始时间
+        //计算每口井的结束时间
+        //计算完成下次以结束时间为开始时间
+        List<JhPullTestDto> jhList = new ArrayList<>();
+        String firstTime="";
+        jhList.forEach(item->{
+            String startTime = getEarliestData(item.getJh());
+            String endTime = getEndTime(startTime, BigDecimal.valueOf(30));
+            item.setStartTime(startTime);
+            item.setEndTime(endTime);
+            item.setFirstTime(startTime);
+        });
+        Boolean isCompute=true;
+        while (isCompute){
+            testPullData(jhList);
+            for (JhPullTestDto item : jhList) {
+                String startTime = item.getStartTime();
+                String endTime = item.getEndTime();
+                String firstTime1 = item.getFirstTime();
+                String endTimeNew = getEndTime(startTime, BigDecimal.valueOf(30));
+                item.setStartTime(endTime);
+                item.setEndTime(endTimeNew);
+
+            }
+        }
+
+    }
+
+
+    public void testPullData(List<JhPullTestDto> jhs){
+        //List<String> jhs = new ArrayList<>();
+        log.info("采集井号:{}",jhs);
+        jhs.forEach(item -> {
+            List<WellDrilling> wellDrillings = queryList(item.getJh(), item.getStartTime(), item.getEndTime());
+            String jhTableName = CommonUtils.getJhTableName(item.getJh());
+            saveBatchData(jhTableName,wellDrillings,new ArrayList<>());
+        });
+    }
+
+    public String getEndTime(String startTime,BigDecimal duration){
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+        LocalDateTime startDateTime = LocalDateTime.parse(startTime, formatter);
+        LocalDateTime endDateTime = startDateTime.plusMinutes(duration.longValue());
+        return endDateTime.format(formatter);
+    }
+
+
+    public String getEarliestData(String jh){
+        String jhTableName = CommonUtils.getJhTableName(jh);
+        return wellDrillingService.getLastDateByJh(jhTableName);
+    }
+
+    public List<WellDrilling> queryList(String jh, String startTime, String endTime) {
+        QueryWrapper<WellDrilling> wrapper = new QueryWrapper<>();
+        wrapper.apply("TO_DATE(SUBSTR(TIME, 1, 19), 'yyyy-MM-dd HH24:mi:ss') <= to_date({0},'yyyy-mm-dd hh24:mi:ss')", endTime);
+        wrapper.apply("TO_DATE(SUBSTR(TIME, 1, 19), 'yyyy-MM-dd HH24:mi:ss') >= to_date({0},'yyyy-mm-dd hh24:mi:ss')", startTime);
+        wrapper.orderByAsc("TIME");
+        String jhTableName = CommonUtils.getJhTableName(jh);
+        return wellDrillingService.selectListOrcale(jhTableName, wrapper);
+    }
+
+
+    public void saveBatchData(String selectJh, List<WellDrilling> records, List<WellDrilling> startBeforeDate) {
+        //对数进行升序排序
+//        log.info("排序数据时间:{}", records.get(0).getTIME());
+        List<WellDrilling> collect = records;
+        collect.sort((a, b) -> a.getTime().compareTo(b.getTime()));
+        for (int i = 2; i < collect.size(); i++) {
+            List<WellDrilling> models = new ArrayList<>();
+            if (startBeforeDate.size() == 2) {
+                if (i == 0) {
+                    models.add(startBeforeDate.get(0));
+                    models.add(startBeforeDate.get(1));
+                    models.add(collect.get(i));
+                } else if (i == 1) {
+                    models.add(startBeforeDate.get(1));
+                    models.add(collect.get(0));
+                    models.add(collect.get(1));
+                }
+            }
+            if (i >= 2) {
+                models.add(collect.get(i - 2));
+                models.add(collect.get(i - 1));
+                models.add(collect.get(i));
+            }
+            log.info("工况识别数据长度:{}", models.size());
+            if (models.size() == 3) {
+                List<WellDrilling> wellDrillings = models;
+                //WellDrillinghandle(models);
+                OperatingConditionThreshold operatingConditionThreshold = getOperatingCatchByJh(wellDrillings.get(0).getJh());
+                ConditionDeterminationDto conditionDeterminationDto = conditionIdentificationService.conditionDetermination(wellDrillings, operatingConditionThreshold);
+                collect.get(i).setOperatingMode(conditionDeterminationDto.getOperatingMode());
+                collect.get(i).setMotion(conditionDeterminationDto.getMotion());
+                sendWellDrillingMessageService.sendMessage(conditionDeterminationDto.getMotion(), collect.get(i), collect.get(i).getJh());
+            } else {
+                collect.get(i).setOperatingMode("未识别工况");
+                collect.get(i).setMotion("未识别动作");
+            }
+        }
+//        int i = wellDrillingService.insertTableBatch(selectJh, collect);
+        log.info("井号;{};插入数据数量:{}", selectJh, collect.size());
+        //report3Mapper.insertTableBatch(selectJh, collect);
+    }
+
+    public OperatingConditionThreshold getOperatingCatchByJh(String jh) {
+        String redisKsy = jh + catchName;
+        OperatingConditionThreshold catchData = new OperatingConditionThreshold();
+        boolean isHaveCatch = redisUtil.hasKey(redisKsy);
+        if (isHaveCatch) {
+            catchData = JSONObject.toJavaObject(JSONObject.parseObject(JSON.toJSONString(redisUtil.get(redisKsy))), OperatingConditionThreshold.class);
+        } else {
+            // catchData = setCreating();
+            getOp(jh);
+        }
+        return catchData;
+    }
+
+    public void getOp(String jh){
+        String redisKsy = jh + catchName;
+        QueryWrapper<OperatingConditionThreshold> wrapper=new QueryWrapper<>();
+        wrapper.lambda().eq(OperatingConditionThreshold::getJh,jh);
+        List<OperatingConditionThreshold> list = operatingConditionThresholdService.list(wrapper);
+        if(list.size()>0){
+            OperatingConditionThreshold operatingConditionThreshold = list.get(0);
+            redisUtil.del(redisKsy);
+            redisUtil.set(redisKsy,operatingConditionThreshold);
+        }else{
+            OperatingConditionThreshold saveModel = setCreating();
+            saveModel.setJh(jh);
+            operatingConditionThresholdService.save(saveModel);
+        }
+    }
+
+    public OperatingConditionThreshold setCreating() {
+        OperatingConditionThreshold operatingConditionThreshold = new OperatingConditionThreshold();
+        operatingConditionThreshold.setJh("通用");
+        operatingConditionThreshold.setApproachingSurface(BigDecimal.valueOf(30));
+        operatingConditionThreshold.setWoh(BigDecimal.valueOf(210));
+        operatingConditionThreshold.setOnBottom(BigDecimal.valueOf(5));
+        operatingConditionThreshold.setIsRotationOff(BigDecimal.valueOf(5));
+        operatingConditionThreshold.setBlockldle(BigDecimal.valueOf(0));
+        operatingConditionThreshold.setNoFlow(BigDecimal.valueOf(15));
+        operatingConditionThreshold.setPressureZero(BigDecimal.valueOf(5));
+        operatingConditionThreshold.setBitMovingUp(BigDecimal.valueOf(0));
+        operatingConditionThreshold.setBlockMovingUp(BigDecimal.valueOf(0));
+        operatingConditionThreshold.setFarBottom(BigDecimal.valueOf(30));
+        return operatingConditionThreshold;
+    }
+}

+ 4 - 0
yujing-pull/src/main/java/com/cn/tianji/task/PullDataTask.java

@@ -64,6 +64,10 @@ public class PullDataTask {
         bizService.syncTableDataBefore();
         bizService.syncTableDataBefore();
     }
     }
 
 
+
+
+    /***********************/
+
     @Scheduled(cron = "0 35 8 * * ?")
     @Scheduled(cron = "0 35 8 * * ?")
     public void updateAjHLastDate(){
     public void updateAjHLastDate(){
         bizService.updateAjHLastDate();
         bizService.updateAjHLastDate();

+ 2 - 2
yujing-pull/src/main/java/com/cn/tianji/task/PullSICPDataTask.java

@@ -56,10 +56,10 @@ public class PullSICPDataTask {
 //    }
 //    }
 
 
 
 
-//    @Scheduled(fixedDelay = 40,timeUnit = TimeUnit.SECONDS,initialDelay = 30L)
+    @Scheduled(fixedDelay = 40,timeUnit = TimeUnit.SECONDS,initialDelay = 30L)
     public void pullDataTask(){
     public void pullDataTask(){
         List<String> jhs=new ArrayList<>();
         List<String> jhs=new ArrayList<>();
-        jhs.add("顺北806斜");
+        jhs.add("顺深2斜");
         log.info("sicp数据采集任务执行");
         log.info("sicp数据采集任务执行");
         pullSICPDataService.pullData(jhs);
         pullSICPDataService.pullData(jhs);
     }
     }

+ 9 - 1
yujing-pull/src/main/resources/config/application.yml

@@ -6,6 +6,11 @@ spring:
     active: prod #local prod
     active: prod #local prod
   application:
   application:
     name: yujing-pull
     name: yujing-pull
+  security:
+    user:
+      name: admin
+      password: YujingPull@2025
+      roles: ADMIN
   mvc:
   mvc:
     static-path-pattern: /**
     static-path-pattern: /**
   jackson:
   jackson:
@@ -21,7 +26,7 @@ spring:
         max-wait: -1ms  #最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。
         max-wait: -1ms  #最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。
         min-idle: 0     #最小等待连接中的数量,设 0 为没有限制
         min-idle: 0     #最小等待连接中的数量,设 0 为没有限制
       shutdown-timeout: 100ms
       shutdown-timeout: 100ms
-    password: #123
+    password: #YjCjfuwu@2025 #123
     port: 6379
     port: 6379
 logging:
 logging:
   config: classpath:logback.xml
   config: classpath:logback.xml
@@ -46,3 +51,6 @@ biz:
     url2: http://10.66.51.10:5002/DasService/DataService/zjysssjjhsx/jhsx/cx
     url2: http://10.66.51.10:5002/DasService/DataService/zjysssjjhsx/jhsx/cx
     dataUrl: http://10.68.16.189:18080/Default/GetRealDatas
     dataUrl: http://10.68.16.189:18080/Default/GetRealDatas
     secretKey: 1qaz$RFV7ujm
     secretKey: 1qaz$RFV7ujm
+
+
+

+ 4 - 0
yujing-pumping-pressure/pom.xml

@@ -22,6 +22,10 @@
             <artifactId>yujing-warning-calculation</artifactId>
             <artifactId>yujing-warning-calculation</artifactId>
             <version>0.0.1-SNAPSHOT</version>
             <version>0.0.1-SNAPSHOT</version>
         </dependency>
         </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-security</artifactId>
+        </dependency>
     </dependencies>
     </dependencies>
     <properties>
     <properties>
         <maven.compiler.source>8</maven.compiler.source>
         <maven.compiler.source>8</maven.compiler.source>

+ 5 - 1
yujing-pumping-pressure/src/main/java/com/cn/tianji/PumpingPressureApplication.java

@@ -1,7 +1,9 @@
 package com.cn.tianji;
 package com.cn.tianji;
 
 
+import com.cn.tianji.config.DataSourceDecryptConfig;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.ConfigurableApplicationContext;
 
 
 /**
 /**
  * @author Zhao RenJi
  * @author Zhao RenJi
@@ -9,7 +11,9 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
 @SpringBootApplication
 @SpringBootApplication
 public class PumpingPressureApplication {
 public class PumpingPressureApplication {
     public static void main(String[] args) {
     public static void main(String[] args) {
-        SpringApplication.run(PumpingPressureApplication.class, args);
+        ConfigurableApplicationContext context =SpringApplication.run(PumpingPressureApplication.class, args);
+        DataSourceDecryptConfig config = context.getBean(DataSourceDecryptConfig.class);
+        System.out.println("DataSourceDecryptConfig 加载状态: " + (config != null ? "成功" : "失败"));
         System.out.println("泵压实时启动启动");
         System.out.println("泵压实时启动启动");
     }
     }
 }
 }

+ 37 - 0
yujing-pumping-pressure/src/main/java/com/cn/tianji/config/DataSourceDecryptConfig.java

@@ -0,0 +1,37 @@
+package com.cn.tianji.config;
+
+import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DataSourceProperty;
+import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceProperties;
+import com.cn.tianji.common.Sm4Util;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
+import org.springframework.context.annotation.Configuration;
+
+import javax.annotation.PostConstruct;
+import javax.annotation.Resource;
+
+@Configuration
+@ConditionalOnClass(DynamicDataSourceProperties.class)
+@Slf4j
+public class DataSourceDecryptConfig {
+    @Resource
+    private DynamicDataSourceProperties properties;
+
+    @PostConstruct
+    public void decryptDataSourcePasswords() {
+        log.warn("开始解密数据源密码...");
+        // 解密主数据源密码
+        decryptPassword(properties.getDatasource().get(properties.getPrimary()));
+
+        // 解密所有从数据源密码
+        properties.getDatasource().values().forEach(this::decryptPassword);
+        log.warn("解密数据源密码完成...");
+    }
+
+    private void decryptPassword(DataSourceProperty property) {
+        String password = property.getPassword();
+        if (password != null && password.startsWith(Sm4Util.ENC_PREFIX)) {
+            property.setPassword(Sm4Util.decrypt(password));
+        }
+    }
+}

+ 7 - 2
yujing-pumping-pressure/src/main/resources/config/application.yml

@@ -5,7 +5,12 @@ spring:
   profiles:
   profiles:
     active: prod #local
     active: prod #local
   application:
   application:
-    name: yujing-hook-load-warning
+    name: yujing-pumping-pressure-warning
+  security:
+    user:
+      name: admin
+      password: YujingPumpingPressure@2025
+      roles: ADMIN
   mvc:
   mvc:
     static-path-pattern: /**
     static-path-pattern: /**
     jackson:
     jackson:
@@ -21,7 +26,7 @@ spring:
         max-wait: -1ms  #最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。
         max-wait: -1ms  #最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。
         min-idle: 0     #最小等待连接中的数量,设 0 为没有限制
         min-idle: 0     #最小等待连接中的数量,设 0 为没有限制
       shutdown-timeout: 1000ms
       shutdown-timeout: 1000ms
-    password: #123
+    password: #YjCjfuwu@2025 #123
     port: 6379
     port: 6379
 logging:
 logging:
   config: classpath:logback.xml
   config: classpath:logback.xml

+ 4 - 0
yujing-torque/pom.xml

@@ -22,6 +22,10 @@
             <artifactId>yujing-warning-calculation</artifactId>
             <artifactId>yujing-warning-calculation</artifactId>
             <version>0.0.1-SNAPSHOT</version>
             <version>0.0.1-SNAPSHOT</version>
         </dependency>
         </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-security</artifactId>
+        </dependency>
     </dependencies>
     </dependencies>
     <properties>
     <properties>
         <maven.compiler.source>8</maven.compiler.source>
         <maven.compiler.source>8</maven.compiler.source>

+ 5 - 1
yujing-torque/src/main/java/com/cn/tianji/TorqueApplication.java

@@ -1,7 +1,9 @@
 package com.cn.tianji;
 package com.cn.tianji;
 
 
+import com.cn.tianji.config.DataSourceDecryptConfig;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.ConfigurableApplicationContext;
 
 
 /**
 /**
  * @author Zhao RenJi
  * @author Zhao RenJi
@@ -9,7 +11,9 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
 @SpringBootApplication
 @SpringBootApplication
 public class TorqueApplication {
 public class TorqueApplication {
     public static void main(String[] args) {
     public static void main(String[] args) {
-        SpringApplication.run(TorqueApplication.class, args);
+        ConfigurableApplicationContext context =SpringApplication.run(TorqueApplication.class, args);
+        DataSourceDecryptConfig config = context.getBean(DataSourceDecryptConfig.class);
+        System.out.println("DataSourceDecryptConfig 加载状态: " + (config != null ? "成功" : "失败"));
         System.out.println("扭矩实时启动");
         System.out.println("扭矩实时启动");
     }
     }
 }
 }

+ 37 - 0
yujing-torque/src/main/java/com/cn/tianji/config/DataSourceDecryptConfig.java

@@ -0,0 +1,37 @@
+package com.cn.tianji.config;
+
+import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DataSourceProperty;
+import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceProperties;
+import com.cn.tianji.common.Sm4Util;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
+import org.springframework.context.annotation.Configuration;
+
+import javax.annotation.PostConstruct;
+import javax.annotation.Resource;
+
+@Configuration
+@ConditionalOnClass(DynamicDataSourceProperties.class)
+@Slf4j
+public class DataSourceDecryptConfig {
+    @Resource
+    private DynamicDataSourceProperties properties;
+
+    @PostConstruct
+    public void decryptDataSourcePasswords() {
+        log.warn("开始解密数据源密码...");
+        // 解密主数据源密码
+        decryptPassword(properties.getDatasource().get(properties.getPrimary()));
+
+        // 解密所有从数据源密码
+        properties.getDatasource().values().forEach(this::decryptPassword);
+        log.warn("解密数据源密码完成...");
+    }
+
+    private void decryptPassword(DataSourceProperty property) {
+        String password = property.getPassword();
+        if (password != null && password.startsWith(Sm4Util.ENC_PREFIX)) {
+            property.setPassword(Sm4Util.decrypt(password));
+        }
+    }
+}

+ 20 - 16
yujing-torque/src/main/resources/config/application.yml

@@ -6,24 +6,28 @@ spring:
     active: prod #prod #local
     active: prod #prod #local
   application:
   application:
     name: yujing-torque
     name: yujing-torque
+  security:
+    user:
+      name: admin
+      password: YujingTorque@2025
+      roles: ADMIN
   mvc:
   mvc:
     static-path-pattern: /**
     static-path-pattern: /**
-    jackson:
-      time-zone: GMT+8
-      date-format: "yyyy-MM-dd HH:mm:ss"
-    data:
-      redis:
-        port: 6379
-        password: #123
-        database: 0
-        host: localhost  #127.0.0.1  #localhost
-        lettuce:
-          pool:
-            max-active: -1
-            max-idle: -1
-            max-wait: -1ms
-            min-idle: 0
-          shutdown-timeout: 1000ms
+  jackson:
+    time-zone: GMT+8
+    date-format: "yyyy-MM-dd HH:mm:ss"
+  redis:
+    database: 0
+    host: localhost
+    lettuce:
+      pool:
+        max-active: -1   #最大连接数据库连接数,设 -1 为没有限制
+        max-idle: -1     #最大等待连接中的数量,设 0 为没有限制
+        max-wait: -1ms  #最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。
+        min-idle: 0     #最小等待连接中的数量,设 0 为没有限制
+      shutdown-timeout: 1000ms
+    password: #YjCjfuwu@2025 #123
+    port: 6379
 logging:
 logging:
   config: classpath:logback.xml
   config: classpath:logback.xml
 mybatis-plus:
 mybatis-plus:

+ 4 - 0
yujing-total-pool-volume/pom.xml

@@ -22,6 +22,10 @@
             <artifactId>yujing-warning-calculation</artifactId>
             <artifactId>yujing-warning-calculation</artifactId>
             <version>0.0.1-SNAPSHOT</version>
             <version>0.0.1-SNAPSHOT</version>
         </dependency>
         </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-security</artifactId>
+        </dependency>
     </dependencies>
     </dependencies>
     <properties>
     <properties>
         <maven.compiler.source>8</maven.compiler.source>
         <maven.compiler.source>8</maven.compiler.source>

+ 5 - 1
yujing-total-pool-volume/src/main/java/com/cn/tianji/TotalPoolVolumeApplication.java

@@ -1,7 +1,9 @@
 package com.cn.tianji;
 package com.cn.tianji;
 
 
+import com.cn.tianji.config.DataSourceDecryptConfig;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.ConfigurableApplicationContext;
 
 
 /**
 /**
  * @author Zhao RenJi
  * @author Zhao RenJi
@@ -9,7 +11,9 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
 @SpringBootApplication
 @SpringBootApplication
 public class TotalPoolVolumeApplication {
 public class TotalPoolVolumeApplication {
     public static void main(String[] args) {
     public static void main(String[] args) {
-        SpringApplication.run(TotalPoolVolumeApplication.class, args);
+        ConfigurableApplicationContext context =SpringApplication.run(TotalPoolVolumeApplication.class, args);
+        DataSourceDecryptConfig config = context.getBean(DataSourceDecryptConfig.class);
+        System.out.println("DataSourceDecryptConfig 加载状态: " + (config != null ? "成功" : "失败"));
         System.out.println("TotalPoolVolume启动");
         System.out.println("TotalPoolVolume启动");
     }
     }
 }
 }

+ 37 - 0
yujing-total-pool-volume/src/main/java/com/cn/tianji/config/DataSourceDecryptConfig.java

@@ -0,0 +1,37 @@
+package com.cn.tianji.config;
+
+import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DataSourceProperty;
+import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceProperties;
+import com.cn.tianji.common.Sm4Util;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
+import org.springframework.context.annotation.Configuration;
+
+import javax.annotation.PostConstruct;
+import javax.annotation.Resource;
+
+@Configuration
+@ConditionalOnClass(DynamicDataSourceProperties.class)
+@Slf4j
+public class DataSourceDecryptConfig {
+    @Resource
+    private DynamicDataSourceProperties properties;
+
+    @PostConstruct
+    public void decryptDataSourcePasswords() {
+        log.warn("开始解密数据源密码...");
+        // 解密主数据源密码
+        decryptPassword(properties.getDatasource().get(properties.getPrimary()));
+
+        // 解密所有从数据源密码
+        properties.getDatasource().values().forEach(this::decryptPassword);
+        log.warn("解密数据源密码完成...");
+    }
+
+    private void decryptPassword(DataSourceProperty property) {
+        String password = property.getPassword();
+        if (password != null && password.startsWith(Sm4Util.ENC_PREFIX)) {
+            property.setPassword(Sm4Util.decrypt(password));
+        }
+    }
+}

+ 15 - 5
yujing-total-pool-volume/src/main/resources/config/application.yml

@@ -6,6 +6,11 @@ spring:
     active: prod #local prod
     active: prod #local prod
   application:
   application:
     name: yujing-total-pool-volume
     name: yujing-total-pool-volume
+  security:
+    user:
+      name: admin
+      password: YujingTotalPool@2025
+      roles: ADMIN
   mvc:
   mvc:
     static-path-pattern: /**
     static-path-pattern: /**
     jackson:
     jackson:
@@ -16,12 +21,17 @@ spring:
     host: localhost
     host: localhost
     lettuce:
     lettuce:
       pool:
       pool:
-        max-active: -1   #最大连接数据库连接数,设 -1 为没有限制
-        max-idle: 0     #最大等待连接中的数量,设 0 为没有限制
-        max-wait: -1ms  #最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。
-        min-idle: 0     #最小等待连接中的数量,设 0 为没有限制
+        max-active: 100  # 从-1改为有限连接数
+        max-idle: 50     # 设置最大空闲连接
+        max-wait: 30000ms # 设置最大等待时间(30秒)
+        min-idle: 5      # 保持最小空闲连接
       shutdown-timeout: 1000ms
       shutdown-timeout: 1000ms
-    password: #123
+#        max-active: -1   #最大连接数据库连接数,设 -1 为没有限制
+#        max-idle: -1     #最大等待连接中的数量,设 0 为没有限制
+#        max-wait: -1ms  #最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。
+#        min-idle: 0     #最小等待连接中的数量,设 0 为没有限制
+#      shutdown-timeout: 1000ms
+    password: #YjCjfuwu@2025 #123
     port: 6379
     port: 6379
 logging:
 logging:
   config: classpath:logback.xml
   config: classpath:logback.xml

+ 1 - 0
yujing-warning-calculation/pom.xml

@@ -23,6 +23,7 @@
             <version>13.0</version>
             <version>13.0</version>
             <scope>compile</scope>
             <scope>compile</scope>
         </dependency>
         </dependency>
+
     </dependencies>
     </dependencies>
 
 
     <properties>
     <properties>

+ 46 - 0
yujing-warning-calculation/src/main/java/com/cn/tianji/common/CaffeineCacheUtil.java

@@ -0,0 +1,46 @@
+package com.cn.tianji.common;
+
+import com.github.benmanes.caffeine.cache.Cache;
+import com.github.benmanes.caffeine.cache.Caffeine;
+
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.locks.ReentrantReadWriteLock;
+
+public class CaffeineCacheUtil<K, V> {
+    private final Cache<K, V> cache;
+
+    private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
+
+    public CaffeineCacheUtil(long duration, TimeUnit timeUnit) {
+        this.cache = Caffeine.newBuilder()
+                .expireAfterWrite(duration, timeUnit)
+                .build();
+    }
+
+    public V get(K key) {
+        lock.readLock().lock();
+        try {
+            return cache.getIfPresent(key);
+        } finally {
+            lock.readLock().unlock();
+        }
+    }
+
+    public void put(K key, V value) {
+        lock.writeLock().lock();
+        try {
+            cache.put(key, value);
+        } finally {
+            lock.writeLock().unlock();
+        }
+    }
+
+    public void invalidate(K key) {
+        lock.writeLock().lock();
+        try {
+            cache.invalidate(key);
+        } finally {
+            lock.writeLock().unlock();
+        }
+    }
+}

+ 484 - 0
yujing-warning-calculation/src/main/java/com/cn/tianji/service/impl/ComprehensiveWarnServiceImpl.java

@@ -0,0 +1,484 @@
+package com.cn.tianji.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.ObjectUtil;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.cn.tianji.common.CaffeineCacheUtil;
+import com.cn.tianji.entity.YjComprehensiveLog;
+import com.cn.tianji.entity.YjComprehensiveRealLog;
+import com.cn.tianji.service.*;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+
+@Service
+@Slf4j
+public class ComprehensiveWarnServiceImpl implements  ComprehensiveWarnService{
+
+    @Resource
+    private YjRealTimeLogService yjRealTimeLogService;
+
+    @Resource
+    private HookLoadWarnLogService hookLoadWarnLogService;
+
+    @Resource
+    private PumpingPressureWarnLogService pumpingPressureWarnLogService;
+
+    @Resource
+    private TorqueWarnLogService torqueWarnLogService;
+
+    @Resource
+    private TotalPoolVolumeWarnLogService totalPoolVolumeWarnLogService;
+
+    @Resource
+    private YjComprehensiveRealLogService yjComprehensiveRealLogService;
+
+    @Resource
+    private YjComprehensiveLogService yjComprehensiveLogService;
+
+    @Resource
+    private WellDrillingService wellDrillingService;
+
+    CaffeineCacheUtil<String, String> cache = new CaffeineCacheUtil<>(48, TimeUnit.HOURS);
+
+    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+
+    private String jhSuffix="times";
+    /**
+     * 综合复杂异常计算流程:
+     * 1.获取在线实时井数据
+     * 2.获取当前时间
+     * 3.获取每口井当前的最新一条录井数据
+     * 4.判断当前井工况
+     * 5.根据时间获取当前时间往前30分钟的4类异常数据
+     * 6.根据工况类型经行不同的综合异常判断
+     */
+    @Override
+    public void comprehensiveWarnJhList(){
+        List<String> realTimeLogJhList = yjRealTimeLogService.getRealTimeLogJhList();
+        BigDecimal duration=BigDecimal.valueOf(30);
+        realTimeLogJhList.forEach(item->{
+            comprehensiveWarn(item,duration);
+        });
+        log.info("综合计算完成");
+    }
+
+
+
+    public void comprehensiveWarn(String jh, BigDecimal duration){
+        //风险数据
+        BigDecimal jlRisk =BigDecimal.ZERO;
+        BigDecimal ylRisk =BigDecimal.ZERO;
+        BigDecimal qzQxzZctjFx =BigDecimal.ZERO;
+        BigDecimal qzQxzGzFx =BigDecimal.ZERO;
+        BigDecimal qzZjGzFx =BigDecimal.ZERO;
+        BigDecimal qzZjNjFx =BigDecimal.ZERO;
+        BigDecimal qzZjByFx =BigDecimal.ZERO;
+        BigDecimal qzZfx =BigDecimal.ZERO;
+        //井漏溢流总池体积权重
+        BigDecimal jyZctjQz=BigDecimal.ZERO;
+        String workingCondition="起下钻";
+        //获取当前时间
+        //获取每口井当前的最新一条录井数据
+        //判断当前井工况
+        //根据时间获取当前时间往前30分钟的4类异常数据
+        //根据工况类型经行不同的综合异常判断
+        String startTime = getJhTimeByJh(jh);
+        if(startTime != null){
+            String endTime = calculateEndTime(startTime, duration);
+            JSONObject workingConditionJson = wellDrillingService.getWorkingConditionByJhAndTime(jh, startTime, endTime);
+            workingCondition= workingConditionJson.getString("workingCondition");
+            if("未知".equals(workingCondition)){
+                log.error("未获取到{}工况信息::{}",jh,workingCondition);
+                return;
+            }
+            log.info("获取到{}工况信息::{}",jh,workingCondition);
+            //获取钩载异常数量
+            BigDecimal hookWarnCount = hookLoadWarnLogService.getCountByJh(jh, startTime, endTime);
+            //获取扭矩异常数量
+            BigDecimal torqueWarnCount =torqueWarnLogService.getCountByJh(jh,startTime,endTime);
+            //获取泵压异常数量
+            BigDecimal pumpingPressureWarnCount =pumpingPressureWarnLogService.getCountByJh(jh,startTime,endTime);
+            //获取总池体积异常数量(井漏)
+            BigDecimal totalPoolVolumeJlWarnCount =totalPoolVolumeWarnLogService.getCountByJh(jh,"井漏",startTime,endTime);
+            //获取总池体积异常数量(溢流)
+            BigDecimal totalPoolVolumeYlWarnCount =totalPoolVolumeWarnLogService.getCountByJh(jh,"溢流",startTime,endTime);
+            // ... 后续处理代码 ...
+            //计算井漏溢流风险权重
+            JSONObject jlYlFx = jsJlYlFx(totalPoolVolumeJlWarnCount, totalPoolVolumeYlWarnCount);
+            jlRisk = jlYlFx.getBigDecimal("jlRisk");
+            ylRisk = jlYlFx.getBigDecimal("ylRisk");
+            //计算卡钻风险权重
+            JSONObject qzFx = jsQzFx(hookWarnCount, torqueWarnCount, pumpingPressureWarnCount,
+                    totalPoolVolumeJlWarnCount, totalPoolVolumeYlWarnCount, workingCondition);
+            if("起下钻".equals(workingCondition)){
+                //总池体积
+                qzQxzZctjFx = qzFx.getBigDecimal("qzQxzZctjQz");
+                //钩载
+                qzQxzGzFx = qzFx.getBigDecimal("qzQxzGzQz");
+            }else if("钻进".equals(workingCondition)){
+                //钩载
+                qzZjGzFx = qzFx.getBigDecimal("qzZjGzQz");
+                //扭矩
+                qzZjNjFx = qzFx.getBigDecimal("qzZjNjQz");
+                //泵压
+                qzZjByFx = qzFx.getBigDecimal("qzZjByQz");
+            }
+            //卡钻总风险值
+            qzZfx = qzFx.getBigDecimal("totalRisk");
+            log.info("综合异常:井号:{};开始时间:{};结束时间:{};工况:{},动作:{},井深:{},井漏风险:{};溢流风险:{};卡钻风险:{}",jh,startTime,endTime,workingCondition,workingConditionJson.getString("motion"),
+                    workingConditionJson.getBigDecimal("depth"),jlRisk,ylRisk,qzZfx);
+            List<YjComprehensiveLog> saveList = createSaveList(jh, startTime, endTime, workingCondition, jlRisk, ylRisk, qzZfx);
+            saveList.forEach(item->{
+                item.setMotion(workingConditionJson.getString("motion"));
+                item.setDepth(workingConditionJson.getBigDecimal("depth"));
+                yjComprehensiveLogService.save(item);
+                QueryWrapper<YjComprehensiveRealLog> wrapper=new QueryWrapper<>();
+                wrapper.lambda().eq(YjComprehensiveRealLog::getJh,jh).eq(YjComprehensiveRealLog::getWarnType,item.getWarnType());
+                YjComprehensiveRealLog one = yjComprehensiveRealLogService.getOne(wrapper);
+                if (ObjectUtil.isNotEmpty(one)){
+                    one.setWarnTime(item.getWarnTime());
+                    one.setWarnLevel(item.getWarnLevel().doubleValue());
+                    one.setWorkingCondition(item.getWorkingCondition());
+                    one.setWarnContent(item.getWarnContent());
+                    one.setStartTime(item.getStartTime());
+                    one.setEndTime(item.getEndTime());
+                    one.setMotion(item.getMotion());
+                    one.setDepth(item.getDepth());
+                    yjComprehensiveRealLogService.updateById(one);
+                }else{
+                    YjComprehensiveRealLog yjComprehensiveRealLog = BeanUtil.copyProperties(item, YjComprehensiveRealLog.class);
+                    yjComprehensiveRealLogService.save(yjComprehensiveRealLog);
+                }
+            });
+            setJhTime(jh,endTime);
+        }else{
+            Date startDate = new Date();
+            startTime=sdf.format(startDate);
+            String endTime = calculateEndTime(startTime, duration);
+            JSONObject workingConditionJson = wellDrillingService.getWorkingConditionByJhAndTime(jh, startTime, endTime);
+            List<YjComprehensiveLog> saveList = createSaveList(jh, startTime, endTime, workingCondition, jlRisk, ylRisk, qzZfx);
+            saveList.forEach(item->{
+                item.setMotion(workingConditionJson.getString("motion"));
+                item.setDepth(workingConditionJson.getBigDecimal("depth"));
+                YjComprehensiveRealLog saveModel = BeanUtil.copyProperties(item, YjComprehensiveRealLog.class);
+                yjComprehensiveRealLogService.save(saveModel);
+            });
+
+        }
+    }
+
+    public List<YjComprehensiveLog> createSaveList(String jh,String startTime,String endTime,String workingCondition,BigDecimal jlRisk,BigDecimal ylRisk,BigDecimal qzZfx){
+        List<YjComprehensiveLog> saveList=new ArrayList<>();
+        for (int i=0;i<3;i++){
+            YjComprehensiveLog saveLog = new YjComprehensiveLog();
+            saveLog.setJh(jh);
+            saveLog.setWarnTime(endTime);
+            saveLog.setWorkingCondition(workingCondition);
+            saveLog.setCreateTime(new Date());
+            try {
+                saveLog.setStartTime(sdf.parse(startTime));
+                saveLog.setEndTime(sdf.parse(endTime));
+            } catch (ParseException e) {
+                throw new RuntimeException(e);
+            }
+            switch (i){
+                case 0:
+                    saveLog.setWarnType("井漏");
+                    saveLog.setWarnLevel(jlRisk);
+                    break;
+                case 1:
+                    saveLog.setWarnType("溢流");
+                    saveLog.setWarnLevel(ylRisk);
+                    break;
+                case 2:
+                    saveLog.setWarnType("卡钻");
+                    saveLog.setWarnLevel(qzZfx);
+                    break;
+                default:break;
+            }
+            saveList.add(saveLog);
+        }
+        return saveList;
+    }
+
+    /**
+     * 计算井漏溢流风险
+     * @param totalPoolVolumeJlWarnCount 获取总池体积异常数量(井漏)
+     * @param totalPoolVolumeYlWarnCount 获取总池体积异常数量(溢流)
+     */
+    public JSONObject jsJlYlFx(BigDecimal totalPoolVolumeJlWarnCount, BigDecimal totalPoolVolumeYlWarnCount){
+        // 井漏风险计算
+        BigDecimal jlRisk = calculateRiskFactor(totalPoolVolumeJlWarnCount);
+        // 溢流风险计算
+        BigDecimal ylRisk = calculateRiskFactor(totalPoolVolumeYlWarnCount);
+        // 总风险值 = 井漏风险 + 溢流风险
+        BigDecimal totalRisk = jlRisk.add(ylRisk);
+        JSONObject res = new JSONObject();
+        res.put("jlRisk", jlRisk);
+        res.put("ylRisk", ylRisk);
+        // 这里可以添加实际业务处理逻辑,如保存计算结果
+        log.info("井漏风险值:{},溢流风险值:{},总风险值:{}", jlRisk, ylRisk, totalRisk);
+        return res;
+    }
+
+    /**
+     * 通用风险系数计算
+     * @param count 异常次数
+     * @return 风险系数
+     */
+    private BigDecimal calculateRiskFactor(BigDecimal count) {
+        if (count == null || count.compareTo(BigDecimal.ZERO) <= 0) {
+            return BigDecimal.ZERO;
+        }
+
+        if (count.compareTo(BigDecimal.valueOf(10)) <= 0) {
+            return new BigDecimal("0.3");
+        } else if (count.compareTo(BigDecimal.valueOf(30)) <= 0) {
+            return new BigDecimal("0.5");
+        } else if (count.compareTo(BigDecimal.valueOf(60)) <= 0) {
+            return new BigDecimal("0.8");
+        } else {
+            return BigDecimal.ONE;
+        }
+    }
+
+    /**
+     * 卡钻风险计算
+     * @param hookWarnCount 钩载异常数量
+     * @param torqueWarnCount 扭矩异常数量
+     * @param pumpingPressureWarnCount 泵压异常数量
+     * @param totalPoolVolumeJlWarnCount 总池体积异常数量(井漏)
+     * @param totalPoolVolumeYlWarnCount 总池体积异常数量(溢流)
+     * @param workingCondition 工况
+     * @return totalRisk 总风险值
+     */
+    public JSONObject jsQzFx(BigDecimal hookWarnCount,BigDecimal torqueWarnCount, BigDecimal pumpingPressureWarnCount,
+                             BigDecimal totalPoolVolumeJlWarnCount,BigDecimal totalPoolVolumeYlWarnCount,String workingCondition){
+        JSONObject res=new JSONObject();
+        // 风险权重计算参数配置
+        BigDecimal[] thresholds = {BigDecimal.valueOf(10), BigDecimal.valueOf(30)};
+        BigDecimal[] factors = {BigDecimal.valueOf(0.5), BigDecimal.valueOf(0.8), BigDecimal.ONE};
+
+        // 各风险项计算
+        BigDecimal qzQxzGzQz = calculateWeightedRisk(hookWarnCount, thresholds, factors, BigDecimal.valueOf(70));
+        BigDecimal qzQxzZctjQz = calculateTotalPoolRisk(totalPoolVolumeJlWarnCount, totalPoolVolumeYlWarnCount);
+        BigDecimal qzZjGzQz = calculateWeightedRisk(hookWarnCount, thresholds, factors, BigDecimal.valueOf(20));
+        BigDecimal qzZjByQz = calculateWeightedRisk(pumpingPressureWarnCount, thresholds, factors, BigDecimal.valueOf(45));
+        BigDecimal qzZjNjQz = calculateWeightedRisk(torqueWarnCount, thresholds, factors, BigDecimal.valueOf(45));
+
+        BigDecimal totalRisk=BigDecimal.ZERO;
+        if("起下钻".equals(workingCondition)){
+            totalRisk = qzQxzGzQz.add(qzQxzZctjQz);
+            res.put("qzQxzGzQz", qzQxzGzQz);
+            res.put("qzQxzZctjQz", qzQxzZctjQz);
+        }else if ("钻进".equals(workingCondition)) {
+            totalRisk = qzZjGzQz.add(qzZjByQz).add(qzZjNjQz);
+            res.put("qzZjGzQz", qzZjGzQz);
+            res.put("qzZjByQz", qzZjByQz);
+            res.put("qzZjNjQz", qzZjNjQz);
+        }
+        res.put("totalRisk", totalRisk);
+        return res;
+    }
+
+    /**
+     * 通用权重风险计算
+     * @param count 异常次数
+     * @param thresholds 阈值数组 [10,30]
+     * @param factors 系数数组 [0.5,0.8,1.0]
+     * @param baseWeight 基础权重值
+     */
+    private BigDecimal calculateWeightedRisk(BigDecimal count, BigDecimal[] thresholds,
+                                             BigDecimal[] factors, BigDecimal baseWeight) {
+        if (count == null || count.compareTo(BigDecimal.ZERO) <= 0) {
+            return BigDecimal.ZERO;
+        }
+
+        BigDecimal factor = count.compareTo(thresholds[1]) > 0 ? factors[2] :
+                count.compareTo(thresholds[0]) > 0 ? factors[1] : factors[0];
+
+        return baseWeight.multiply(factor);
+    }
+
+    /**
+     * 总池体积风险计算
+     * @param jlCount 井漏次数
+     * @param ylCount 溢流次数
+     */
+    private BigDecimal calculateTotalPoolRisk(BigDecimal jlCount, BigDecimal ylCount) {
+        BigDecimal total = jlCount.add(ylCount);
+        BigDecimal[] thresholds = {BigDecimal.valueOf(10), BigDecimal.valueOf(30)};
+        BigDecimal[] factors = {BigDecimal.valueOf(0.5), BigDecimal.valueOf(0.8), BigDecimal.ONE};
+
+        return calculateWeightedRisk(total, thresholds, factors, BigDecimal.valueOf(30));
+    }
+
+//    /**
+//     * 卡钻风险计算
+//     * @param hookWarnCount 钩载异常数量
+//     * @param torqueWarnCount 扭矩异常数量
+//     * @param pumpingPressureWarnCount 泵压异常数量
+//     * @param totalPoolVolumeJlWarnCount 总池体积异常数量(井漏)
+//     * @param totalPoolVolumeYlWarnCount 总池体积异常数量(溢流)
+//     * @param workingCondition 工况
+//     * @return totalRisk 总风险值
+//     */
+//    public JSONObject jsQzFx(BigDecimal hookWarnCount,BigDecimal torqueWarnCount, BigDecimal pumpingPressureWarnCount,
+//                       BigDecimal totalPoolVolumeJlWarnCount,BigDecimal totalPoolVolumeYlWarnCount,String workingCondition){
+//        JSONObject res=new JSONObject();
+//        //卡钻起下钻总池体积权重
+//        BigDecimal qzQxzZctjQz=BigDecimal.ZERO;
+//        //卡钻起下钻钩载权重
+//        BigDecimal qzQxzGzQz=BigDecimal.ZERO;
+//        //卡钻钻进钩载权重
+//        BigDecimal qzZjGzQz=BigDecimal.ZERO;
+//        //卡钻钻进扭矩权重
+//        BigDecimal qzZjNjQz=BigDecimal.ZERO;
+//        //卡钻钻井泵压权重
+//        BigDecimal qzZjByQz=BigDecimal.ZERO;
+//
+//        BigDecimal totalRisk=BigDecimal.ZERO;
+//        if("起下钻".equals(workingCondition)){
+//            // 计算起下钻钩载权重
+//            if(hookWarnCount.compareTo(BigDecimal.ZERO) > 0){
+//                if(hookWarnCount.compareTo(BigDecimal.valueOf(10)) <= 0){
+//                    qzQxzGzQz = BigDecimal.valueOf(70 * 0.5);
+//                } else if(hookWarnCount.compareTo(BigDecimal.valueOf(30)) <= 0){
+//                    qzQxzGzQz = BigDecimal.valueOf(70 * 0.8);
+//                } else {
+//                    qzQxzGzQz = BigDecimal.valueOf(70);
+//                }
+//            }
+//
+//            // 计算总池体积异常总数(井漏+溢流)
+//            BigDecimal totalPoolCount = totalPoolVolumeJlWarnCount.add(totalPoolVolumeYlWarnCount);
+//
+//            // 计算起下钻总池体积权重
+//            if(totalPoolCount.compareTo(BigDecimal.ZERO) > 0){
+//                if(totalPoolCount.compareTo(BigDecimal.valueOf(10)) <= 0){
+//                    qzQxzZctjQz = BigDecimal.valueOf(30 * 0.5);
+//                } else if(totalPoolCount.compareTo(BigDecimal.valueOf(30)) <= 0){
+//                    qzQxzZctjQz = BigDecimal.valueOf(30 * 0.8);
+//                } else {
+//                    qzQxzZctjQz = BigDecimal.valueOf(30);
+//                }
+//            }
+//            totalRisk = qzQxzGzQz.add(qzQxzZctjQz);
+//            res.put("qzQxzGzQz",qzQxzGzQz);
+//            res.put("qzQxzZctjQz",qzQxzZctjQz);
+//        }else if ("钻进".equals(workingCondition)) {
+//            // 钻进钩载权重计算
+//            if (hookWarnCount.compareTo(BigDecimal.ZERO) > 0) {
+//                if (hookWarnCount.compareTo(BigDecimal.valueOf(10)) <= 0) {
+//                    qzZjGzQz = BigDecimal.valueOf(20 * 0.5);
+//                } else if (hookWarnCount.compareTo(BigDecimal.valueOf(30)) <= 0) {
+//                    qzZjGzQz = BigDecimal.valueOf(20 * 0.8);
+//                } else {
+//                    qzZjGzQz = BigDecimal.valueOf(20);
+//                }
+//            }
+//
+//            // 钻进泵压权重计算
+//            if (pumpingPressureWarnCount.compareTo(BigDecimal.ZERO) > 0) {
+//                if (pumpingPressureWarnCount.compareTo(BigDecimal.valueOf(10)) <= 0) {
+//                    qzZjByQz = BigDecimal.valueOf(45 * 0.5);
+//                } else if (pumpingPressureWarnCount.compareTo(BigDecimal.valueOf(30)) <= 0) {
+//                    qzZjByQz = BigDecimal.valueOf(45 * 0.8);
+//                } else {
+//                    qzZjByQz = BigDecimal.valueOf(45);
+//                }
+//            }
+//
+//            // 钻进扭矩权重计算
+//            if (torqueWarnCount.compareTo(BigDecimal.ZERO) > 0) {
+//                if (torqueWarnCount.compareTo(BigDecimal.valueOf(10)) <= 0) {
+//                    qzZjNjQz = BigDecimal.valueOf(45 * 0.5);
+//                } else if (torqueWarnCount.compareTo(BigDecimal.valueOf(30)) <= 0) {
+//                    qzZjNjQz = BigDecimal.valueOf(45 * 0.8);
+//                }
+//                // 根据需求文档,扭矩异常数量>30的情况未指定,保持默认值0
+//            }
+//            // 最终风险值计算(示例)
+//            totalRisk = qzZjGzQz.add(qzZjByQz).add(qzZjNjQz);
+//            res.put("qzZjGzQz",qzZjGzQz);
+//            res.put("qzZjByQz",qzZjNjQz);
+//            res.put("qzZjNjQz",qzZjNjQz);
+//        }
+//        res.put("totalRisk",totalRisk);
+//        return res;
+//    }
+
+    public void setJhTime(String jh,String endTime){
+        String key = jh+jhSuffix;
+        JSONObject jhTimeJson = new JSONObject();
+        jhTimeJson.put("time", endTime);
+        jhTimeJson.put("jh", jh);
+        cache.put(key, jhTimeJson.toJSONString());
+    }
+
+    /**
+     * 获取当前井的最新计算时间
+     * @param jh
+     */
+    public String getJhTimeByJh(String jh) {
+        // 使用更明确的缓存键名
+        String key = jh+jhSuffix;
+        String cachedValue = cache.get(key);
+        if (cachedValue != null) {
+            try {
+                JSONObject jhTimeJson = JSONObject.parseObject(cachedValue);
+                if (jhTimeJson != null && jhTimeJson.containsKey("time")) {
+                    return jhTimeJson.getString("time");
+                }
+            } catch (Exception e) {
+                log.error("解析缓存JSON失败, key: {}, value: {}", key, cachedValue, e);
+                // 解析失败时清除缓存
+                cache.invalidate(key);
+            }
+        }
+
+        // 查询数据库获取最新时间
+        List<YjComprehensiveRealLog> comprehensiveRealList = yjComprehensiveRealLogService.getRealTimeLogByJh(jh);
+        if (!comprehensiveRealList.isEmpty()) {
+            YjComprehensiveRealLog yjRealTimeLog = comprehensiveRealList.get(0);
+            Date endTime = yjRealTimeLog.getEndTime();
+            String res = sdf.format(endTime);
+            // 构建缓存值
+            JSONObject jhTimeJson = new JSONObject();
+            jhTimeJson.put("time", res);
+            jhTimeJson.put("jh", jh);
+            cache.put(key, jhTimeJson.toJSONString());
+            return res;
+        }
+        return null;
+    }
+
+    /**
+     * 根据开始时间和持续时间计算结束时间
+     * @param startTime 开始时间字符串 (格式: yyyy-MM-dd HH:mm:ss)
+     * @param duration 持续时间(分钟)
+     * @return 结束时间字符串 (格式: yyyy-MM-dd HH:mm:ss)
+     */
+    private String calculateEndTime(String startTime, BigDecimal duration) {
+        try {
+            Date startDate = sdf.parse(startTime);
+            long endTimeMillis = startDate.getTime() + duration.longValue() * 60 * 1000;
+            return sdf.format(new Date(endTimeMillis));
+        } catch (Exception e) {
+            log.error("时间计算异常, 开始时间: {}, duration: {}", startTime, duration, e);
+            return null;
+        }
+    }
+
+
+}