Bladeren bron

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

zhao.renji 4 dagen geleden
bovenliggende
commit
08cb65b085
76 gewijzigde bestanden met toevoegingen van 3176 en 63 verwijderingen
  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>
             <groupId>org.apache.rocketmq</groupId>
             <artifactId>rocketmq-spring-boot-starter</artifactId>
-            <version>2.1.1</version>
+            <version>2.3.3</version>
         </dependency>
 <!--        <dependency>-->
 <!--            <groupId>com.aliyun.openservices</groupId>-->
@@ -125,7 +125,13 @@
         <dependency>
             <groupId>cn.hutool</groupId>
             <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>
@@ -133,6 +139,31 @@
             <artifactId>lombok</artifactId>
             <optional>true</optional>
         </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>
 
     <build>

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

@@ -1,11 +1,15 @@
 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 org.apache.commons.lang3.EnumUtils;
 
 import java.lang.reflect.Method;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
+import java.text.ParseException;
 import java.util.*;
 
 @Slf4j
@@ -148,4 +152,154 @@ public class CommonUtils {
         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(平均)
      */
-    @JSONField(name = "hs4a")
+    @JSONField(name = "hs5a")
     private String HS5A;
 
     /**
@@ -396,6 +396,10 @@ public class WellDrillingSICP implements Serializable {
     @JSONField(name = "sigma")
     private String SIGMA;
 
+
+
+
+    /***/
     /**
      *方入
      */
@@ -523,7 +527,7 @@ public class WellDrillingSICP implements Serializable {
     private String LHQBFHLLINE;
 
     /**
-     *井号
+     *DCSN
      */
     @JSONField(name = "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
 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"})
     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,
                                                   String mobilDrillingToolsEndTime,BigDecimal hkhStart,BigDecimal hkhEnd,
                                                   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,
                                                         Date referenceTime,BigDecimal referenceSpp,BigDecimal referenceTotalPump,BigDecimal totalPumpSub,BigDecimal sppSub,
                                                         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 扭矩实体类数据
      */
     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,
                                                         Date referenceEndTime, BigDecimal rateStartPittotal, Date rateStartTime, Date rateEndTime, BigDecimal pittotalSub, BigDecimal ratePittotalSub, BigDecimal referenceWarnValue,
                                                         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;
 
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.cn.tianji.entity.WellDrilling;
@@ -25,5 +26,7 @@ public interface WellDrillingService extends IService<WellDrilling> {
 
     List<WellDrilling> sicpToLtdData(List<WellDrillingSICP> sicpList);
 
+    JSONObject getWorkingConditionByJhAndTime(String jh, String startTime, String endTime);
+
     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 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;
 
 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.service.impl.ServiceImpl;
 import com.cn.tianji.entity.HookLoadWarnLog;
@@ -239,4 +239,14 @@ public class HookLoadWarnLogServiceImpl  extends ServiceImpl<HookLoadWarnLogMapp
         model.setCreateTime(new Date());
         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;
 
 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.service.impl.ServiceImpl;
 import com.cn.tianji.entity.PumpingPressureWarnLog;
@@ -117,4 +118,14 @@ public class PumpingPressureWarnLogServiceImpl  extends ServiceImpl<PumpingPress
         model.setCreateTime(new Date());
         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;
 
 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.service.impl.ServiceImpl;
 import com.cn.tianji.entity.TorqueWarnLog;
 import com.cn.tianji.mapper.TorqueWarnLogMapper;
 import com.cn.tianji.service.TorqueWarnLogService;
 import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
@@ -168,4 +168,14 @@ public class TorqueWarnLogServiceImpl  extends ServiceImpl<TorqueWarnLogMapper,
         model.setWarnDes(warnDes);
         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;
 
 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.service.impl.ServiceImpl;
 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.stereotype.Service;
 
-import javax.xml.crypto.Data;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.text.SimpleDateFormat;
@@ -133,4 +133,15 @@ public class TotalPoolVolumeWarnLogServiceImpl  extends ServiceImpl<TotalPoolVol
         model.setCreateTime(new Date());
         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;
 
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.cn.tianji.entity.WellDrilling;
@@ -40,7 +41,7 @@ public class WellDrillingServiceImpl extends ServiceImpl<WellDrillingMapper, Wel
     public String getTableCode(String AJH) {
         //井号预处理
         String s = AJH.replace('-', '_').toUpperCase();
-        return "\"LTD_" + s ;
+        return "LTD_" + s ;
     }
 
     @Override
@@ -64,8 +65,8 @@ public class WellDrillingServiceImpl extends ServiceImpl<WellDrillingMapper, Wel
     };
 
     @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 ;
     }
 
+    /**
+     * 根据井号、时间获取整体工况
+     * @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
     public WellDrilling sicpToLtd(WellDrillingSICP item) {
         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;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.cn.tianji.common.StringUtils;
 import com.cn.tianji.entity.YjRealTimeLog;
 import com.cn.tianji.mapper.YjRealTimeLogMapper;
 import com.cn.tianji.service.WellDrillingService;
-import com.cn.tianji.service.YjDrillingDataSupplementationLogService;
 import com.cn.tianji.service.YjRealTimeLogService;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
-import java.time.Duration;
-import java.time.LocalDate;
-import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
+import java.util.stream.Collectors;
 
 @Service
 public class YjRealTimeLogServiceImpl extends ServiceImpl<YjRealTimeLogMapper, YjRealTimeLog> implements YjRealTimeLogService {
@@ -114,4 +112,14 @@ public class YjRealTimeLogServiceImpl extends ServiceImpl<YjRealTimeLogMapper, Y
             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;
 
 
+import com.cn.tianji.config.DataSourceDecryptConfig;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.ConfigurableApplicationContext;
+import org.springframework.scheduling.annotation.EnableScheduling;
 
 /**
  * @author Zhao RenJi
  */
 @SpringBootApplication
+@EnableScheduling
 public class ConditionIdentificationApplication {
     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启动");
     }
 }

+ 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();
     }
 
+    @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);
     }
 
+
+
 }

+ 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
     private YjPumpingWarnValueService pumpingWarnValueService;
 
+    @Resource
+    private ComprehensiveWarnService comprehensiveWarnService;
 
     @Resource
     private RedisUtil redisUtil;
@@ -541,4 +543,9 @@ public class WorkingConditionCalculationServiceImpl implements WorkingConditionC
         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
      */
     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
         # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
         filters: stat,wall,slf4j
-        # 通过connectProperties属性来打开mergeSql功能;慢SQL记录
-        connectionProperties: druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000
+
       datasource:
         master:
           driver-class-name: oracle.jdbc.OracleDriver
           url: jdbc:oracle:thin:@//10.66.116.46:1521/JT_ZJ
           username: jtznyj
-          password: jtznyj#2021
+          password: sm4:b7594dc6c405b4c538b3c4fda1b299d8 #jtznyj#2021
         chartDataSource:
           driver-class-name: oracle.jdbc.OracleDriver
           url: jdbc:oracle:thin:@//10.66.116.46/jt
           username: jtgcyth2018
-          password: Sljtyw_2018
+          password: sm4:0b8be0edbf2b1dd8c81c71e10e31b332 #Sljtyw_2018
         yjDataSource:
           driver-class-name: oracle.jdbc.OracleDriver
           url: jdbc:oracle:thin:@//10.66.116.46:1521/JT_LJ
           username: tj_zjgc
-          password: ZjgcTJ#zjgc@2024
+          password: sm4:cbcb44d61c6086e05cf39c8eab48adbaaa8e81cd743fbd809c2ca6a723b412ac #ZjgcTJ#zjgc@2024
         zjyDataSource:
           driver-class-name: oracle.jdbc.OracleDriver
           url: jdbc:oracle:thin:@//10.66.116.46:1521/JT_ZJ
           username: zjycs
-          password: Zjy_2019
+          password: sm4:9f769933c70034b0daf8ec0ca339522b #Zjy_2019
 #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
   mvc:
     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:
     database: 0
     host: localhost
@@ -22,7 +26,7 @@ spring:
         max-wait: -1ms  #最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。
         min-idle: 0     #最小等待连接中的数量,设 0 为没有限制
       shutdown-timeout: 100ms
-    password: 123
+    password: YjJcfuwu@2025 #123
     port: 6379
 logging:
   config: classpath:logback.xml

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

@@ -22,6 +22,10 @@
             <artifactId>yujing-warning-calculation</artifactId>
             <version>0.0.1-SNAPSHOT</version>
         </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-security</artifactId>
+        </dependency>
     </dependencies>
     <properties>
         <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;
 
+import com.cn.tianji.config.DataSourceDecryptConfig;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.ConfigurableApplicationContext;
 
 /**
  * @author Zhao RenJi
@@ -9,7 +11,9 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
 @SpringBootApplication
 public class HookLoadWarningApplication {
     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启动");
     }
 }

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

+ 8 - 3
yujing-pull/pom.xml

@@ -23,10 +23,15 @@
             <version>0.0.1-SNAPSHOT</version>
         </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>-->
+<!--            <groupId>com.github.ben-manes.caffeine</groupId>-->
+<!--            <artifactId>caffeine</artifactId>-->
+<!--            <version>2.6.2</version>-->
+<!--        </dependency>-->
     </dependencies>
     <properties>
         <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;
 
+import com.cn.tianji.config.DataSourceDecryptConfig;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.ConfigurableApplicationContext;
 import org.springframework.scheduling.annotation.EnableScheduling;
 
 /**
@@ -11,7 +13,9 @@ import org.springframework.scheduling.annotation.EnableScheduling;
 @EnableScheduling
 public class PullApplication {
     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("实时数据采集启动");
     }
 }

+ 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;
 
 import com.cn.tianji.service.PullSICPDataService;
+import com.cn.tianji.service.TestPullDataService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
 import javax.annotation.Resource;
+import java.math.BigDecimal;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -18,11 +21,15 @@ public class TaskTestController {
     @Resource
     private PullSICPDataService pullSICPDataService;
 
+    @Resource
+    private TestPullDataService testPullDataService;
+
     @GetMapping("/taskTest")
     public void testPull(){
         pullSICPDataService.updateJh();
     }
 
+
     @GetMapping("/updTableByJhs")
     public void updTableByJhs(){
         List<String> jhs=new ArrayList<>();
@@ -36,4 +43,9 @@ public class TaskTestController {
         jhs.add("顺深2斜");
         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();
     }
 
+
+
+    /***********************/
+
     @Scheduled(cron = "0 35 8 * * ?")
     public void 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(){
         List<String> jhs=new ArrayList<>();
-        jhs.add("顺北806斜");
+        jhs.add("顺深2斜");
         log.info("sicp数据采集任务执行");
         pullSICPDataService.pullData(jhs);
     }

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

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

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

@@ -22,6 +22,10 @@
             <artifactId>yujing-warning-calculation</artifactId>
             <version>0.0.1-SNAPSHOT</version>
         </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-security</artifactId>
+        </dependency>
     </dependencies>
     <properties>
         <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;
 
+import com.cn.tianji.config.DataSourceDecryptConfig;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.ConfigurableApplicationContext;
 
 /**
  * @author Zhao RenJi
@@ -9,7 +11,9 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
 @SpringBootApplication
 public class PumpingPressureApplication {
     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("泵压实时启动启动");
     }
 }

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

+ 4 - 0
yujing-torque/pom.xml

@@ -22,6 +22,10 @@
             <artifactId>yujing-warning-calculation</artifactId>
             <version>0.0.1-SNAPSHOT</version>
         </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-security</artifactId>
+        </dependency>
     </dependencies>
     <properties>
         <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;
 
+import com.cn.tianji.config.DataSourceDecryptConfig;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.ConfigurableApplicationContext;
 
 /**
  * @author Zhao RenJi
@@ -9,7 +11,9 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
 @SpringBootApplication
 public class TorqueApplication {
     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("扭矩实时启动");
     }
 }

+ 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
   application:
     name: yujing-torque
+  security:
+    user:
+      name: admin
+      password: YujingTorque@2025
+      roles: ADMIN
   mvc:
     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:
   config: classpath:logback.xml
 mybatis-plus:

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

@@ -22,6 +22,10 @@
             <artifactId>yujing-warning-calculation</artifactId>
             <version>0.0.1-SNAPSHOT</version>
         </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-security</artifactId>
+        </dependency>
     </dependencies>
     <properties>
         <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;
 
+import com.cn.tianji.config.DataSourceDecryptConfig;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.ConfigurableApplicationContext;
 
 /**
  * @author Zhao RenJi
@@ -9,7 +11,9 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
 @SpringBootApplication
 public class TotalPoolVolumeApplication {
     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启动");
     }
 }

+ 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
   application:
     name: yujing-total-pool-volume
+  security:
+    user:
+      name: admin
+      password: YujingTotalPool@2025
+      roles: ADMIN
   mvc:
     static-path-pattern: /**
     jackson:
@@ -16,12 +21,17 @@ spring:
     host: localhost
     lettuce:
       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
-    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
 logging:
   config: classpath:logback.xml

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

@@ -23,6 +23,7 @@
             <version>13.0</version>
             <scope>compile</scope>
         </dependency>
+
     </dependencies>
 
     <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;
+        }
+    }
+
+
+}