Explorar el Código

增加采油井生产日报功能接口(查询、抽取、填报)

chenwen hace 1 año
padre
commit
695bed3c4a

+ 5 - 0
src/main/java/com/hb/proj/base/service/UnitService.java

@@ -93,4 +93,9 @@ public class UnitService {
 		return dao.queryForList(sql, UnitPO.class);
 	}
 	
+	
+	public List<UnitPO> loadAll(){
+		return dao.queryForList("select * from tzl_unit", UnitPO.class);
+	}
+	
 }

+ 10 - 0
src/main/java/com/hb/proj/constant/SortCodeConstant.java

@@ -8,11 +8,21 @@ public class SortCodeConstant {
 
 	public static final String PARAM_FREQ="freq";
 	
+	public static final String PARAM_STROKE="stroke";
+	
 	public static final String PARAM_DIAGRAM_LOAD="diagram_load";
 	
 	public static final String PARAM_DIAGRAM_CURRENT="diagram_current";
 	
 	public static final String PARAM_DIAGRAM_POWER="diagram_power";
 	
+	public static final String PARAM_BACK_PRESS="back_press";
+	
+	public static final String PARAM_CASING_PRESS="casing_press";
+	
+	public static final String PARAM_OIL_PRESS="oil_press";
+	
+	public static final String PARAM_WELL_HEAD_TEMP="well_head_temp";
+	
 	public static final Map<String,Object> paramType=MapUtils.build(PARAM_DIAGRAM_LOAD,"GT",PARAM_DIAGRAM_CURRENT,"DL",PARAM_DIAGRAM_POWER,"DGL");
 }

+ 119 - 0
src/main/java/com/hb/proj/model/RptOilDailyDutyPO.java

@@ -0,0 +1,119 @@
+package com.hb.proj.model;
+
+import java.util.Date;
+
+import lombok.Data;
+
+@Data
+public class RptOilDailyDutyPO {
+
+	/**
+	 * 主键
+	 */
+	private String dutyId;
+	
+	/**
+	 * 班次h:min
+	 */
+	private String dutyTime;
+	
+	/**
+	 * 生产时间h:min
+	 */
+	private String produceTime;
+	
+	/**
+	 * 巡检时间h:min
+	 */
+	private String patrolTime;
+	
+	/**
+	 * 油压MPa
+	 */
+	private Double oilPress;
+	
+	/**
+	 * 套压MPa
+	 */
+	private Double casingPress;
+	
+	/**
+	 * 回压MPa
+	 */
+	private Double backPress;
+	
+	/**
+	 * 井口温度℃
+	 */
+	private Double tempWellport;
+	
+	/**
+	 * 加热炉入口 温度℃
+	 */
+	private Double tempHotInput;
+	
+	/**
+	 * 加热炉出口 温度℃
+	 */
+	private Double tempHotOutput;
+	
+	/**
+	 * 进站 温度℃
+	 */
+	private Double tempStationInput;
+	
+	/**
+	 * 伴热方式
+	 */
+	private String tracingMode;
+	
+	/**
+	 * 伴热 配参量
+	 */
+	private Double tracingMixQuota;
+	
+	/**
+	 * 伴热 实参量
+	 */
+	private Double tracingMixReal;
+	
+	/**
+	 * 量油标高/罐位   cm
+	 */
+	private Double meterOilHeight;
+	
+	/**
+	 * 计量起止时间  h:min-h:min
+	 */
+	private String meterPeriod;
+	
+	/**
+	 * 平均量油时间
+	 */
+	private Double meterAvgTime;
+	
+	/**
+	 * 计量液量 t/d
+	 */
+	private Double meterLiquid;
+	
+	/**
+	 * 计量气量  m^3/d
+	 */
+	private Double meterGas;
+	
+	/**
+	 * 井号
+	 */
+	private String wellId;
+	
+	/**
+	 * 日报日期
+	 */
+	private Date dailyDate;
+	
+	/**
+	 * 显示序号
+	 */
+	private Integer displayNum;
+}

+ 114 - 0
src/main/java/com/hb/proj/model/RptOilDailyPO.java

@@ -0,0 +1,114 @@
+package com.hb.proj.model;
+
+import java.util.Date;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+import jakarta.validation.constraints.Positive;
+import lombok.Data;
+
+@Data
+public class RptOilDailyPO {
+
+	/**
+	 * 
+	 * 记录主键
+	 */
+	private String dailyId;
+	
+	/**
+	 * 日报日期
+	 */
+	@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+	private Date dailyDate;
+	
+	/**
+	 * 井号
+	 */
+	private String wellId;
+	
+	
+	
+	/**
+	 * 生产模式
+	 */
+	private String produceMode;
+	
+	/**
+	 * 油嘴  mm
+	 */
+	@Positive(message="油嘴应为大于0的数字")
+	private Double oilMouth;
+	
+	/**
+	 * 冲程 m
+	 */
+	@Positive(message="冲程应为大于0的数字")
+	private Double stroke;
+	
+	/**
+	 * 冲次 rpm
+	 */
+	@Positive(message="冲次应为大于0的数字")
+	private Double freq;
+	
+	/**
+	 * 泵径 mm
+	 */
+	@Positive(message="泵径应为大于0的数字")
+	private Double pumpDiam;
+	
+	/**
+	 * 泵深 m
+	 */
+	@Positive(message="泵深应为大于0的数字")
+	private Double pumpDepth;
+	
+	/**
+	 * 电流上行  A
+	 */
+	private Double currentUp;
+	
+	/**
+	 * 电流下行  A
+	 */
+	private Double currentDown;
+	
+	/**
+	 * 备注
+	 */
+	private String note;
+	
+	/**
+	 * 白班巡检人
+	 */
+	private String dayPatrolBy;
+	
+	/**
+	 * 白班计量人
+	 */
+	private String dayMeterBy;
+	
+	/**
+	 * 夜班巡检人
+	 */
+	private String nightPatrolBy;
+	
+	/**
+	 * 夜班计量人
+	 */
+	private String nightMeterBy;
+	
+	/**
+	 * 审核人
+	 */
+	private String auditor;
+	
+	private String createBy;
+	
+	private String modifyBy;
+	
+	private Date createTime;
+	
+	private Date modifyTime;
+}

+ 57 - 0
src/main/java/com/hb/proj/model/RptOilDailyVO.java

@@ -0,0 +1,57 @@
+package com.hb.proj.model;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.springframework.beans.BeanUtils;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+@Data
+@EqualsAndHashCode(callSuper=false)
+public class RptOilDailyVO extends RptOilDailyPO{
+	
+	/**
+	 * 井名
+	 */
+	private String wellName;
+	
+	
+	private Map<String,RptOilDailyDutyPO> duties;
+	
+	public RptOilDailyVO() {
+		duties=new HashMap<>(3);
+	}
+	
+	public void addDuty(RptOilDailyDutyPO duty) {
+		duties.put(duty.getDutyTime(),duty);
+	}
+
+	/**
+	 * 保证班报记录里的wellId,dailyDate与日报一致
+	 * @return
+	 */
+	public List<RptOilDailyDutyPO> getInnerDuties() {
+		List<RptOilDailyDutyPO> rtn=new ArrayList<>(duties.size());
+		for(String key : duties.keySet()) {
+			duties.get(key).setWellId(this.getWellId());
+			duties.get(key).setDailyDate(this.getDailyDate());
+			rtn.add(duties.get(key));
+		}
+		return rtn;
+	}
+	
+	/**
+	 * 日报VO转为可持久化的PO
+	 * @return
+	 */
+	public RptOilDailyPO toPO() {
+		RptOilDailyPO po=new RptOilDailyPO();
+		BeanUtils.copyProperties(this, po);
+		return po;
+	}
+	
+}

+ 10 - 0
src/main/java/com/hb/proj/model/Well.java

@@ -75,4 +75,14 @@ public class Well {
      * 井状态
      */
     private String status;
+    
+    /**
+     * 采油井生产方式:自喷井\抽油机采\离心泵采
+     */
+    private String produceMode;
+    
+    /**
+     * 注水方式:正注\返注\笼统注
+     */
+    private String waterInjectMode;
 }

+ 124 - 0
src/main/java/com/hb/proj/rpt/controller/RptOilDailyController.java

@@ -0,0 +1,124 @@
+package com.hb.proj.rpt.controller;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import com.hb.proj.allconfig.AccessToken;
+import com.hb.proj.model.RptOilDailyDutyPO;
+import com.hb.proj.model.RptOilDailyPO;
+import com.hb.proj.model.RptOilDailyVO;
+import com.hb.proj.rpt.service.RptDailyDataService;
+import com.hb.proj.rpt.service.RptDailyExtractFacade;
+import com.hb.proj.utils.RespVO;
+import com.hb.proj.utils.RespVOBuilder;
+
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+
+@RestController
+@RequestMapping("/rpt/oil")
+@Validated
+public class RptOilDailyController {
+
+	@Autowired
+	private RptDailyExtractFacade  rptFacade;
+	
+	@Autowired
+	private RptDailyDataService  dailyService;
+	
+	/**
+	 * 加载报表数据
+	 * @param orgId
+	 * @param dailyDate
+	 * @param token
+	 * @return
+	 */
+	@RequestMapping("/load")
+	public RespVO<Object> load(@NotBlank(message = "缺少井站") String orgId, @NotNull(message = "缺少日报日期") Date dailyDate,
+			@NotNull(message = "缺少登录信息") AccessToken token) {
+		
+		List<RptOilDailyVO> dailies=dailyService.loadAuthOilWellBase(orgId, token.isSuperAdminIf()?null:token.getTokenId());
+		if(dailies==null || dailies.size()==0) {
+			return RespVOBuilder.error("未找到对应数据");
+		}
+		Map<String,RptOilDailyVO> dailyMapping=new HashMap<>(dailies.size());
+		for(RptOilDailyVO daily : dailies) {
+			dailyMapping.put(daily.getWellId(), daily);
+		}
+		
+		List<RptOilDailyVO> dbDailies=dailyService.loadDailies(dailyMapping.keySet(),dailyDate);
+		if(dbDailies==null || dbDailies.size()==0) {
+			return RespVOBuilder.error("未找到对应数据");
+		}
+		
+		List<RptOilDailyDutyPO> dbDuties=dailyService.loadDuties(dailyMapping.keySet(), dailyDate);
+		
+		if(dbDuties==null || dbDuties.size()==0) {
+			return RespVOBuilder.ok(dbDailies);
+		}
+		
+		dailyMapping=new HashMap<>(dbDailies.size());
+		for(RptOilDailyVO daily : dbDailies) {
+			dailyMapping.put(daily.getWellId(), daily);
+		}
+		
+		for(RptOilDailyDutyPO duty : dbDuties) {
+			dailyMapping.get(duty.getWellId()).addDuty(duty);
+		}
+		
+		
+		return RespVOBuilder.ok(dbDailies);
+	}
+	
+	/**
+	 * 提取日报数据
+	 * @param orgId
+	 * @param dailyDate
+	 * @param token
+	 * @return
+	 */
+	@RequestMapping("/extract")
+	public RespVO<Object> extract(@NotBlank(message = "缺少井站") String orgId,
+			@NotNull(message = "缺少日报日期") Date dailyDate, @NotNull(message = "缺少登录信息") AccessToken token) {
+		return RespVOBuilder.ok(rptFacade.extractDailyData(orgId,dailyDate,token.isSuperAdminIf()?null:token.getTokenId()));
+	}
+	
+	/**
+	 * 保存日报填报内容
+	 * @param daily
+	 * @param token
+	 * @return
+	 */
+	@RequestMapping("/save")
+	public RespVO<Object> save(@RequestBody @Valid List<RptOilDailyVO> dailies, AccessToken token) throws Exception{
+		if(dailies==null || dailies.size()==0) {
+			return RespVOBuilder.error("未提供要保存的数据");
+		}
+		List<RptOilDailyPO> dailyList=new ArrayList<>(dailies.size());
+		List<RptOilDailyDutyPO> dutyList=new ArrayList<>(dailies.size()*3);
+		RptOilDailyPO temp=null;
+		for(RptOilDailyVO dailyVO : dailies) {
+			temp=dailyVO.toPO();
+			temp.setCreateBy(token!=null?token.getUsName():"unknow");
+			temp.setModifyBy(temp.getCreateBy());
+			temp.setCreateTime(new Date());
+			temp.setModifyTime(new Date());
+			dailyList.add(temp);
+			dutyList.addAll(dailyVO.getInnerDuties());
+		}
+		
+		dailyService.saveRpt(dailyList, dutyList);
+		
+		return RespVOBuilder.ok();
+	}
+}

+ 215 - 0
src/main/java/com/hb/proj/rpt/service/RptDailyDataService.java

@@ -0,0 +1,215 @@
+package com.hb.proj.rpt.service;
+
+import java.util.Date;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import com.hb.proj.model.MultiDataVO;
+import com.hb.proj.model.RptOilDailyDutyPO;
+import com.hb.proj.model.RptOilDailyPO;
+import com.hb.proj.model.RptOilDailyVO;
+import com.hb.proj.model.SingleDataVO;
+import com.hb.proj.model.WellParamPO;
+import com.hb.xframework.dao.core.PreparedSQLArgs;
+import com.hb.xframework.dao.core.SpringJdbcDAO;
+import com.hb.xframework.dao.core.UpdateHandler;
+
+@Service
+public class RptDailyDataService {
+
+	@Autowired
+	private SpringJdbcDAO  dao;
+	
+	/**
+	 * 按日期查询多井的日报记录
+	 * @param wellIds
+	 * @param date
+	 * @return
+	 */
+	public List<RptOilDailyVO> loadDailies(Set<String> wellIds,Date date){
+		String sql="""
+				select w.well_name,r.* from tzl_rpt_daily_oil r 
+				inner join tzl_well w on r.well_id=w.well_id and w.del_if=false
+				where r.well_id in (%s) and r.daily_date=?
+				""";
+		return dao.queryForList(String.format(sql, "'"+StringUtils.join(wellIds,"','")+"'"), RptOilDailyVO.class, date);
+	}
+	
+	/**
+	 * 按日期查询多井的班报记录
+	 * @param wellIds
+	 * @param date
+	 * @return
+	 */
+	public List<RptOilDailyDutyPO> loadDuties(Set<String> wellIds,Date date){
+		String sql="""
+				select r.* from tzl_rpt_daily_oil_duty r 
+				where r.well_id in (%s) and r.daily_date=?
+				""";
+		return dao.queryForList(String.format(sql, "'"+StringUtils.join(wellIds,"','")+"'"), RptOilDailyDutyPO.class, date);
+	}
+	
+	/**
+	 * 查询权限内井的基本信息
+	 * @param orgId
+	 * @param authUsId
+	 * @return
+	 */
+	public List<RptOilDailyVO> loadAuthOilWellBase(String orgId,String authUsId){
+		
+		String sql="""
+					select w.well_id ,w.well_name,w.produce_mode,w.water_inject_mode
+					from tzl_well w
+					where w.del_if=false and w.org_id=? 
+				""";
+		
+		String ord="  order by w.display_num";
+		
+		if(StringUtils.isBlank(authUsId)) {
+			return dao.queryForList(sql+ord, RptOilDailyVO.class, orgId);
+		}
+		
+		
+		String authWhere="""		
+					  and  exists(select  data_id from tsys_role_data_auth rd  
+					inner join tsys_user_role ur on rd.role_id=ur.role_id
+					where ur.user_id=? and rd.data_id=w.well_id)
+				""";
+		
+		
+		return dao.queryForList(sql+authWhere+ord, RptOilDailyVO.class, orgId,authUsId);
+	}
+	
+	/**
+	 * 查询指定井指定参数类型的参数配置
+	 * @param wellIds
+	 * @param paramCodes
+	 * @return
+	 */
+	public List<WellParamPO> loadParamByWells(Set<String> wellIds,Set<String> paramCodes){
+		if(wellIds==null || wellIds.size()==0) {
+			return null;
+		}
+		String sql="""
+				select wp.*
+				from tzl_well_param wp
+				where wp.del_if=false and well_id in (%s)
+				and param_code in (%s)
+				""";
+		
+		//String arg="'"+StringUtils.join(new String[]{SortCodeConstant.PARAM_WELL_HEAD_TEMP,SortCodeConstant.PARAM_DIAGRAM_CURRENT,SortCodeConstant.PARAM_OIL_PRESS,SortCodeConstant.PARAM_CASING_PRESS,SortCodeConstant.PARAM_BACK_PRESS},"','")+"'";
+		return dao.queryForList(String.format(sql, "'"+StringUtils.join(wellIds, "','")+"'","'"+StringUtils.join(paramCodes, "','")+"'"),WellParamPO.class);
+	}
+	
+	/**
+	 * 查询指定井参数一段时间内的平均值
+	 * @param paramIds
+	 * @param startTime
+	 * @param endTime
+	 * @return
+	 */
+	public List<SingleDataVO> loadRTDataAvg(Set<String> paramIds,Date startTime,Date endTime){
+		String sql="""
+				select well_param,avg(data_val) data_val
+				from tzl_gather_data d
+				where well_param in (%s)
+				and gather_time between ? and ?
+				group by well_param
+			""";
+		
+		String paramstr="'"+StringUtils.join(paramIds,"','")+"'";
+		return dao.queryForList(String.format(sql, paramstr),SingleDataVO.class, startTime,endTime);
+	}
+	
+	/**
+	 * 查询指定井电流图额外参数一段时间内的平均值
+	 * @param paramIds
+	 * @param startTime
+	 * @param endTime
+	 * @return
+	 */
+	public List<MultiDataVO> loadDiagramExtrDataAvg(Set<String> paramIds,Date startTime,Date endTime) {
+		String sql="""
+					select well_param,avg(upstroke_max) upstroke_max,avg(downstroke_max) downstroke_max,avg(freq) freq,avg(stroke) stroke
+					from tzl_gather_data_multi
+					where well_param in (%s)
+					and gather_time between ? and ?
+					group by well_param
+				""";
+		
+		String paramstr="'"+StringUtils.join(paramIds,"','")+"'";
+		return dao.queryForList(String.format(sql, paramstr),MultiDataVO.class, startTime,endTime);
+	}
+	
+	/**
+	 * 保存报表数据
+	 * @param dailies
+	 * @param duties
+	 * @throws Exception
+	 */
+	public void saveRpt(List<RptOilDailyPO> dailies,List<RptOilDailyDutyPO> duties)throws Exception{
+		saveDailies(dailies);
+		saveDuties(duties);
+	}
+	
+	/**
+	 * 保存日报数据(更新操作)
+	 * @param dailies
+	 * @throws Exception
+	 */
+	public void saveDailies(List<RptOilDailyPO> dailies) throws Exception{
+		if(dailies==null || dailies.size()==0) {
+			return;
+		}
+		
+		Date dailyDate=null;
+		Set<String>  wellIds=new HashSet<>(dailies.size());
+		for(RptOilDailyPO daily : dailies) {
+			dailyDate=daily.getDailyDate();
+			wellIds.add(daily.getWellId());
+		}
+		
+		//先删除旧记录
+		dao.exeUpdate("delete from tzl_rpt_daily_oil where well_id in ('"+StringUtils.join(wellIds,"','")+"') and daily_date=?", dailyDate);
+		
+		//再批量加入新记录
+		PreparedSQLArgs preSQL=UpdateHandler.getInsertPreparedSQL(dailies.get(0), "tzl_rpt_daily_oil","daily_id");
+		
+		List<Object[]> batchParams=UpdateHandler.generateBatchParams(dailies, preSQL.getParamNames());
+		
+		dao.getJdbcTemplate().batchUpdate(preSQL.getSql(), batchParams);
+		
+	}
+	
+	/**
+	 * 保存班报数据(更新操作)
+	 * @param duties
+	 * @throws Exception
+	 */
+	public void saveDuties(List<RptOilDailyDutyPO> duties) throws Exception{
+		if(duties==null || duties.size()==0) {
+			return ;
+		}
+		Date dailyDate=null;
+		Set<String>  wellIds=new HashSet<>(duties.size());
+		for(RptOilDailyDutyPO duty : duties) {
+			dailyDate=duty.getDailyDate();
+			wellIds.add(duty.getWellId());
+		}
+		
+		//先删除旧记录
+		dao.exeUpdate("delete from tzl_rpt_daily_oil_duty where well_id in ('"+StringUtils.join(wellIds,"','")+"') and daily_date=?", dailyDate);
+		
+		//再批量加入新记录
+		PreparedSQLArgs preSQL=UpdateHandler.getInsertPreparedSQL(duties.get(0), "tzl_rpt_daily_oil_duty","duty_id");
+		
+		List<Object[]> batchParams=UpdateHandler.generateBatchParams(duties, preSQL.getParamNames());
+		
+		dao.getJdbcTemplate().batchUpdate(preSQL.getSql(), batchParams);
+	}
+}

+ 299 - 0
src/main/java/com/hb/proj/rpt/service/RptDailyExtractFacade.java

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