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