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