Pārlūkot izejas kodu

油井生产参数管理接口

chenwen 1 gadu atpakaļ
vecāks
revīzija
2f2bb452bf

+ 105 - 0
src/main/java/com/hb/proj/analysis/controller/ProduceParamController.java

@@ -0,0 +1,105 @@
+package com.hb.proj.analysis.controller;
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import com.hb.proj.allconfig.AccessToken;
+import com.hb.proj.analysis.service.ProduceParamService;
+import com.hb.proj.model.WellAnalysisParamPO;
+import com.hb.proj.model.WellMeasurePO;
+import com.hb.proj.model.WellPumpPO;
+import com.hb.proj.utils.RespVO;
+import com.hb.proj.utils.RespVOBuilder;
+import com.hb.xframework.util.MapUtils;
+
+import jakarta.validation.constraints.NotBlank;
+
+@RestController
+@RequestMapping("/analysis/produce")
+@Validated
+public class ProduceParamController {
+
+	@Autowired
+	private ProduceParamService  service;
+	
+	/**
+	 * 获得指定井的最新生成动态参数
+	 * @param wellId
+	 * @return
+	 */
+	@RequestMapping("/getLastParam")
+	public RespVO<Object> getLastParam(@NotBlank(message="缺少井号") String wellId){
+		return RespVOBuilder.ok(MapUtils.build("measure", service.getLastMeasureParam(wellId), 
+				"analysis",service.getLastAnalysisParam(wellId),
+				"pump",service.getLastPumpParam(wellId)));
+	}
+	
+	/**
+	 * 保存油井测量参数
+	 * @param measure
+	 * @param token
+	 * @return
+	 */
+	@RequestMapping("/saveMeasure")
+	public RespVO<Object> saveMeasure(@Validated WellMeasurePO  measure,AccessToken token){
+		if(measure.getWellBtmCompCoe()!=null && measure.getWellBtmCompCoe()!=0) {
+			measure.setSurfaceCompCoe(1/measure.getWellBtmCompCoe());
+		}
+		measure.setModifyBy(token!=null?token.getUsName():"unknow");
+		
+		if(StringUtils.isBlank(measure.getMeasureId())) {
+			measure.setCreateBy(token!=null?token.getUsName():"unknow");
+			service.addMeasureParam(measure);
+		}
+		else {
+			service.updateMeasureParam(measure);
+		}
+		return RespVOBuilder.ok();
+	}
+	
+	/**
+	 * 保存抽油泵参数
+	 * @param pump
+	 * @param token
+	 * @return
+	 */
+	@RequestMapping("/savePump")
+	public RespVO<Object>  savePump(@Validated WellPumpPO pump,AccessToken token){
+		pump.setModifyBy(token!=null?token.getUsName():"unknow");
+		if(StringUtils.isBlank(pump.getPumpId())) {
+			pump.setCreateBy(token!=null?token.getUsName():"unknow");
+			service.addPumpParam(pump);
+		}
+		else {
+			service.updatePumpParam(pump);
+		}
+		return RespVOBuilder.ok();
+	}
+	
+	/**
+	 * 保存分析参数(只新增)
+	 * @param pump
+	 * @param token
+	 * @return
+	 */
+	@RequestMapping("/saveAnalysisParam")
+	public RespVO<Object>  saveAnalysisParam(@Validated WellAnalysisParamPO analysisParam,AccessToken token){
+		analysisParam.setModifyBy(token!=null?token.getUsName():"unknow");
+		analysisParam.setCreateBy(analysisParam.getModifyBy());
+		service.addAnalysisParam(analysisParam);
+		return RespVOBuilder.ok();
+	}
+	
+	/**
+	 * 计算分析参数
+	 * @param wellId
+	 * @return
+	 */
+	@RequestMapping("/calcParam")
+	public RespVO<Object>  calcParam(@NotBlank(message="缺少井号") String wellId){
+		return RespVOBuilder.ok();
+	}
+}

+ 101 - 0
src/main/java/com/hb/proj/analysis/service/ProduceParamCalculator.java

@@ -0,0 +1,101 @@
+package com.hb.proj.analysis.service;
+
+import com.hb.proj.model.LiquidPO;
+import com.hb.proj.model.WellAnalysisParamPO;
+import com.hb.proj.model.WellMeasurePO;
+import com.hb.proj.model.WellPumpPO;
+import com.hb.proj.model.WellRtDataVO;
+
+public class ProduceParamCalculator {
+
+	public WellAnalysisParamPO  calc(WellMeasurePO measure,WellPumpPO pump,WellRtDataVO wellRt,LiquidPO liquid) {
+		WellAnalysisParamPO  analyParam=new WellAnalysisParamPO();
+		
+		/**
+		 * 计量油量=计量液量*(1-含水率)
+		 * 计量水量=计量液量*含水率
+		 */
+		analyParam.setMeteredOilYield(measure.getMeteredLiquidYield()*(1-measure.getWaterRatio())); 
+		analyParam.setMeteredWaterYield(measure.getMeteredLiquidYield()*measure.getWaterRatio());  
+		
+		/**
+		 * 测量油量=测量液量*(1-含水率)
+		 * 测量水量=测量液量*(1-含水率)
+		 */
+		analyParam.setMeasureOilYield(measure.getMeasureLiquidYield()*(1-measure.getWaterRatio()));
+		analyParam.setMeasureWaterYield(measure.getMeasureLiquidYield()*measure.getWaterRatio());
+		
+		
+		/**
+		 * 泵理论排量=截面积*柱塞冲程*spm*24*60*泵系数
+		 * 理论排量按每分钟1冲次,泵系数为1计算。
+		 * 新泵时为1,长期使用小于1,用于修正泵理论排量
+		 * spm 冲次频率(每分钟) 目前固定为1
+		 */
+		pump.setSpm(1);
+		double tempYield=pump.getPi()*Math.pow(pump.getBasicDiam()/2,2)*pump.getStroke()*pump.getPumpCoeff()*pump.getSpm()*24*60;
+		pump.setTheoryVolume(tempYield);
+		
+		
+		/**
+		 * 理论液量=泵理论排量*冲次
+		 */
+		analyParam.setTheoryLiquidYield(pump.getTheoryVolume()*wellRt.getFreq());
+		
+		/**
+		 * 测量泵效=测量液量/理论液量
+		 * 校准泵效=计量液量/理论液量
+		 * 综合泵效=弹性伸缩*泵充满度*漏失系数*地表体积系数
+		 */
+		
+		analyParam.setMeasuredPumpEff(measure.getMeasureLiquidYield()/analyParam.getTheoryLiquidYield());
+		analyParam.setCorrectPumpEff(measure.getMeteredLiquidYield()/analyParam.getTheoryLiquidYield());
+		analyParam.setComPumpEff(measure.getElasticCoeff()*pump.getFillDegree()*pump.getLeakCoeff()*measure.getSurfaceCompCoe());
+		
+		
+		/**
+		 * 实际液量=校准泵效*理论液量 用于绘制IPR曲线
+		 * 实际油量=实际液量*(1-含水率),用于绘制IPR曲线
+		 * 实际水量=实际液量´含水率,用于绘制IPR曲线
+		 */
+		analyParam.setRealLiquidYield(analyParam.getCorrectPumpEff()*analyParam.getTheoryLiquidYield());
+		analyParam.setRealOilYield(analyParam.getRealLiquidYield()*(1-measure.getWaterRatio()));
+		analyParam.setRealWaterYield(analyParam.getRealLiquidYield()*measure.getWaterRatio());
+		
+		
+		/**
+		 * 深度压差(m)=折算动液面深度-折算静液面深度
+		 * 流动压差(Mpa)=油藏压力-井底生产压力=深度压差*混液密度*g/1000
+		 */
+		analyParam.setDiffPressBtmflow(analyParam.getDiffPressDepth()*measure.getMixLiquidDensity()*measure.getGravity()/1000);
+		
+		/**
+		 * 油指数_J=功图液量/流动压差
+		 * 油指数_K=功图液量/深度压差
+		 * 计量指数_J=计量液量/流动压差
+		 * 计量指数_K=计量液量/深度压差
+		 */
+		
+		analyParam.setProductIndexJ(analyParam.getDiagramLiquidYield()/analyParam.getDiffPressBtmflow());
+		analyParam.setProductIndexK(analyParam.getDiagramLiquidYield()/analyParam.getDiffPressDepth());
+		
+		analyParam.setMeteredProductIndexJ(measure.getMeteredLiquidYield()/analyParam.getDiffPressBtmflow());
+		analyParam.setMeteredProductIndexK(measure.getMeteredLiquidYield()/analyParam.getDiffPressDepth());
+		
+		/**
+		 * 折算静深度=静液面深度-(套压(MPa)/(液体密度(kg/l)*重力加速度(m/s2)))*1000
+		 * 套管压力不为零时的静液面深度.计算折算深度时要用对应时间的套压
+		 * 
+		 * 折算动深度=校正动液面深度-(套压(MPa)/(液体密度(kg/l)*重力加速度(m/s2)))*1000
+		 * 套管压力不为零时的动液面深度。计算折算深度时要用对应时间的套压
+		 * 
+		 * 套压:指动液面设备返回的套压值
+		 * 校正液面深度,手动计算保存后,折算动液面深度也要跟随变化吧
+		 */
+		Double disD=liquid.getCasingPressDev()*1000/(measure.getMixLiquidDensity()*measure.getGravity());
+		analyParam.setCvtStaticLiquidDepth(measure.getStaticLiquidDepth()-disD);
+		analyParam.setCvtStaticLiquidDepth(liquid.getLiquidDepth()-disD);
+		
+		return analyParam;
+	}
+}

+ 118 - 0
src/main/java/com/hb/proj/analysis/service/ProduceParamService.java

@@ -0,0 +1,118 @@
+package com.hb.proj.analysis.service;
+
+import java.util.Date;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import com.hb.proj.model.WellAnalysisParamPO;
+import com.hb.proj.model.WellMeasurePO;
+import com.hb.proj.model.WellPumpPO;
+import com.hb.xframework.dao.core.SpringJdbcDAO;
+import com.hb.xframework.dao.util.UUIDHexGenerator;
+
+@Service
+public class ProduceParamService {
+
+	@Autowired
+	private SpringJdbcDAO  dao;
+	
+	/**
+	 * 增加油井测量数据
+	 * @param measure
+	 */
+	public void addMeasureParam(WellMeasurePO  measure) {
+		UUIDHexGenerator  uuid=UUIDHexGenerator.getInstance();
+		measure.setMeasureId(uuid.generate());
+		measure.setModifyTime(new Date());
+		measure.setCreateTime(new Date());
+		measure.setDelIf(false);
+		dao.insert(measure, "tzl_well_measure");
+	}
+	
+	/**
+	 * 更新油井测量数据
+	 * @param measure
+	 */
+	public void updateMeasureParam(WellMeasurePO  measure) {
+		measure.setModifyTime(new Date());
+		measure.setDelIf(false);
+		dao.update(measure, "tzl_well_measure", "measure_id");
+	}
+	
+	/**
+	 * 获得最新的测量数据
+	 * @param wellId
+	 * @return
+	 */
+	public WellMeasurePO  getLastMeasureParam(String wellId) {
+		String sql="""
+				select * from tzl_well_measure where del_if=false and well_id=?
+				order by create_time desc limit 1
+				""";
+		return dao.queryForPojo(sql, WellMeasurePO.class, wellId);
+	}
+	
+	/**
+	 * 增加抽油泵参数
+	 * @param pump
+	 */
+	public void addPumpParam(WellPumpPO pump) {
+		UUIDHexGenerator  uuid=UUIDHexGenerator.getInstance();
+		pump.setPumpId(uuid.generate());
+		pump.setModifyTime(new Date());
+		pump.setCreateTime(new Date());
+		pump.setDelIf(false);
+		dao.insert(pump, "tzl_pump");
+	}
+	
+	/**
+	 * 更新抽油泵参数
+	 * @param pump
+	 */
+	public void updatePumpParam(WellPumpPO pump) {
+		pump.setModifyTime(new Date());
+		pump.setDelIf(false);
+		dao.update(pump, "tzl_pump", "pump_id");
+	}
+	
+	/**
+	 * 增加分析参数
+	 * @param analysisParam
+	 */
+	public void addAnalysisParam(WellAnalysisParamPO analysisParam) {
+		UUIDHexGenerator  uuid=UUIDHexGenerator.getInstance();
+		analysisParam.setRecordId(uuid.generate());
+		analysisParam.setModifyTime(new Date());
+		analysisParam.setCreateTime(new Date());
+		dao.insert(analysisParam, "tzl_well_analysis_param");
+	}
+	
+	
+	/**
+	 * 获得最新的油泵参数
+	 * @param wellId
+	 * @return
+	 */
+	public WellPumpPO getLastPumpParam(String wellId) {
+		String sql="""
+				select * from tzl_pump where del_if=false and well_id=?
+				order by create_time desc limit 1
+				""";
+		return dao.queryForPojo(sql, WellPumpPO.class,wellId);
+	}
+	
+	
+	/**
+	 * 获得最新的分析参数
+	 * @param wellId
+	 * @return
+	 */
+	public WellAnalysisParamPO  getLastAnalysisParam(String wellId) {
+		String sql="""
+				select * from tzl_well_analysis_param where  well_id=?
+				order by create_time desc limit 1
+				""";
+		return dao.queryForPojo(sql, WellAnalysisParamPO.class,wellId);
+	}
+}

+ 33 - 0
src/main/java/com/hb/proj/model/LiquidPO.java

@@ -33,12 +33,24 @@ public class LiquidPO {
 	
 	private Integer hoopEndPos;
 	
+	/**
+	 * 手动计算液面深度(校正深度。默认=设备液面深度*最新的k系数)
+	 */
 	private Double liquidDepth;
 	
+	/**
+	 * 平均管长(手动计算接箍法,输入值)
+	 */
 	private Double avgLengthPipe;
 	
+	/**
+	 * 音速(手动计算音速法,输入值,作为音速法时的:校正音速)
+	 */
 	private Double soundSpeed;
 	
+	/**
+	 * 脉冲数据点的时间间隔(默认0.0045s)
+	 */
 	private Double soundInterval;
 	
 	@NotBlank(message="计算方法不能为空")
@@ -49,12 +61,24 @@ public class LiquidPO {
 	
 	private Integer soundMarkPos;
 	
+	/**
+	 * 音标深度
+	 */
 	private Double  soundMarkDepth;
 	
+	/**
+	 * 采集的动液面设备在用音速
+	 */
 	private Double  soundSpeedDev;
 	
+	/**
+	 * 采集的动液面设备动液面深度
+	 */
 	private Double  liquidDepthDev;
 	
+	/**
+	 * 采集的动液面设备套压
+	 */
 	private Double  casingPressDev;
 	
 	private Boolean delIf;
@@ -63,9 +87,18 @@ public class LiquidPO {
 	
 	private Date modifyTime;
 	
+	/**
+	 * 音速法  k系数
+	 */
 	private Double soundSpeedFactor;
 	
+	/**
+	 * 电池电压
+	 */
 	private Double batteryVoltage;
 	
+	/**
+	 * 计算音速(校正音速,接箍法、音标法)
+	 */
 	private Double soundSpeedCalc;
 }

+ 144 - 0
src/main/java/com/hb/proj/model/WellAnalysisParamPO.java

@@ -0,0 +1,144 @@
+package com.hb.proj.model;
+
+import java.util.Date;
+
+import jakarta.validation.constraints.NotBlank;
+import lombok.Data;
+
+@Data
+public class WellAnalysisParamPO {
+
+	private String recordId;
+	
+	@NotBlank(message="缺少井号")
+	private String wellId;
+	
+	private Date createTime;
+	
+	private Date modifyTime;
+
+	
+	private String modifyBy;
+	
+	private String createBy;
+	
+	/**
+	 * 理论液量 m3/d
+	 */
+	private Double theoryLiquidYield;  
+	
+	/**
+	 * 测量液量 m3/d
+	 */
+	private Double measureOilYield;  
+	
+	/**
+	 * 测量水量 m3/d
+	 */
+	private Double measureWaterYield;   
+	
+	/**
+	 * 计量油量 m3/d
+	 */
+	private Double meteredOilYield;  
+	
+	/**
+	 * 计量水量 m3/d
+	 */
+	private Double meteredWaterYield;  
+	
+	/**
+	 * 功图液量 m3/d
+	 */
+	private Double diagramLiquidYield;  
+	
+	/**
+	 * 功图油量 m3/d
+	 */
+	private Double diagramOilYield;   
+	
+	/**
+	 * 功图水量 m3/d
+	 */
+	private Double diagramWaterYield;   
+	
+	/**
+	 * 实际液量 m3/d
+	 */
+	private Double realLiquidYield;  
+	
+	/**
+	 * 实际油量  m3/d
+	 */
+	private Double realOilYield;   
+	
+	
+	/**
+	 * 实际水量  m3/d
+	 */
+	private Double realWaterYield;  
+	
+	
+	/**
+	 * 测量泵效
+	 */
+	private Double measuredPumpEff;  
+	
+	/**
+	 * 综合泵效
+	 */
+	private Double comPumpEff;   
+	
+	
+	/**
+	 * 校准泵效
+	 */
+	private Double correctPumpEff;   
+	
+	
+	/**
+	 * 深度压差  m
+	 */
+	private Double diffPressDepth;  
+	
+	/**
+	 * 流动压差 MPa
+	 */
+	private Double diffPressBtmflow;  
+	
+	/**
+	 * 油指数_J
+	 */
+	private Double productIndexJ;  
+	
+	
+	/**
+	 * 油指数_K
+	 */
+	private Double productIndexK;  
+	
+	/**
+	 * 计量指数_J
+	 */
+	private Double meteredProductIndexJ; 
+	
+	
+	/**
+	 * 计量指数_K 
+	 */
+	private Double meteredProductIndexK;
+	
+	/**
+	 * 折算静液深度
+	 */
+	private Double cvtStaticLiquidDepth;
+	
+	/**
+	 * 折算动液深度
+	 */
+	private Double cvtDynLiquidDepth;
+	
+	private String refMeasureId;
+	
+	private String refPumpId;
+}

+ 84 - 0
src/main/java/com/hb/proj/model/WellMeasurePO.java

@@ -0,0 +1,84 @@
+package com.hb.proj.model;
+
+import java.util.Date;
+
+import jakarta.validation.constraints.NotBlank;
+import lombok.Data;
+
+@Data
+public class WellMeasurePO {
+	
+	private String measureId;
+	
+	@NotBlank(message="缺少井号")
+	private String wellId;
+	
+	private Date createTime;
+	
+	private Date modifyTime;
+
+	private Boolean delIf;
+	
+	
+	private String modifyBy;
+	
+	private String createBy;
+	
+	
+	/**
+	 * 含水率
+	 */
+	private Double waterRatio;
+	
+	/**
+	 * 混液密度
+	 */
+	private Double mixLiquidDensity; 
+	
+	/**
+	 * 原油密度
+	 */
+	private Double crudeOilDensity; 
+	
+	/**
+	 * 水密度
+	 */
+	private Double waterDensity;
+	
+	/**
+	 * 弹性系数
+	 */
+	private Double elasticCoeff;
+	
+	/**
+	 * 重力加速度
+	 */
+	private Double gravity;  
+	
+	/**
+	 * 井下压缩系数
+	 */
+	private Double  wellBtmCompCoe;
+	
+	/**
+	 * 地表压缩系数=1/wellBtmCompCoe
+	 */
+	private Double surfaceCompCoe;
+	
+	/**
+	 * 测量液量
+	 */
+	private Double measureLiquidYield; 
+	
+	/**
+	 *  计量液量
+	 */
+	private Double meteredLiquidYield; 
+	
+	
+	/**
+	 * 静液面深
+	 */
+	private Double staticLiquidDepth;
+	
+}

+ 96 - 0
src/main/java/com/hb/proj/model/WellPumpPO.java

@@ -0,0 +1,96 @@
+package com.hb.proj.model;
+
+import java.util.Date;
+
+import jakarta.validation.constraints.NotBlank;
+import lombok.Data;
+
+@Data
+public class WellPumpPO {
+
+	private String pumpId;
+	
+	@NotBlank(message="缺少井号")
+	private String wellId;
+	
+	private Boolean delIf;
+	
+	private Date createTime;
+	
+	private Date modifyTime;
+	
+	private String createBy;
+	
+	private String modifyBy;
+	
+	/**
+	 * 冲数 每分钟冲数
+	 */
+	private Integer spm; 
+	
+	/**
+	 * 公称直径 单位 mm
+	 */
+	private Double nominalDiam;  
+	
+	/**
+	 * 基本直径 单位 mm
+	 */
+	private Double basicDiam;  
+	
+	/**
+	 * 泵筒长度 单位 m
+	 */
+	private Double cylinderLength;  
+	
+	/**
+	 * 柱塞长度 单位 m
+	 */
+	private Double plungerLength;  
+	
+	/**
+	 * 加长短接 单位 m
+	 */
+	private Double shortJoint; 
+	
+	/**
+	 * 柱塞冲程   单位 m
+	 */
+	private Double stroke;  
+	
+	/**
+	 * 泵理论排量 m3/d
+	 */
+	private Double theoryVolume;
+	
+	/**
+	 * 泵系数
+	 */
+	private Double pumpCoeff; 
+	
+	/**
+	 * 漏失系数
+	 */
+	private Double leakCoeff;
+	
+	/**
+	 * 圆周率
+	 */
+	private Double pi; 
+	
+	/**
+	 * 泵下深 单位m
+	 */
+	private Double pumpDepth;
+	
+	/**
+	 * 沉没度 单位m
+	 */
+	private Double sumkDepth; 
+	
+	/**
+	 * 泵充满度
+	 */
+	private Double fillDegree;
+	
+}

+ 23 - 0
src/main/java/com/hb/proj/model/WellRtDataVO.java

@@ -0,0 +1,23 @@
+package com.hb.proj.model;
+
+import lombok.Data;
+
+/**
+ * 单井实时数据
+ * @author cwen
+ *
+ */
+
+@Data
+public class WellRtDataVO {
+
+	/**
+	 * 冲次   spm  次/min
+	 */
+	private Double freq;
+	
+	/**
+	 * 套压
+	 */
+	private Double casingPress;
+}