|
@@ -0,0 +1,299 @@
|
|
|
|
+package com.hb.proj.rpt.service;
|
|
|
|
+
|
|
|
|
+import java.util.Calendar;
|
|
|
|
+import java.util.Date;
|
|
|
|
+import java.util.HashMap;
|
|
|
|
+import java.util.HashSet;
|
|
|
|
+import java.util.List;
|
|
|
|
+import java.util.Map;
|
|
|
|
+import java.util.Set;
|
|
|
|
+
|
|
|
|
+import org.apache.commons.lang3.time.DateUtils;
|
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
|
+import org.springframework.util.Assert;
|
|
|
|
+
|
|
|
|
+import com.hb.proj.base.service.UnitService;
|
|
|
|
+import com.hb.proj.constant.SortCodeConstant;
|
|
|
|
+import com.hb.proj.data.controller.DataTransUtils;
|
|
|
|
+import com.hb.proj.model.MultiDataVO;
|
|
|
|
+import com.hb.proj.model.RptOilDailyDutyPO;
|
|
|
|
+import com.hb.proj.model.RptOilDailyVO;
|
|
|
|
+import com.hb.proj.model.SingleDataVO;
|
|
|
|
+import com.hb.proj.model.UnitPO;
|
|
|
|
+import com.hb.proj.model.WellParamPO;
|
|
|
|
+import com.hb.xframework.util.DateUtil;
|
|
|
|
+
|
|
|
|
+import io.micrometer.common.util.StringUtils;
|
|
|
|
+
|
|
|
|
+@Service
|
|
|
|
+public class RptDailyExtractFacade {
|
|
|
|
+
|
|
|
|
+ @Autowired
|
|
|
|
+ private RptDailyDataService dailyService;
|
|
|
|
+
|
|
|
|
+ @Autowired
|
|
|
|
+ private UnitService unitService;
|
|
|
|
+
|
|
|
|
+ //需要提取的实时数据字段、单位配置,用于提取数据后进行单位转换(只针对报表的单位转换)
|
|
|
|
+ private static Map<String,String[]> oilDailyRTField;
|
|
|
|
+
|
|
|
|
+ public RptDailyExtractFacade() {
|
|
|
|
+ oilDailyRTField=new HashMap<>();
|
|
|
|
+ oilDailyRTField.put(SortCodeConstant.PARAM_OIL_PRESS, new String[]{"MPa","#.00"});
|
|
|
|
+ oilDailyRTField.put(SortCodeConstant.PARAM_CASING_PRESS, new String[]{"MPa","#.00"});
|
|
|
|
+ oilDailyRTField.put(SortCodeConstant.PARAM_BACK_PRESS, new String[]{"MPa","#.00"});
|
|
|
|
+ oilDailyRTField.put(SortCodeConstant.PARAM_WELL_HEAD_TEMP, new String[]{"℃","#.00"});
|
|
|
|
+ oilDailyRTField.put(SortCodeConstant.PARAM_FREQ, new String[]{"SPM","#.0"});
|
|
|
|
+ oilDailyRTField.put(SortCodeConstant.PARAM_STROKE, new String[]{"m","#.00"});
|
|
|
|
+ oilDailyRTField.put(SortCodeConstant.PARAM_DIAGRAM_CURRENT, new String[]{"A","#.00"});
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 日报数据提取
|
|
|
|
+ * 日报数据:08:00-次日08:00
|
|
|
|
+ * 班报数据:班次划分:08:00-16:00 16:00-00:00 00:00-08:00
|
|
|
|
+ * @param orgId
|
|
|
|
+ * @param dailyDate
|
|
|
|
+ * @param authUsId
|
|
|
|
+ */
|
|
|
|
+ public List<RptOilDailyVO> extractDailyData(String orgId,Date dailyDate,String authUsId) {
|
|
|
|
+ Assert.isTrue(StringUtils.isNotBlank(orgId), "缺少必要参数");
|
|
|
|
+ List<RptOilDailyVO> dialyDatas=dailyService.loadAuthOilWellBase(orgId, authUsId);
|
|
|
|
+ if(dialyDatas==null || dialyDatas.size()==0) {
|
|
|
|
+ return null;
|
|
|
|
+ }
|
|
|
|
+ Map<String,RptOilDailyVO> dailyMap=new HashMap<>(dialyDatas.size());
|
|
|
|
+ for(RptOilDailyVO daily : dialyDatas) {
|
|
|
|
+ daily.setDailyDate(dailyDate);
|
|
|
|
+ dailyMap.put(daily.getWellId(),daily);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ List<WellParamPO> wparams=dailyService.loadParamByWells(dailyMap.keySet(),oilDailyRTField.keySet());
|
|
|
|
+
|
|
|
|
+ Map<String,WellParamPO> paramMap=resetParamUnit(wparams);
|
|
|
|
+
|
|
|
|
+ bindDiagramExtra(dailyMap,paramMap,dailyDate); //班次:08:00-08:00(次日)
|
|
|
|
+
|
|
|
|
+ bindRtExtra(dailyMap,paramMap,dailyDate); //班次:08:00-08:00(次日)
|
|
|
|
+
|
|
|
|
+ buildDutyDatas(dailyMap,paramMap,dailyDate,8); //班次:08:00-16:00
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ buildDutyDatas(dailyMap,paramMap,dailyDate,16); //班次:16:00-00:00(次日)
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ buildDutyDatas(dailyMap,paramMap,DateUtils.addDays(dailyDate, 1),0); //班次:00:00(次日)-08:00(次日)
|
|
|
|
+
|
|
|
|
+ return dialyDatas;
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 构建指定日期的班报数据
|
|
|
|
+ * @param dailyMap
|
|
|
|
+ * @param paramMap
|
|
|
|
+ * @param dailyDate
|
|
|
|
+ * @param startHour
|
|
|
|
+ * @return
|
|
|
|
+ */
|
|
|
|
+ private void buildDutyDatas(Map<String,RptOilDailyVO> dailyMap,Map<String,WellParamPO> paramMap,Date dailyDate,int startHour) {
|
|
|
|
+ Date[] dates=getDutyTimes(dailyDate,startHour,8);
|
|
|
|
+ List<SingleDataVO> rtDatas=dailyService.loadRTDataAvg(paramMap.keySet(),dates[0],dates[1]);
|
|
|
|
+ if(rtDatas==null || rtDatas.size()==0) {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ String wellId=null;
|
|
|
|
+ String paramCode=null;
|
|
|
|
+ WellParamPO wp=null;
|
|
|
|
+ RptOilDailyDutyPO dutyItem=null;
|
|
|
|
+ Map<String,RptOilDailyDutyPO> dutyMap=new HashMap<>();
|
|
|
|
+ for(SingleDataVO data : rtDatas) {
|
|
|
|
+ wp=paramMap.get(data.getWellParam());
|
|
|
|
+ wellId=wp.getWellId();
|
|
|
|
+ paramCode=wp.getParamCode();
|
|
|
|
+ if(dutyMap.containsKey(wellId)) {
|
|
|
|
+ dutyItem=dutyMap.get(wellId);
|
|
|
|
+ }
|
|
|
|
+ else {
|
|
|
|
+ dutyItem=new RptOilDailyDutyPO();
|
|
|
|
+ dutyItem.setWellId(wellId);
|
|
|
|
+ dutyItem.setDailyDate(dailyDate);
|
|
|
|
+ dutyItem.setDutyTime(DateUtil.format(dates[0], "HH:mm")+"-"+DateUtil.format(dates[1], "HH:mm")); //班次时间段
|
|
|
|
+ dutyMap.put(wellId, dutyItem);
|
|
|
|
+
|
|
|
|
+ dailyMap.get(wellId).addDuty(dutyItem);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ DataTransUtils.convert(wp, data);
|
|
|
|
+
|
|
|
|
+ if(paramCode.equalsIgnoreCase(SortCodeConstant.PARAM_OIL_PRESS)) {
|
|
|
|
+ dutyItem.setOilPress(data.getDataVal());
|
|
|
|
+ }
|
|
|
|
+ else if(paramCode.equalsIgnoreCase(SortCodeConstant.PARAM_CASING_PRESS)) {
|
|
|
|
+ dutyItem.setCasingPress(data.getDataVal());
|
|
|
|
+ }
|
|
|
|
+ else if(paramCode.equalsIgnoreCase(SortCodeConstant.PARAM_BACK_PRESS)) {
|
|
|
|
+ dutyItem.setBackPress(data.getDataVal());
|
|
|
|
+ }
|
|
|
|
+ else if(paramCode.equalsIgnoreCase(SortCodeConstant.PARAM_WELL_HEAD_TEMP)) {
|
|
|
|
+ dutyItem.setTempWellport(data.getDataVal());
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 给日报对象填充空白班报记录
|
|
|
|
+ * @param dailyMap
|
|
|
|
+ * @param st
|
|
|
|
+ * @param et
|
|
|
|
+ */
|
|
|
|
+ /*
|
|
|
|
+ private void buildBlankDuty(Map<String,RptOilDailyVO> dailyMap,Date st,Date et) {
|
|
|
|
+ dailyMap.values().forEach(daily->{
|
|
|
|
+ RptOilDailyDutyVO dutyItem=new RptOilDailyDutyVO();
|
|
|
|
+ dutyItem.setDutyTime(DateUtil.format(st, "HH:mm")+"-"+DateUtil.format(et, "HH:mm"));
|
|
|
|
+ daily.getDuties().add(dutyItem);
|
|
|
|
+ });
|
|
|
|
+ }*/
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 给日报对象填充采集值(冲次、冲程,当天24小时内的平均值)
|
|
|
|
+ * @param dailyMap
|
|
|
|
+ * @param paramMap
|
|
|
|
+ * @param dailyDate
|
|
|
|
+ */
|
|
|
|
+ private void bindRtExtra(Map<String,RptOilDailyVO> dailyMap,Map<String,WellParamPO> paramMap,Date dailyDate){
|
|
|
|
+ Set<String> queryParamIds=new HashSet<>(); //过滤后只对冲次、冲程进行查询
|
|
|
|
+ for(WellParamPO wp : paramMap.values()) {
|
|
|
|
+ if(wp.getParamCode().equals(SortCodeConstant.PARAM_FREQ) || wp.getParamCode().equals(SortCodeConstant.PARAM_STROKE)) {
|
|
|
|
+ queryParamIds.add(wp.getParamId());
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ Date[] dates=getDutyTimes(dailyDate,8,24);
|
|
|
|
+ List<SingleDataVO> rtDatas=dailyService.loadRTDataAvg(queryParamIds,dates[0],dates[1]);
|
|
|
|
+ if(rtDatas==null || rtDatas.size()==0) {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ String wellId=null;
|
|
|
|
+ String paramCode=null;
|
|
|
|
+ WellParamPO wp=null;
|
|
|
|
+ for(SingleDataVO data : rtDatas) {
|
|
|
|
+ wp=paramMap.get(data.getWellParam());
|
|
|
|
+ wellId=wp.getWellId();
|
|
|
|
+ paramCode=wp.getParamCode();
|
|
|
|
+ DataTransUtils.convert(wp, data);
|
|
|
|
+ if(paramCode.equalsIgnoreCase(SortCodeConstant.PARAM_FREQ)) {
|
|
|
|
+ dailyMap.get(wellId).setFreq(data.getDataVal());
|
|
|
|
+ }
|
|
|
|
+ else if(paramCode.equalsIgnoreCase(SortCodeConstant.PARAM_STROKE)) {
|
|
|
|
+ dailyMap.get(wellId).setStroke(data.getDataVal());
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 给日报对象填充功图额外参数值(上行电流、下行电流,当天24小时内的平均值)
|
|
|
|
+ *
|
|
|
|
+ * @param dailyMap
|
|
|
|
+ * @param paramMap
|
|
|
|
+ * @param dailyDate
|
|
|
|
+ */
|
|
|
|
+ private void bindDiagramExtra(Map<String,RptOilDailyVO> dailyMap,Map<String,WellParamPO> paramMap,Date dailyDate) {
|
|
|
|
+ Date[] dates=getDutyTimes(dailyDate,8,24);
|
|
|
|
+ List<MultiDataVO> datas=dailyService.loadDiagramExtrDataAvg(paramMap.keySet(),dates[0],dates[1]);
|
|
|
|
+ if(datas==null || datas.size()==0) {
|
|
|
|
+ return ;
|
|
|
|
+ }
|
|
|
|
+ RptOilDailyVO daily=null;
|
|
|
|
+ WellParamPO wp=null;
|
|
|
|
+ String val=null;
|
|
|
|
+ for(MultiDataVO data : datas) {
|
|
|
|
+ if(data.getUpstrokeMax()==null || data.getDownstrokeMax()==null) {
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
|
|
+ wp=paramMap.get(data.getWellParam());
|
|
|
|
+ daily=dailyMap.get(wp.getWellId());
|
|
|
|
+
|
|
|
|
+ //daily.setFreq(data.getFreq());
|
|
|
|
+ //daily.setStroke(data.getStroke());
|
|
|
|
+ val=DataTransUtils.convert(wp, data.getUpstrokeMax());
|
|
|
|
+ daily.setCurrentUp(Double.parseDouble(val));
|
|
|
|
+
|
|
|
|
+ val=DataTransUtils.convert(wp, data.getDownstrokeMax());
|
|
|
|
+ daily.setCurrentDown(Double.parseDouble(val));
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 根据报表字段要求,设置单位转换参数、显示格式
|
|
|
|
+ * @param wparams
|
|
|
|
+ */
|
|
|
|
+ private Map<String,WellParamPO> resetParamUnit(List<WellParamPO> wparams) {
|
|
|
|
+
|
|
|
|
+ Map<String,UnitPO> unitMap=buildUnitMap();
|
|
|
|
+
|
|
|
|
+ Map<String,WellParamPO> paramMap=new HashMap<>(wparams.size());
|
|
|
|
+ String[] unitfmt=null;
|
|
|
|
+ for(WellParamPO wp : wparams) {
|
|
|
|
+ paramMap.put(wp.getParamId(), wp);
|
|
|
|
+
|
|
|
|
+ unitfmt=oilDailyRTField.get(wp.getParamCode());
|
|
|
|
+ if(!wp.getDisplayUnit().equals(unitfmt[0])) { //单井显示中的单位和报表中的单位不一致,重新计算换算比例
|
|
|
|
+ wp.setDisplayUnit(unitfmt[0]);
|
|
|
|
+ calcUnitScale(wp,unitfmt[0],wp.getInsertUnit(),unitMap);
|
|
|
|
+ }
|
|
|
|
+ wp.setDisplayFormat(unitfmt[1]);
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return paramMap;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ //按指定的显示、入库单位计算转换比例
|
|
|
|
+ private void calcUnitScale(WellParamPO wp,String disU,String dbU,Map<String,UnitPO> unitMap) {
|
|
|
|
+ if(unitMap==null || unitMap.get(disU)==null || unitMap.get(dbU)==null) {
|
|
|
|
+ return ;
|
|
|
|
+ }
|
|
|
|
+ wp.setDisInsScale(unitMap.get(dbU).getBaseScale()/unitMap.get(disU).getBaseScale());
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 库内所有单位映射
|
|
|
|
+ * @return
|
|
|
|
+ */
|
|
|
|
+ private Map<String,UnitPO> buildUnitMap(){
|
|
|
|
+ List<UnitPO> unitpos=unitService.loadAll();
|
|
|
|
+ if(unitpos==null || unitpos.size()==0) {
|
|
|
|
+ return null;
|
|
|
|
+ }
|
|
|
|
+ Map<String,UnitPO> unitMap=new HashMap<>();
|
|
|
|
+ unitpos.forEach(unit->{
|
|
|
|
+ unitMap.put(unit.getUnitSymbol(), unit);
|
|
|
|
+ });
|
|
|
|
+ return unitMap;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 获得班次的起止时间
|
|
|
|
+ * @param date 日期
|
|
|
|
+ * @param startHour 班次起始时钟,24小时制
|
|
|
|
+ * @param duration 班次时长
|
|
|
|
+ * @return
|
|
|
|
+ */
|
|
|
|
+ private Date[] getDutyTimes(Date date,int startHour,int duration) {
|
|
|
|
+ Calendar ca=Calendar.getInstance();
|
|
|
|
+ ca.setTime(date);
|
|
|
|
+ ca.set(Calendar.MINUTE, 0);
|
|
|
|
+ ca.set(Calendar.SECOND, 0);
|
|
|
|
+ ca.set(Calendar.HOUR_OF_DAY, startHour);
|
|
|
|
+ Date st=ca.getTime();
|
|
|
|
+ ca.add(Calendar.HOUR_OF_DAY, duration);
|
|
|
|
+ return new Date[] {st,ca.getTime()};
|
|
|
|
+ }
|
|
|
|
+}
|