|  | @@ -1,1146 +1,1159 @@
 | 
	
		
			
				|  |  | -package com.steerinfo.ems.trmcalpointvalue.service.impl;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -import com.steerinfo.auth.utils.JwtUtil;
 | 
	
		
			
				|  |  | -import com.steerinfo.ems.Utils.DateUtils;
 | 
	
		
			
				|  |  | -import com.steerinfo.ems.cordasconfiguration.mapper.CordasConfigurationMapper;
 | 
	
		
			
				|  |  | -import com.steerinfo.ems.cordasconfiguration.model.CordasConfiguration;
 | 
	
		
			
				|  |  | -import com.steerinfo.ems.emscalpointvalue.mapper.EmsCalpointValueMapper;
 | 
	
		
			
				|  |  | -import com.steerinfo.ems.emscalpointvalue.model.EmsCalpointValue;
 | 
	
		
			
				|  |  | -import com.steerinfo.ems.emswaterrealtime.service.IEmsWaterRealtimeService;
 | 
	
		
			
				|  |  | -import com.steerinfo.ems.formula.service.IFormulaService;
 | 
	
		
			
				|  |  | -import com.steerinfo.ems.mesemsdieseloil.service.IMesEmsDieseloilService;
 | 
	
		
			
				|  |  | -import com.steerinfo.ems.trmcalpoint.mapper.TRmCalpointMapper;
 | 
	
		
			
				|  |  | -import com.steerinfo.ems.trmcalpoint.model.TRmCalpoint;
 | 
	
		
			
				|  |  | -import com.steerinfo.ems.trmcalpointexvalue.model.TRmCalpointExValue;
 | 
	
		
			
				|  |  | -import com.steerinfo.ems.trmcalpointexvalue.service.ITRmCalpointExValueService;
 | 
	
		
			
				|  |  | -import com.steerinfo.ems.trmcalpointvalue.mapper.TRmCalpointValueMapper;
 | 
	
		
			
				|  |  | -import com.steerinfo.ems.trmcalpointvalue.model.TRmCalpointValue;
 | 
	
		
			
				|  |  | -import com.steerinfo.ems.trmcalpointvalue.service.ITRmCalpointValueService;
 | 
	
		
			
				|  |  | -import com.steerinfo.framework.mapper.IBaseMapper;
 | 
	
		
			
				|  |  | -import com.steerinfo.framework.service.impl.BaseServiceImpl;
 | 
	
		
			
				|  |  | -import org.slf4j.Logger;
 | 
	
		
			
				|  |  | -import org.slf4j.LoggerFactory;
 | 
	
		
			
				|  |  | -import org.springframework.beans.factory.annotation.Autowired;
 | 
	
		
			
				|  |  | -import org.springframework.dao.DataAccessException;
 | 
	
		
			
				|  |  | -import org.springframework.jdbc.core.JdbcTemplate;
 | 
	
		
			
				|  |  | -import org.springframework.stereotype.Service;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -import java.math.BigDecimal;
 | 
	
		
			
				|  |  | -import java.text.ParseException;
 | 
	
		
			
				|  |  | -import java.text.SimpleDateFormat;
 | 
	
		
			
				|  |  | -import java.util.*;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -/**
 | 
	
		
			
				|  |  | - * TRmCalpointValue服务实现:
 | 
	
		
			
				|  |  | - * @author generator
 | 
	
		
			
				|  |  | - * @version 1.0-SNAPSHORT 2019-10-17 03:55
 | 
	
		
			
				|  |  | - * 类描述
 | 
	
		
			
				|  |  | - * 修订历史:
 | 
	
		
			
				|  |  | - * 日期:2019-10-17
 | 
	
		
			
				|  |  | - * 作者:generator
 | 
	
		
			
				|  |  | - * 参考:
 | 
	
		
			
				|  |  | - * 描述:TRmCalpointValue服务实现
 | 
	
		
			
				|  |  | - * @see null
 | 
	
		
			
				|  |  | - * @Copyright 湖南视拓信息技术股份有限公司. All rights reserved.
 | 
	
		
			
				|  |  | - */
 | 
	
		
			
				|  |  | -@Service(value = "tRmCalpointValueService")
 | 
	
		
			
				|  |  | -public class TRmCalpointValueServiceImpl extends BaseServiceImpl<TRmCalpointValue, HashMap<String, Object>> implements ITRmCalpointValueService {
 | 
	
		
			
				|  |  | -	
 | 
	
		
			
				|  |  | -	private static final Logger logger = LoggerFactory.getLogger(TRmCalpointValueServiceImpl.class);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	@Autowired
 | 
	
		
			
				|  |  | -    private JdbcTemplate jdbcTemplate;
 | 
	
		
			
				|  |  | -	
 | 
	
		
			
				|  |  | -    @Autowired
 | 
	
		
			
				|  |  | -    private TRmCalpointValueMapper tRmCalpointValueMapper;
 | 
	
		
			
				|  |  | -    
 | 
	
		
			
				|  |  | -    @Autowired
 | 
	
		
			
				|  |  | -    private TRmCalpointMapper tRmCalpointMapper;
 | 
	
		
			
				|  |  | -    
 | 
	
		
			
				|  |  | -    @Autowired
 | 
	
		
			
				|  |  | -    private IFormulaService formulaService;
 | 
	
		
			
				|  |  | -    
 | 
	
		
			
				|  |  | -    @Autowired
 | 
	
		
			
				|  |  | -    private CordasConfigurationMapper cordasConfigurationMapper;
 | 
	
		
			
				|  |  | -    
 | 
	
		
			
				|  |  | -    @Autowired
 | 
	
		
			
				|  |  | -    private EmsCalpointValueMapper emsCalpointValueMapper;
 | 
	
		
			
				|  |  | -    
 | 
	
		
			
				|  |  | -    @Autowired
 | 
	
		
			
				|  |  | -    ITRmCalpointExValueService tRmCalpointExValueService;
 | 
	
		
			
				|  |  | -    
 | 
	
		
			
				|  |  | -    @Autowired
 | 
	
		
			
				|  |  | -    IMesEmsDieseloilService mesEmsDieseloilService;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	@Autowired
 | 
	
		
			
				|  |  | -	IEmsWaterRealtimeService emsWaterRealtimeService;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    @Override
 | 
	
		
			
				|  |  | -    protected IBaseMapper<TRmCalpointValue, HashMap<String, Object>> getMapper() {
 | 
	
		
			
				|  |  | -        return tRmCalpointValueMapper;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	@Override
 | 
	
		
			
				|  |  | -	//@Transactional(rollbackFor=Exception.class)
 | 
	
		
			
				|  |  | -	public void statData(Date date) {
 | 
	
		
			
				|  |  | -		Calendar calendar = Calendar.getInstance();
 | 
	
		
			
				|  |  | -		calendar.setTime(date);
 | 
	
		
			
				|  |  | -		int dm = calendar.get(Calendar.DAY_OF_MONTH);
 | 
	
		
			
				|  |  | -		int dy = calendar.get(Calendar.DAY_OF_YEAR);
 | 
	
		
			
				|  |  | -		String today = new SimpleDateFormat("yyyy-MM-dd").format(calendar.getTime());
 | 
	
		
			
				|  |  | -		String thisMonth = new SimpleDateFormat("yyyy-MM").format(calendar.getTime());
 | 
	
		
			
				|  |  | -		String thisYear = calendar.get(Calendar.YEAR) + "";
 | 
	
		
			
				|  |  | -		String lastYear = (calendar.get(Calendar.YEAR)-1) + "";
 | 
	
		
			
				|  |  | -		calendar.add(Calendar.DAY_OF_YEAR, -1); // 减1天获得昨日日期
 | 
	
		
			
				|  |  | -		String yesterday = new SimpleDateFormat("yyyy-MM-dd").format(calendar.getTime());
 | 
	
		
			
				|  |  | -		calendar.add(Calendar.DAY_OF_YEAR, 1); 
 | 
	
		
			
				|  |  | -		calendar.add(Calendar.MONTH, -1); // 减1月获得上月
 | 
	
		
			
				|  |  | -		String lastMonth = new SimpleDateFormat("yyyy-MM").format(calendar.getTime());
 | 
	
		
			
				|  |  | -		
 | 
	
		
			
				|  |  | -		Map<String, Object> m = new HashMap<String, Object>();
 | 
	
		
			
				|  |  | -		m.put("useflag", "1");
 | 
	
		
			
				|  |  | -		// 查询需要统计的计量点信息
 | 
	
		
			
				|  |  | -		List<TRmCalpoint> l = tRmCalpointMapper.selectCalpoints(m);
 | 
	
		
			
				|  |  | -		if(l!=null && l.size()>0){
 | 
	
		
			
				|  |  | -			for(TRmCalpoint tRmCalpoint : l){
 | 
	
		
			
				|  |  | -				String itemtype = tRmCalpoint.getItemtype(); // 类型 AUTO:自动,MANUAL:手抄,VIRTUAL:虚拟
 | 
	
		
			
				|  |  | -				String mintimegranid = tRmCalpoint.getMintimegranid()==null? "DAY" : tRmCalpoint.getMintimegranid();
 | 
	
		
			
				|  |  | -				// 最小粒度日时间粒度数据
 | 
	
		
			
				|  |  | -				if(mintimegranid.equalsIgnoreCase("DAY") || mintimegranid.equalsIgnoreCase("SHIFT")){
 | 
	
		
			
				|  |  | -					// 手动提前生成时间粒度
 | 
	
		
			
				|  |  | -					String dclk = itemtype.equalsIgnoreCase("MANUAL")?today:yesterday;
 | 
	
		
			
				|  |  | -					restatCalData(tRmCalpoint, dclk, "DAY", "系统");
 | 
	
		
			
				|  |  | -				}
 | 
	
		
			
				|  |  | -				// 月时间粒度数据,每月统计上月数据
 | 
	
		
			
				|  |  | -				if (dm < 3 && !mintimegranid.equalsIgnoreCase("YEAR")) {
 | 
	
		
			
				|  |  | -					restatCalData(tRmCalpoint, lastMonth, "MONTH", "系统");
 | 
	
		
			
				|  |  | -				}
 | 
	
		
			
				|  |  | -				// 年时间粒度数据,每年第一天统计去年数据
 | 
	
		
			
				|  |  | -				if (dy < 3) {
 | 
	
		
			
				|  |  | -					restatCalData(tRmCalpoint, lastYear, "YEAR", "系统");
 | 
	
		
			
				|  |  | -				}
 | 
	
		
			
				|  |  | -			}
 | 
	
		
			
				|  |  | -			logger.info(new SimpleDateFormat("yyyy-MM-dd").format(date) + " 计量点定时统计数据任务执行完毕~");
 | 
	
		
			
				|  |  | -		}
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	@Override
 | 
	
		
			
				|  |  | -	public TRmCalpointValue modifyAndCompute(TRmCalpointValue tRmCalpointValue) {
 | 
	
		
			
				|  |  | -		tRmCalpointValueMapper.updateByPrimaryKeySelective(tRmCalpointValue);
 | 
	
		
			
				|  |  | -		String itemid = tRmCalpointValue.getItemid();
 | 
	
		
			
				|  |  | -		String clock = tRmCalpointValue.getClock();
 | 
	
		
			
				|  |  | -		String timegranid = tRmCalpointValue.getTimegranid();
 | 
	
		
			
				|  |  | -		// 重新计算
 | 
	
		
			
				|  |  | -		formulaService.reCalculate(itemid, clock, timegranid, clock);
 | 
	
		
			
				|  |  | -		return tRmCalpointValueMapper.selectByPrimaryKey(tRmCalpointValue.getId());
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	@Override
 | 
	
		
			
				|  |  | -	public void statDataShift(Date date) {
 | 
	
		
			
				|  |  | -		Calendar cal = Calendar.getInstance();
 | 
	
		
			
				|  |  | -		cal.setTime(date);
 | 
	
		
			
				|  |  | -		cal.add(Calendar.HOUR_OF_DAY, -8); // 减8小时获得需要统计的上一个班的时间
 | 
	
		
			
				|  |  | -		SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH");
 | 
	
		
			
				|  |  | -		int dh = cal.get(Calendar.HOUR_OF_DAY);
 | 
	
		
			
				|  |  | -		if(dh%8==0){
 | 
	
		
			
				|  |  | -			logger.info("节点时间不统计数据,以防数据出错");
 | 
	
		
			
				|  |  | -			return;
 | 
	
		
			
				|  |  | -		}
 | 
	
		
			
				|  |  | -		// 统计日
 | 
	
		
			
				|  |  | -		String statTim = new SimpleDateFormat("yyyy-MM-dd ").format(cal.getTime());
 | 
	
		
			
				|  |  | -		// clock 格式:yyyy-MM-dd HH
 | 
	
		
			
				|  |  | -		String clock = statTim+String.format("%02d", (dh/8)*8+8);
 | 
	
		
			
				|  |  | -		// 期初时间
 | 
	
		
			
				|  |  | -		String starth = statTim+String.format("%02d", (dh/8)*8);
 | 
	
		
			
				|  |  | -		// 期末时间
 | 
	
		
			
				|  |  | -		String endh = "";
 | 
	
		
			
				|  |  | -		try {
 | 
	
		
			
				|  |  | -			endh = sf.format(sf.parse(clock));
 | 
	
		
			
				|  |  | -		} catch (Exception e) {
 | 
	
		
			
				|  |  | -			logger.error("日期格式错误");
 | 
	
		
			
				|  |  | -			return;
 | 
	
		
			
				|  |  | -		}
 | 
	
		
			
				|  |  | -		Map<String, Object> m = new HashMap<String, Object>();
 | 
	
		
			
				|  |  | -		m.put("useflag", "1");
 | 
	
		
			
				|  |  | -		m.put("mintimegranid", "SHIFT");
 | 
	
		
			
				|  |  | -		// 查询需要统计的计量点信息
 | 
	
		
			
				|  |  | -		List<TRmCalpoint> l = tRmCalpointMapper.selectCalpoints(m);
 | 
	
		
			
				|  |  | -		if(l!=null && l.size()>0){
 | 
	
		
			
				|  |  | -			for(TRmCalpoint tRmCalpoint : l){
 | 
	
		
			
				|  |  | -				String itemtype = tRmCalpoint.getItemtype(); // 类型 AUTO:自动,MANUAL:手抄,VIRTUAL:虚拟
 | 
	
		
			
				|  |  | -				String itemid = tRmCalpoint.getItemid();
 | 
	
		
			
				|  |  | -				String itemname = tRmCalpoint.getItemname();
 | 
	
		
			
				|  |  | -				String tagTable = tRmCalpoint.getTagTable()==null? "" :tRmCalpoint.getTagTable().trim(); // 小时表
 | 
	
		
			
				|  |  | -				String tagCol = tRmCalpoint.getTagCol()==null? "" :tRmCalpoint.getTagCol().trim(); // 小时表字段
 | 
	
		
			
				|  |  | -				String energytypeid = tRmCalpoint.getEnergytypeid(); // 能介大类
 | 
	
		
			
				|  |  | -				String tagBadStr = tRmCalpoint.getTagBadSymbol()==null? "-1" : tRmCalpoint.getTagBadSymbol();
 | 
	
		
			
				|  |  | -				Double mod = tRmCalpoint.getTagModulus() == null? 1d : tRmCalpoint.getTagModulus().doubleValue(); // 倍率
 | 
	
		
			
				|  |  | -				Double tagBad = -1d; // 异常点标签(读表异常时候插入的值)
 | 
	
		
			
				|  |  | -				try {
 | 
	
		
			
				|  |  | -					tagBad = Double.parseDouble(tagBadStr);
 | 
	
		
			
				|  |  | -				} catch (NumberFormatException e) {
 | 
	
		
			
				|  |  | -					logger.error("计量点" + itemid + "的tag_bad_symbol值格式应该为负数,当前值为:" + tagBadStr);
 | 
	
		
			
				|  |  | -					tagBad = -1d;
 | 
	
		
			
				|  |  | -				}
 | 
	
		
			
				|  |  | -				if(itemtype.equalsIgnoreCase("AUTO") && (tagTable.isEmpty() || tagCol.isEmpty())){
 | 
	
		
			
				|  |  | -					logger.error("计量点的数据表与数据列信息不完整!itemid:" + itemid);
 | 
	
		
			
				|  |  | -					// 班时间粒度该项目数据是否已经存在
 | 
	
		
			
				|  |  | -					String sql = "select count(1) from T_RM_CALPOINT_VALUE where clock = ? and timegranid='SHIFT' and itemid = ?";
 | 
	
		
			
				|  |  | -					int c = jdbcTemplate.queryForObject(sql, new Object[]{clock,itemid}, Integer.class);
 | 
	
		
			
				|  |  | -					if(c>0){
 | 
	
		
			
				|  |  | -						logger.error(clock + "-itemid:" + itemid + " 已存在数据。");
 | 
	
		
			
				|  |  | -					}else{
 | 
	
		
			
				|  |  | -						TRmCalpointValue t = new TRmCalpointValue();
 | 
	
		
			
				|  |  | -						t.setClock(clock);
 | 
	
		
			
				|  |  | -						t.setTimegranid("SHIFT");
 | 
	
		
			
				|  |  | -						t.setItemid(itemid);
 | 
	
		
			
				|  |  | -						t.setItemname(itemname);
 | 
	
		
			
				|  |  | -						t.setApportvalue(BigDecimal.ZERO); // 最终值
 | 
	
		
			
				|  |  | -						t.setActualvalue(BigDecimal.ZERO); // 计算值
 | 
	
		
			
				|  |  | -						t.setCorrectvalue(BigDecimal.ZERO); // 修正值
 | 
	
		
			
				|  |  | -						t.setMintvalue(BigDecimal.ZERO);
 | 
	
		
			
				|  |  | -						t.setMendvalue(BigDecimal.ZERO);
 | 
	
		
			
				|  |  | -						t.setSumvalue(BigDecimal.ZERO);
 | 
	
		
			
				|  |  | -						t.setBz("-1:请配置数据表与数据列");
 | 
	
		
			
				|  |  | -						t.setRecTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
 | 
	
		
			
				|  |  | -						t.setUpman("系统");
 | 
	
		
			
				|  |  | -						tRmCalpointValueMapper.insertSelective(t);
 | 
	
		
			
				|  |  | -						//throw new RuntimeException("请先在计量点信息维护中配置计量点的数据表与数据列!");
 | 
	
		
			
				|  |  | -						continue;
 | 
	
		
			
				|  |  | -					}
 | 
	
		
			
				|  |  | -				}
 | 
	
		
			
				|  |  | -				Short digits = tRmCalpoint.getDigits() == null ? 4 : tRmCalpoint.getDigits();
 | 
	
		
			
				|  |  | -				Short digits2 = tRmCalpoint.getMeterScale() == null ? 4 : tRmCalpoint.getMeterScale(); // 准点值精度
 | 
	
		
			
				|  |  | -				Double qc = 0d; // 仪表期初值
 | 
	
		
			
				|  |  | -				Double qm = 0d; // 仪表期末值
 | 
	
		
			
				|  |  | -				
 | 
	
		
			
				|  |  | -				// 班时间粒度该项目数据是否已经存在
 | 
	
		
			
				|  |  | -				String sql = "select count(1) from T_RM_CALPOINT_VALUE where clock = ? and timegranid='SHIFT' and itemid = ?";
 | 
	
		
			
				|  |  | -				int c = jdbcTemplate.queryForObject(sql, new Object[]{clock,itemid}, Integer.class);
 | 
	
		
			
				|  |  | -				if(c>0){
 | 
	
		
			
				|  |  | -					logger.error(clock + "-itemid:" + itemid + " 已存在数据。");
 | 
	
		
			
				|  |  | -				}else{
 | 
	
		
			
				|  |  | -					TRmCalpointValue t = new TRmCalpointValue();
 | 
	
		
			
				|  |  | -					t.setClock(clock);
 | 
	
		
			
				|  |  | -					t.setTimegranid("SHIFT");
 | 
	
		
			
				|  |  | -					t.setItemid(itemid);
 | 
	
		
			
				|  |  | -					t.setItemname(itemname);
 | 
	
		
			
				|  |  | -					t.setApportvalue(BigDecimal.ZERO); // 最终值
 | 
	
		
			
				|  |  | -					t.setCorrectvalue(BigDecimal.ZERO); // 修正值
 | 
	
		
			
				|  |  | -					t.setActualvalue(BigDecimal.ZERO); // 计算值
 | 
	
		
			
				|  |  | -					if(itemtype.equalsIgnoreCase("AUTO") && !tagTable.equalsIgnoreCase("MES_EMS_DIESELOIL")){
 | 
	
		
			
				|  |  | -						// 获取仪表期初、期末值
 | 
	
		
			
				|  |  | -						sql = "select nvl(round("+tagCol+", "+digits2+"),0) from "+tagTable + "_ORG where clock = ?";
 | 
	
		
			
				|  |  | -						try {
 | 
	
		
			
				|  |  | -							qc = jdbcTemplate.queryForObject(sql, new Object[]{starth}, Double.class);
 | 
	
		
			
				|  |  | -							if(qc!=null && Math.abs(qc) > Integer.MAX_VALUE){
 | 
	
		
			
				|  |  | -								t.setBz("仪表期初值异常:" + qc);
 | 
	
		
			
				|  |  | -								qc = tagBad;
 | 
	
		
			
				|  |  | -							}
 | 
	
		
			
				|  |  | -						} catch(DataAccessException e) {
 | 
	
		
			
				|  |  | -							logger.error(starth + "-itemid:" + itemid + " 没有仪表期初值。");
 | 
	
		
			
				|  |  | -							qc = tagBad;
 | 
	
		
			
				|  |  | -						}
 | 
	
		
			
				|  |  | -						try {
 | 
	
		
			
				|  |  | -							qm = jdbcTemplate.queryForObject(sql, new Object[]{endh}, Double.class);
 | 
	
		
			
				|  |  | -							if(qm!=null && Math.abs(qm) > Integer.MAX_VALUE){
 | 
	
		
			
				|  |  | -								t.setBz("仪表期末值异常:" + qm);
 | 
	
		
			
				|  |  | -								qm = tagBad;
 | 
	
		
			
				|  |  | -							}
 | 
	
		
			
				|  |  | -						} catch(DataAccessException e) {
 | 
	
		
			
				|  |  | -							logger.error(endh + "-itemid:" + itemid + " 没有仪表期末值。");
 | 
	
		
			
				|  |  | -							qm = tagBad;
 | 
	
		
			
				|  |  | -						}
 | 
	
		
			
				|  |  | -						t.setMintvalue(qc==null?null:new BigDecimal(Double.toString(qc)));
 | 
	
		
			
				|  |  | -						t.setMendvalue(qm==null?null:new BigDecimal(Double.toString(qm)));
 | 
	
		
			
				|  |  | -						if(qm == tagBad || qc == tagBad || qc == 0d || new BigDecimal(Double.toString(qm)).subtract(new BigDecimal(Double.toString(qc))).doubleValue()<0
 | 
	
		
			
				|  |  | -								|| !energytypeid.equalsIgnoreCase("E")){
 | 
	
		
			
				|  |  | -							sql = "select nvl(round(sum("+tagCol+")*"+mod+", "+digits+"),0) from "+tagTable+" where clock >= ? and clock<?";
 | 
	
		
			
				|  |  | -							Double d = 0d;
 | 
	
		
			
				|  |  | -							try {
 | 
	
		
			
				|  |  | -								d = jdbcTemplate.queryForObject(sql, new Object[]{starth,endh}, Double.class);
 | 
	
		
			
				|  |  | -								if(d!=null && Math.abs(d) > Integer.MAX_VALUE){
 | 
	
		
			
				|  |  | -									t.setBz("仪表数值异常:" + d);
 | 
	
		
			
				|  |  | -									d = 0d;
 | 
	
		
			
				|  |  | -								}
 | 
	
		
			
				|  |  | -							}catch(Exception e) {
 | 
	
		
			
				|  |  | -								e.printStackTrace();
 | 
	
		
			
				|  |  | -								logger.error(endh + "-itemid:" + itemid + " 取值错误, tagTable-" + tagTable + ",tagCol-" + tagCol);
 | 
	
		
			
				|  |  | -								continue;
 | 
	
		
			
				|  |  | -							}
 | 
	
		
			
				|  |  | -							t.setApportvalue(d==null?null:new BigDecimal(Double.toString(d))); // 最终值
 | 
	
		
			
				|  |  | -							t.setActualvalue(d==null?null:new BigDecimal(Double.toString(d))); // 计算值
 | 
	
		
			
				|  |  | -						}else{
 | 
	
		
			
				|  |  | -							// 仪表期末值 - 仪表期初值
 | 
	
		
			
				|  |  | -							BigDecimal ap = new BigDecimal(Double.toString(qm)).subtract(new BigDecimal(Double.toString(qc))).multiply(new BigDecimal(mod)).setScale(digits, BigDecimal.ROUND_HALF_UP);
 | 
	
		
			
				|  |  | -							t.setApportvalue(ap); // 最终值
 | 
	
		
			
				|  |  | -							t.setActualvalue(ap); // 计算值
 | 
	
		
			
				|  |  | -						}
 | 
	
		
			
				|  |  | -					}else if(itemtype.equalsIgnoreCase("MANUAL")){ // 手动
 | 
	
		
			
				|  |  | -						// 当前小时数
 | 
	
		
			
				|  |  | -						int h = Calendar.getInstance().get(Calendar.HOUR_OF_DAY);
 | 
	
		
			
				|  |  | -						// clock 格式:yyyy-MM-dd HH,手动计量点提前生成数据
 | 
	
		
			
				|  |  | -						String clk = new SimpleDateFormat("yyyy-MM-dd ").format(new Date())+String.format("%02d", (h/8)*8+8);
 | 
	
		
			
				|  |  | -						t.setClock(clk);
 | 
	
		
			
				|  |  | -					}else if(itemtype.equalsIgnoreCase("VIRTUAL")){
 | 
	
		
			
				|  |  | -						// 获得计算公式
 | 
	
		
			
				|  |  | -						String formula = formulaService.getFormula(itemid,clock);
 | 
	
		
			
				|  |  | -						// 根据公式获取计算值
 | 
	
		
			
				|  |  | -						Double dval = formulaService.getValByFormula(formula, "SHIFT", clock, digits, 0);
 | 
	
		
			
				|  |  | -						if(dval < 0){
 | 
	
		
			
				|  |  | -							logger.error(clock + "-itemid:" + itemid + " 计算公式错误。");
 | 
	
		
			
				|  |  | -						}
 | 
	
		
			
				|  |  | -						t.setApportvalue(new BigDecimal(Double.toString(dval))); // 最终值
 | 
	
		
			
				|  |  | -						t.setActualvalue(new BigDecimal(Double.toString(dval))); // 计算值
 | 
	
		
			
				|  |  | -					}
 | 
	
		
			
				|  |  | -					t.setRecTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
 | 
	
		
			
				|  |  | -					t.setUpman("系统");
 | 
	
		
			
				|  |  | -					tRmCalpointValueMapper.insertSelective(t);
 | 
	
		
			
				|  |  | -				}
 | 
	
		
			
				|  |  | -			}
 | 
	
		
			
				|  |  | -		}
 | 
	
		
			
				|  |  | -		logger.info(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date) + " 计量点班粒度定时统计数据任务执行完毕~");
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	@Override
 | 
	
		
			
				|  |  | -	public String restatAllData(String clock, String timegranid) {
 | 
	
		
			
				|  |  | -		String opuser = JwtUtil.getUseridByToken();
 | 
	
		
			
				|  |  | -		// 班粒度,只重新计算当月班数据
 | 
	
		
			
				|  |  | -		if(timegranid.equalsIgnoreCase("SHIFT")){
 | 
	
		
			
				|  |  | -			Date startDay = new Date();
 | 
	
		
			
				|  |  | -			Date endDay = new Date();
 | 
	
		
			
				|  |  | -			SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH");
 | 
	
		
			
				|  |  | -			try {
 | 
	
		
			
				|  |  | -				startDay = sf.parse(clock);
 | 
	
		
			
				|  |  | -			} catch (Exception e) {
 | 
	
		
			
				|  |  | -				return "日期格式错误";
 | 
	
		
			
				|  |  | -			}
 | 
	
		
			
				|  |  | -			Calendar cal = Calendar.getInstance();
 | 
	
		
			
				|  |  | -			cal.add(Calendar.HOUR_OF_DAY, -1);
 | 
	
		
			
				|  |  | -			cal.add(Calendar.MINUTE, -1);
 | 
	
		
			
				|  |  | -			
 | 
	
		
			
				|  |  | -			// 当月,统计最后时间为昨天
 | 
	
		
			
				|  |  | -			if(new SimpleDateFormat("yyyy-MM").format(cal.getTime()).equals(clock.substring(0, 7))){
 | 
	
		
			
				|  |  | -				endDay = cal.getTime();
 | 
	
		
			
				|  |  | -			}else{
 | 
	
		
			
				|  |  | -				// 非当月,统计到下月初
 | 
	
		
			
				|  |  | -				Calendar c = Calendar.getInstance();
 | 
	
		
			
				|  |  | -				c.setTime(startDay);
 | 
	
		
			
				|  |  | -				c.set(Calendar.DAY_OF_MONTH, 1);
 | 
	
		
			
				|  |  | -				c.add(Calendar.MONTH, 1);
 | 
	
		
			
				|  |  | -				c.set(Calendar.HOUR_OF_DAY, 0);
 | 
	
		
			
				|  |  | -				endDay = c.getTime();
 | 
	
		
			
				|  |  | -			}
 | 
	
		
			
				|  |  | -			while(!startDay.after(endDay)){
 | 
	
		
			
				|  |  | -				// 统计结束时间 
 | 
	
		
			
				|  |  | -				String clk = sf.format(startDay);
 | 
	
		
			
				|  |  | -				int st = Integer.valueOf(clk.substring(11));
 | 
	
		
			
				|  |  | -				// 0点数据转成班记录24点,clock
 | 
	
		
			
				|  |  | -				if(st == 0){
 | 
	
		
			
				|  |  | -					clk = sf.format(new Date(startDay.getTime() - 1000l)).substring(0, 11) + 24;
 | 
	
		
			
				|  |  | -				}
 | 
	
		
			
				|  |  | -				Map<String, Object> m = new HashMap<String, Object>();
 | 
	
		
			
				|  |  | -				m.put("useflag", "1");
 | 
	
		
			
				|  |  | -				m.put("mintimegranid", "SHIFT");
 | 
	
		
			
				|  |  | -				// 查询需要统计的计量点信息
 | 
	
		
			
				|  |  | -				List<TRmCalpoint> l = tRmCalpointMapper.selectCalpoints(m);
 | 
	
		
			
				|  |  | -				if(l!=null && l.size()>0){
 | 
	
		
			
				|  |  | -					for(TRmCalpoint tRmCalpoint : l){
 | 
	
		
			
				|  |  | -						restatCalData(tRmCalpoint, clk, "SHIFT", opuser);
 | 
	
		
			
				|  |  | -					}
 | 
	
		
			
				|  |  | -				}
 | 
	
		
			
				|  |  | -				startDay = new Date(startDay.getTime() + 8*3600*1000L);
 | 
	
		
			
				|  |  | -			}
 | 
	
		
			
				|  |  | -		}else if(timegranid.equalsIgnoreCase("DAY")){ // 重新计算日、月、年粒度数据
 | 
	
		
			
				|  |  | -			Date startDay = null; // 计算开始日期
 | 
	
		
			
				|  |  | -			Date endDay = null; // 计算结束日期
 | 
	
		
			
				|  |  | -			try {
 | 
	
		
			
				|  |  | -				startDay = new SimpleDateFormat("yyyy-MM-dd").parse(clock);
 | 
	
		
			
				|  |  | -			} catch (ParseException e) {
 | 
	
		
			
				|  |  | -				return "日期格式错误";
 | 
	
		
			
				|  |  | -			}
 | 
	
		
			
				|  |  | -			// 最后可以统计的日期
 | 
	
		
			
				|  |  | -			Calendar cal = Calendar.getInstance();
 | 
	
		
			
				|  |  | -			cal.add(Calendar.HOUR_OF_DAY, -1);
 | 
	
		
			
				|  |  | -			cal.add(Calendar.MINUTE, -1);
 | 
	
		
			
				|  |  | -			// 当月,统计最后时间为昨天
 | 
	
		
			
				|  |  | -			if(new SimpleDateFormat("yyyy-MM").format(cal.getTime()).equals(clock.substring(0, 7))){
 | 
	
		
			
				|  |  | -				endDay = cal.getTime();
 | 
	
		
			
				|  |  | -			}else{
 | 
	
		
			
				|  |  | -				// 非当月,统计到月底
 | 
	
		
			
				|  |  | -				Calendar c = Calendar.getInstance();
 | 
	
		
			
				|  |  | -				c.setTime(startDay);
 | 
	
		
			
				|  |  | -				c.set(Calendar.DAY_OF_MONTH, 1);
 | 
	
		
			
				|  |  | -				c.add(Calendar.MONTH, 1);
 | 
	
		
			
				|  |  | -				c.add(Calendar.DAY_OF_YEAR, -1);
 | 
	
		
			
				|  |  | -				endDay = c.getTime();
 | 
	
		
			
				|  |  | -			}
 | 
	
		
			
				|  |  | -			// 统计开始日期
 | 
	
		
			
				|  |  | -			Calendar sta = Calendar.getInstance();
 | 
	
		
			
				|  |  | -			sta.setTime(startDay);
 | 
	
		
			
				|  |  | -			// 月粒度统计
 | 
	
		
			
				|  |  | -			int startMonth = sta.get(Calendar.MONTH)+1;
 | 
	
		
			
				|  |  | -			int endMonth = 12;
 | 
	
		
			
				|  |  | -			// 如果是今年,计算最后月份为上月
 | 
	
		
			
				|  |  | -			if(sta.get(Calendar.YEAR) ==  cal.get(Calendar.YEAR)){
 | 
	
		
			
				|  |  | -				endMonth = cal.get(Calendar.MONTH);
 | 
	
		
			
				|  |  | -			}
 | 
	
		
			
				|  |  | -			// 查询需要统计的计量点信息,最小粒度为班和日的
 | 
	
		
			
				|  |  | -			Map<String, Object> m = new HashMap<String, Object>();
 | 
	
		
			
				|  |  | -			m.put("useflag", "1");
 | 
	
		
			
				|  |  | -			m.put("mintimegranid", "SHIFT");
 | 
	
		
			
				|  |  | -			List<TRmCalpoint> l = tRmCalpointMapper.selectCalpoints(m);
 | 
	
		
			
				|  |  | -			m.put("mintimegranid", "DAY");
 | 
	
		
			
				|  |  | -			l.addAll(tRmCalpointMapper.selectCalpoints(m));
 | 
	
		
			
				|  |  | -			// 重新计算日数据
 | 
	
		
			
				|  |  | -			while(!startDay.after(endDay)){
 | 
	
		
			
				|  |  | -				String clk = new SimpleDateFormat("yyyy-MM-dd").format(startDay);
 | 
	
		
			
				|  |  | -				for(TRmCalpoint tRmCalpoint : l){
 | 
	
		
			
				|  |  | -					restatCalData(tRmCalpoint, clk, "DAY", opuser);
 | 
	
		
			
				|  |  | -				}
 | 
	
		
			
				|  |  | -				startDay = new Date(startDay.getTime() + 3600*24*1000L);
 | 
	
		
			
				|  |  | -			}
 | 
	
		
			
				|  |  | -			// 重新计算月数据,主要修改月累积值
 | 
	
		
			
				|  |  | -			while(startMonth <= endMonth){
 | 
	
		
			
				|  |  | -				String clk = sta.get(Calendar.YEAR) + "-" + startMonth;
 | 
	
		
			
				|  |  | -				if(startMonth < 10){
 | 
	
		
			
				|  |  | -					clk = sta.get(Calendar.YEAR) + "-0" + startMonth;
 | 
	
		
			
				|  |  | -				}
 | 
	
		
			
				|  |  | -				for(TRmCalpoint tRmCalpoint : l){
 | 
	
		
			
				|  |  | -					restatCalData(tRmCalpoint, clk, "MONTH", opuser);
 | 
	
		
			
				|  |  | -				}
 | 
	
		
			
				|  |  | -				startMonth++;
 | 
	
		
			
				|  |  | -			}
 | 
	
		
			
				|  |  | -			// 不是今年,重新计算年数据
 | 
	
		
			
				|  |  | -			if(sta.get(Calendar.YEAR) !=  cal.get(Calendar.YEAR)){
 | 
	
		
			
				|  |  | -				String clk = sta.get(Calendar.YEAR) + "";
 | 
	
		
			
				|  |  | -				for(TRmCalpoint tRmCalpoint : l){
 | 
	
		
			
				|  |  | -					restatCalData(tRmCalpoint, clk, "YEAR", opuser);
 | 
	
		
			
				|  |  | -				}
 | 
	
		
			
				|  |  | -			}
 | 
	
		
			
				|  |  | -		}else if(timegranid.equalsIgnoreCase("MONTH")){
 | 
	
		
			
				|  |  | -			Date startDay = null; // 计算开始日期
 | 
	
		
			
				|  |  | -			try {
 | 
	
		
			
				|  |  | -				startDay = new SimpleDateFormat("yyyy-MM").parse(clock);
 | 
	
		
			
				|  |  | -			} catch (ParseException e) {
 | 
	
		
			
				|  |  | -				return "日期格式错误";
 | 
	
		
			
				|  |  | -			}
 | 
	
		
			
				|  |  | -			// 最后可以统计的日期
 | 
	
		
			
				|  |  | -			Calendar cal = Calendar.getInstance();
 | 
	
		
			
				|  |  | -			cal.add(Calendar.HOUR_OF_DAY, -1);
 | 
	
		
			
				|  |  | -			cal.add(Calendar.MINUTE, -1);
 | 
	
		
			
				|  |  | -			// 统计开始日期
 | 
	
		
			
				|  |  | -			Calendar sta = Calendar.getInstance();
 | 
	
		
			
				|  |  | -			sta.setTime(startDay);
 | 
	
		
			
				|  |  | -			// 月粒度统计
 | 
	
		
			
				|  |  | -			int startMonth = sta.get(Calendar.MONTH)+1;
 | 
	
		
			
				|  |  | -			int endMonth = 12;
 | 
	
		
			
				|  |  | -			// 如果是今年,计算最后月份为上月
 | 
	
		
			
				|  |  | -			if(sta.get(Calendar.YEAR) ==  cal.get(Calendar.YEAR)){
 | 
	
		
			
				|  |  | -				endMonth = cal.get(Calendar.MONTH);
 | 
	
		
			
				|  |  | -			}
 | 
	
		
			
				|  |  | -			// 查询需要统计的计量点信息,最小粒度为班、日和年的
 | 
	
		
			
				|  |  | -			Map<String, Object> m = new HashMap<String, Object>();
 | 
	
		
			
				|  |  | -			m.put("useflag", "1");
 | 
	
		
			
				|  |  | -			m.put("mintimegranid", "SHIFT");
 | 
	
		
			
				|  |  | -			List<TRmCalpoint> l = tRmCalpointMapper.selectCalpoints(m);
 | 
	
		
			
				|  |  | -			m.put("mintimegranid", "DAY");
 | 
	
		
			
				|  |  | -			l.addAll(tRmCalpointMapper.selectCalpoints(m));
 | 
	
		
			
				|  |  | -			m.put("mintimegranid", "MONTH");
 | 
	
		
			
				|  |  | -			l.addAll(tRmCalpointMapper.selectCalpoints(m));
 | 
	
		
			
				|  |  | -			// 重新计算月数据,主要修改月累积值
 | 
	
		
			
				|  |  | -			while(startMonth <= endMonth){
 | 
	
		
			
				|  |  | -				String clk = sta.get(Calendar.YEAR) + "-" + startMonth;
 | 
	
		
			
				|  |  | -				if(startMonth < 10){
 | 
	
		
			
				|  |  | -					clk = sta.get(Calendar.YEAR) + "-0" + startMonth;
 | 
	
		
			
				|  |  | -				}
 | 
	
		
			
				|  |  | -				for(TRmCalpoint tRmCalpoint : l){
 | 
	
		
			
				|  |  | -					restatCalData(tRmCalpoint, clk, "MONTH", opuser);
 | 
	
		
			
				|  |  | -				}
 | 
	
		
			
				|  |  | -				startMonth++;
 | 
	
		
			
				|  |  | -			}
 | 
	
		
			
				|  |  | -			// 不是今年,重新计算年数据
 | 
	
		
			
				|  |  | -			if(sta.get(Calendar.YEAR) !=  cal.get(Calendar.YEAR)){
 | 
	
		
			
				|  |  | -				String clk = sta.get(Calendar.YEAR) + "";
 | 
	
		
			
				|  |  | -				for(TRmCalpoint tRmCalpoint : l){
 | 
	
		
			
				|  |  | -					restatCalData(tRmCalpoint, clk, "YEAR", opuser);
 | 
	
		
			
				|  |  | -				}
 | 
	
		
			
				|  |  | -			}
 | 
	
		
			
				|  |  | -		}else if(timegranid.equalsIgnoreCase("YEAR")){
 | 
	
		
			
				|  |  | -			// 只计算最小粒度为年的
 | 
	
		
			
				|  |  | -			// 查询需要统计的计量点信息,最小粒度年的
 | 
	
		
			
				|  |  | -			Map<String, Object> m = new HashMap<String, Object>();
 | 
	
		
			
				|  |  | -			m.put("useflag", "1");
 | 
	
		
			
				|  |  | -			m.put("mintimegranid", "YEAR");
 | 
	
		
			
				|  |  | -			List<TRmCalpoint> l = tRmCalpointMapper.selectCalpoints(m);
 | 
	
		
			
				|  |  | -			for(TRmCalpoint tRmCalpoint : l){
 | 
	
		
			
				|  |  | -				restatCalData(tRmCalpoint, clock, "YEAR", opuser);
 | 
	
		
			
				|  |  | -			}
 | 
	
		
			
				|  |  | -		}
 | 
	
		
			
				|  |  | -		return "";
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	@Override
 | 
	
		
			
				|  |  | -	public String restatCalData(TRmCalpoint tRmCalpoint, String clock, String timegranid, String updateUser) {
 | 
	
		
			
				|  |  | -		String res= "";
 | 
	
		
			
				|  |  | -		String mintimegranid = tRmCalpoint.getMintimegranid()==null?"DAY":tRmCalpoint.getMintimegranid(); // 最小时间粒度
 | 
	
		
			
				|  |  | -		String itemtype = tRmCalpoint.getItemtype(); // 类型 AUTO:自动,MANUAL:手抄,VIRTUAL:虚拟
 | 
	
		
			
				|  |  | -		String itemid = tRmCalpoint.getItemid();
 | 
	
		
			
				|  |  | -		String itemname = tRmCalpoint.getItemname();
 | 
	
		
			
				|  |  | -		String energytypeid = tRmCalpoint.getEnergytypeid(); // 能介大类
 | 
	
		
			
				|  |  | -		String tagTable = tRmCalpoint.getTagTable()==null? "" :tRmCalpoint.getTagTable().trim(); // 小时表
 | 
	
		
			
				|  |  | -		String tagCol = tRmCalpoint.getTagCol()==null? "" :tRmCalpoint.getTagCol().trim(); // 小时表字段
 | 
	
		
			
				|  |  | -		String tagBadStr = tRmCalpoint.getTagBadSymbol()==null? "-1" : tRmCalpoint.getTagBadSymbol();
 | 
	
		
			
				|  |  | -		Short digits = tRmCalpoint.getDigits() == null ? 4 : tRmCalpoint.getDigits();
 | 
	
		
			
				|  |  | -		Short digits2 = tRmCalpoint.getMeterScale() == null ? 4 : tRmCalpoint.getMeterScale(); // 准点值精度
 | 
	
		
			
				|  |  | -		Double qc = 0d; // 仪表期初值
 | 
	
		
			
				|  |  | -		Double qm = 0d; // 仪表期末值
 | 
	
		
			
				|  |  | -		Double mod = tRmCalpoint.getTagModulus() == null? 1d : tRmCalpoint.getTagModulus().doubleValue(); // 倍率
 | 
	
		
			
				|  |  | -		Double tagBad = -1d; // 异常点标签(读表异常时候插入的值)
 | 
	
		
			
				|  |  | -		Double maxval = 0d;
 | 
	
		
			
				|  |  | -		Double minval = 0d;
 | 
	
		
			
				|  |  | -		updateUser = updateUser==null || updateUser.isEmpty()?JwtUtil.getUseridByToken():updateUser;
 | 
	
		
			
				|  |  | -		try {
 | 
	
		
			
				|  |  | -			tagBad = Double.parseDouble(tagBadStr);
 | 
	
		
			
				|  |  | -		} catch (NumberFormatException e) {
 | 
	
		
			
				|  |  | -			logger.error("计量点" + itemid + "的tag_bad_symbol值格式应该为负数,当前值为:" + tagBadStr);
 | 
	
		
			
				|  |  | -			tagBad = -1d;
 | 
	
		
			
				|  |  | -		}
 | 
	
		
			
				|  |  | -		try {
 | 
	
		
			
				|  |  | -			maxval = tRmCalpoint.getMaxVal()==null || tRmCalpoint.getMaxVal().isEmpty()?0:Double.valueOf(tRmCalpoint.getMaxVal());
 | 
	
		
			
				|  |  | -			minval = tRmCalpoint.getMinVal()==null || tRmCalpoint.getMinVal().isEmpty()?0:Double.valueOf(tRmCalpoint.getMinVal());
 | 
	
		
			
				|  |  | -		} catch (NumberFormatException e) {
 | 
	
		
			
				|  |  | -			logger.error("计量点" + itemid + "的最大值最小值格式错误,当前最大值为:" + tRmCalpoint.getMaxVal() + ",最小值为:"+ tRmCalpoint.getMinVal());
 | 
	
		
			
				|  |  | -			maxval = 0d;
 | 
	
		
			
				|  |  | -			minval = 0d;
 | 
	
		
			
				|  |  | -		}
 | 
	
		
			
				|  |  | -		HashMap<String, Object> id = new HashMap<String, Object>();
 | 
	
		
			
				|  |  | -		id.put("clock", clock);
 | 
	
		
			
				|  |  | -		id.put("timegranid", timegranid);
 | 
	
		
			
				|  |  | -		id.put("itemid", itemid);
 | 
	
		
			
				|  |  | -		String sql = "";
 | 
	
		
			
				|  |  | -		// 如果有人工录入数据,以人工录入数据为准
 | 
	
		
			
				|  |  | -		HashMap<String, Object> cid = new HashMap<String, Object>();
 | 
	
		
			
				|  |  | -		cid.put("clock", clock);
 | 
	
		
			
				|  |  | -		cid.put("itemid", itemid);
 | 
	
		
			
				|  |  | -		EmsCalpointValue ecv = null;
 | 
	
		
			
				|  |  | -		if(tRmCalpoint.getEnergytypeid().equalsIgnoreCase("W") == false) {  //水数据不工步人工值到计量点数据
 | 
	
		
			
				|  |  | -			ecv = emsCalpointValueMapper.selectByPrimaryKey(cid);
 | 
	
		
			
				|  |  | -		}
 | 
	
		
			
				|  |  | -		// 获取原数据
 | 
	
		
			
				|  |  | -		TRmCalpointValue t = tRmCalpointValueMapper.selectByPrimaryKey(id);
 | 
	
		
			
				|  |  | -		// 自动上传计量点
 | 
	
		
			
				|  |  | -		if(itemtype.equalsIgnoreCase("AUTO")){
 | 
	
		
			
				|  |  | -			if(tagTable.equalsIgnoreCase("MES_EMS_DIESELOIL")){ // 柴油特殊处理,只重新计算年数据
 | 
	
		
			
				|  |  | -				if(!timegranid.equalsIgnoreCase("YEAR")){
 | 
	
		
			
				|  |  | -					mesEmsDieseloilService.reCalData2(clock, tRmCalpoint);
 | 
	
		
			
				|  |  | -					return "";
 | 
	
		
			
				|  |  | -				}else{
 | 
	
		
			
				|  |  | -					BigDecimal acb = BigDecimal.ZERO;// 计算值
 | 
	
		
			
				|  |  | -					// 年计算值等于月最终值之和
 | 
	
		
			
				|  |  | -					sql = "select round(sum(apportvalue), "+digits+") apportvalue "
 | 
	
		
			
				|  |  | -							+ "from T_RM_CALPOINT_VALUE where itemid = ? and timegranid='MONTH' and clock like ?||'%'";
 | 
	
		
			
				|  |  | -					Double actval = jdbcTemplate.queryForObject(sql, new Object[]{itemid,clock}, Double.class);
 | 
	
		
			
				|  |  | -					acb = actval==null?BigDecimal.ZERO:new BigDecimal(Double.toString(actval)).setScale(digits, BigDecimal.ROUND_HALF_UP);
 | 
	
		
			
				|  |  | -					if(t!=null){
 | 
	
		
			
				|  |  | -						t.setActualvalue(acb);
 | 
	
		
			
				|  |  | -						if(t.getCorrectvalue()!=null){
 | 
	
		
			
				|  |  | -							t.setApportvalue(acb.add(t.getCorrectvalue().setScale(digits, BigDecimal.ROUND_HALF_UP)));
 | 
	
		
			
				|  |  | -						}else{
 | 
	
		
			
				|  |  | -							t.setApportvalue(acb);
 | 
	
		
			
				|  |  | -						}
 | 
	
		
			
				|  |  | -						t.setUpman(updateUser);
 | 
	
		
			
				|  |  | -						t.setUptime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
 | 
	
		
			
				|  |  | -						tRmCalpointValueMapper.updateByPrimaryKeySelective(t);
 | 
	
		
			
				|  |  | -					}else{
 | 
	
		
			
				|  |  | -						// 数据不存在,新增
 | 
	
		
			
				|  |  | -						t = new TRmCalpointValue();
 | 
	
		
			
				|  |  | -						t.setActualvalue(acb); // 计算值
 | 
	
		
			
				|  |  | -						t.setClock(clock);
 | 
	
		
			
				|  |  | -						t.setTimegranid(timegranid);
 | 
	
		
			
				|  |  | -						t.setItemid(itemid);
 | 
	
		
			
				|  |  | -						t.setItemname(itemname);
 | 
	
		
			
				|  |  | -						t.setApportvalue(acb); // 最终值
 | 
	
		
			
				|  |  | -						t.setCorrectvalue(BigDecimal.ZERO); // 修正值
 | 
	
		
			
				|  |  | -						t.setCrman(updateUser);
 | 
	
		
			
				|  |  | -						t.setRecTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
 | 
	
		
			
				|  |  | -						tRmCalpointValueMapper.insertSelective(t);
 | 
	
		
			
				|  |  | -					}
 | 
	
		
			
				|  |  | -				}
 | 
	
		
			
				|  |  | -				return res;
 | 
	
		
			
				|  |  | -			}
 | 
	
		
			
				|  |  | -			String qck = ""; // 期初仪表时间点
 | 
	
		
			
				|  |  | -			String qmk = ""; // 期末仪表时间点
 | 
	
		
			
				|  |  | -			if(timegranid.equalsIgnoreCase("SHIFT")){
 | 
	
		
			
				|  |  | -				Date end = new Date();
 | 
	
		
			
				|  |  | -				SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH");
 | 
	
		
			
				|  |  | -				try {
 | 
	
		
			
				|  |  | -					end = sf.parse(clock);
 | 
	
		
			
				|  |  | -				} catch (Exception e) {
 | 
	
		
			
				|  |  | -					return "日期格式错误";
 | 
	
		
			
				|  |  | -				}
 | 
	
		
			
				|  |  | -				qmk = sf.format(end);
 | 
	
		
			
				|  |  | -				Calendar ca = Calendar.getInstance();
 | 
	
		
			
				|  |  | -				ca.setTime(end);
 | 
	
		
			
				|  |  | -				ca.add(Calendar.HOUR_OF_DAY, -8);
 | 
	
		
			
				|  |  | -				qck = sf.format(ca.getTime());
 | 
	
		
			
				|  |  | -			}else if(timegranid.equalsIgnoreCase("DAY")){
 | 
	
		
			
				|  |  | -				// 数据丛1点对一点
 | 
	
		
			
				|  |  | -				qck = clock + " 01";
 | 
	
		
			
				|  |  | -				SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH");
 | 
	
		
			
				|  |  | -				Date end = new Date();
 | 
	
		
			
				|  |  | -				try {
 | 
	
		
			
				|  |  | -					end = sf.parse(qck);
 | 
	
		
			
				|  |  | -				} catch (Exception e) {
 | 
	
		
			
				|  |  | -					return "日期格式错误";
 | 
	
		
			
				|  |  | -				}
 | 
	
		
			
				|  |  | -				Calendar ca = Calendar.getInstance();
 | 
	
		
			
				|  |  | -				ca.setTime(end);
 | 
	
		
			
				|  |  | -				ca.add(Calendar.DAY_OF_YEAR, 1);
 | 
	
		
			
				|  |  | -				qmk = sf.format(ca.getTime());
 | 
	
		
			
				|  |  | -			}else if(timegranid.equalsIgnoreCase("MONTH")){
 | 
	
		
			
				|  |  | -				// 数据丛1点对一点
 | 
	
		
			
				|  |  | -				qck = clock + "-01 01";
 | 
	
		
			
				|  |  | -				SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH");
 | 
	
		
			
				|  |  | -				Date end = new Date();
 | 
	
		
			
				|  |  | -				try {
 | 
	
		
			
				|  |  | -					end = sf.parse(qck);
 | 
	
		
			
				|  |  | -				} catch (Exception e) {
 | 
	
		
			
				|  |  | -					return "日期格式错误";
 | 
	
		
			
				|  |  | -				}
 | 
	
		
			
				|  |  | -				Calendar ca = Calendar.getInstance();
 | 
	
		
			
				|  |  | -				ca.setTime(end);
 | 
	
		
			
				|  |  | -				ca.add(Calendar.MONTH, 1);
 | 
	
		
			
				|  |  | -				qmk = sf.format(ca.getTime());
 | 
	
		
			
				|  |  | -			}else if(timegranid.equalsIgnoreCase("YEAR")){
 | 
	
		
			
				|  |  | -				// 数据丛1点对一点
 | 
	
		
			
				|  |  | -				qck = clock + "-01-01 01";
 | 
	
		
			
				|  |  | -				SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH");
 | 
	
		
			
				|  |  | -				Date end = new Date();
 | 
	
		
			
				|  |  | -				try {
 | 
	
		
			
				|  |  | -					end = sf.parse(qck);
 | 
	
		
			
				|  |  | -				} catch (Exception e) {
 | 
	
		
			
				|  |  | -					return "日期格式错误";
 | 
	
		
			
				|  |  | -				}
 | 
	
		
			
				|  |  | -				Calendar ca = Calendar.getInstance();
 | 
	
		
			
				|  |  | -				ca.setTime(end);
 | 
	
		
			
				|  |  | -				ca.add(Calendar.YEAR, 1);
 | 
	
		
			
				|  |  | -				qmk = sf.format(ca.getTime());
 | 
	
		
			
				|  |  | -			}
 | 
	
		
			
				|  |  | -			BigDecimal acb = BigDecimal.ZERO;// 计算值
 | 
	
		
			
				|  |  | -			BigDecimal qcb = BigDecimal.ZERO;// 期初值
 | 
	
		
			
				|  |  | -			BigDecimal qmb = BigDecimal.ZERO;// 期末值
 | 
	
		
			
				|  |  | -			String bz = ""; // 备注
 | 
	
		
			
				|  |  | -			if(!tagTable.isEmpty() && !tagCol.isEmpty()){
 | 
	
		
			
				|  |  | -				// 获取仪表期初、期末值、计算值
 | 
	
		
			
				|  |  | -				sql = "select nvl(round("+tagCol+", "+digits2+"),0) from "+tagTable + "_ORG where clock = ?";
 | 
	
		
			
				|  |  | -				try {
 | 
	
		
			
				|  |  | -					qc = jdbcTemplate.queryForObject(sql, new Object[]{qck}, Double.class);
 | 
	
		
			
				|  |  | -					if(qc!=null && Math.abs(qc) > Integer.MAX_VALUE){
 | 
	
		
			
				|  |  | -						bz = "仪表期初值异常:" + qc;
 | 
	
		
			
				|  |  | -						qc = tagBad;
 | 
	
		
			
				|  |  | -					}
 | 
	
		
			
				|  |  | -				} catch(DataAccessException e) {
 | 
	
		
			
				|  |  | -					logger.error(qck + "-itemid:" + itemid + " 没有仪表期初值。");
 | 
	
		
			
				|  |  | -					qc = tagBad;
 | 
	
		
			
				|  |  | -				}
 | 
	
		
			
				|  |  | -				try {
 | 
	
		
			
				|  |  | -					qm = jdbcTemplate.queryForObject(sql, new Object[]{qmk}, Double.class);
 | 
	
		
			
				|  |  | -					if(qm!=null && Math.abs(qm) > Integer.MAX_VALUE){
 | 
	
		
			
				|  |  | -						if(bz.length()>0){
 | 
	
		
			
				|  |  | -							bz = bz + ", ";
 | 
	
		
			
				|  |  | -						}
 | 
	
		
			
				|  |  | -						bz += "仪表期末值异常:" + qm;
 | 
	
		
			
				|  |  | -						qm = tagBad;
 | 
	
		
			
				|  |  | -					}
 | 
	
		
			
				|  |  | -				} catch(DataAccessException e) {
 | 
	
		
			
				|  |  | -					res = qmk + "-itemid:" + itemid + " 没有仪表期末值。";
 | 
	
		
			
				|  |  | -					logger.error(qmk + "-itemid:" + itemid + " 没有仪表期末值。");
 | 
	
		
			
				|  |  | -					qm = tagBad;
 | 
	
		
			
				|  |  | -				}
 | 
	
		
			
				|  |  | -				// 计算值由小时表统计
 | 
	
		
			
				|  |  | -				if(mintimegranid.equalsIgnoreCase(timegranid) || timegranid.equalsIgnoreCase("DAY") || timegranid.equalsIgnoreCase("SHIFT")){
 | 
	
		
			
				|  |  | -					if (qm == tagBad || qc == tagBad || qc == 0 || new BigDecimal(Double.toString(qm)).subtract(new BigDecimal(Double.toString(qc))).doubleValue() < 0
 | 
	
		
			
				|  |  | -							|| !energytypeid.equalsIgnoreCase("E")) {
 | 
	
		
			
				|  |  | -						sql = "select nvl(round(sum("+tagCol+")*"+mod+", "+digits+"),0) from "+tagTable+" where clock>=? and clock<?";
 | 
	
		
			
				|  |  | -						// 数据应该是0点到0点,次日0点的数据是今日23点到0点的数据,所以也应该计算在今日数据内.
 | 
	
		
			
				|  |  | -						// 但是今日0点数据是昨日今日23点到0点的数据,所以今日0点不计算在内
 | 
	
		
			
				|  |  | -						//sql = "select nvl(round(sum("+tagCol+")*"+mod+", "+digits+"),0) from "+tagTable+" where clock>? and clock<=?";
 | 
	
		
			
				|  |  | -						Double d = 0d;
 | 
	
		
			
				|  |  | -						try {
 | 
	
		
			
				|  |  | -							d = jdbcTemplate.queryForObject(sql, new Object[]{qck,qmk}, Double.class);
 | 
	
		
			
				|  |  | -							if(d!=null && Math.abs(d) > Integer.MAX_VALUE){
 | 
	
		
			
				|  |  | -								bz = "仪表数值异常:" + d;
 | 
	
		
			
				|  |  | -								d = 0d;
 | 
	
		
			
				|  |  | -							}
 | 
	
		
			
				|  |  | -						}catch(Exception e) {
 | 
	
		
			
				|  |  | -							d = 0d;
 | 
	
		
			
				|  |  | -							e.printStackTrace();
 | 
	
		
			
				|  |  | -							res = clock + ",itemid:" + itemid + " 取值错误, tagTable:" + tagTable + ",tagCol:" + tagCol;
 | 
	
		
			
				|  |  | -							logger.error(clock + ",itemid:" + itemid + " 取值错误, tagTable:" + tagTable + ",tagCol:" + tagCol);
 | 
	
		
			
				|  |  | -						}
 | 
	
		
			
				|  |  | -						acb = d==null?null:new BigDecimal(Double.toString(d));
 | 
	
		
			
				|  |  | -					}else{
 | 
	
		
			
				|  |  | -						// 仪表期末值 - 仪表期初值
 | 
	
		
			
				|  |  | -						acb = new BigDecimal(Double.toString(qm)).subtract(new BigDecimal(Double.toString(qc))).multiply(new BigDecimal(mod)).setScale(digits, BigDecimal.ROUND_HALF_UP);
 | 
	
		
			
				|  |  | -					}
 | 
	
		
			
				|  |  | -				}else{
 | 
	
		
			
				|  |  | -					// 计算值由子时间粒度数据统计
 | 
	
		
			
				|  |  | -					if(timegranid.equalsIgnoreCase("MONTH")){
 | 
	
		
			
				|  |  | -						// 月计算值等于日最终值之和
 | 
	
		
			
				|  |  | -						sql = "select round(sum(apportvalue), "+digits+") apportvalue "
 | 
	
		
			
				|  |  | -								+ "from T_RM_CALPOINT_VALUE where itemid = ? and timegranid='DAY' and clock like ?||'%'";
 | 
	
		
			
				|  |  | -						Double actval = jdbcTemplate.queryForObject(sql, new Object[]{itemid,clock}, Double.class);
 | 
	
		
			
				|  |  | -						acb = actval==null?BigDecimal.ZERO:new BigDecimal(Double.toString(actval)).setScale(digits, BigDecimal.ROUND_HALF_UP);
 | 
	
		
			
				|  |  | -					}else if(timegranid.equalsIgnoreCase("YEAR")){
 | 
	
		
			
				|  |  | -						// 年计算值等于月最终值之和
 | 
	
		
			
				|  |  | -						sql = "select round(sum(apportvalue), "+digits+") apportvalue "
 | 
	
		
			
				|  |  | -								+ "from T_RM_CALPOINT_VALUE where itemid = ? and timegranid='MONTH' and clock like ?||'%'";
 | 
	
		
			
				|  |  | -						Double actval = jdbcTemplate.queryForObject(sql, new Object[]{itemid,clock}, Double.class);
 | 
	
		
			
				|  |  | -						acb = actval==null?BigDecimal.ZERO:new BigDecimal(Double.toString(actval)).setScale(digits, BigDecimal.ROUND_HALF_UP);
 | 
	
		
			
				|  |  | -					}
 | 
	
		
			
				|  |  | -				}
 | 
	
		
			
				|  |  | -			}else{
 | 
	
		
			
				|  |  | -				res = "计量点的数据表与数据列信息不完整!itemid:"+itemid;
 | 
	
		
			
				|  |  | -				logger.error("计量点的数据表与数据列信息不完整!itemid:"+itemid);
 | 
	
		
			
				|  |  | -				bz = "-1:请配置数据表与数据列";
 | 
	
		
			
				|  |  | -			}
 | 
	
		
			
				|  |  | -			// 期初与期末
 | 
	
		
			
				|  |  | -			qcb = qc==null?null:new BigDecimal(Double.toString(qc));
 | 
	
		
			
				|  |  | -			qmb = qm==null?null:new BigDecimal(Double.toString(qm));
 | 
	
		
			
				|  |  | -			if (t != null) {
 | 
	
		
			
				|  |  | -				t.setMintvalue(qcb);
 | 
	
		
			
				|  |  | -				t.setMendvalue(qmb);
 | 
	
		
			
				|  |  | -				t.setBz(bz);
 | 
	
		
			
				|  |  | -				t.setActualvalue(acb);
 | 
	
		
			
				|  |  | -				// 最终值=计算值+修正值
 | 
	
		
			
				|  |  | -				if (acb != null && t.getCorrectvalue() != null) {
 | 
	
		
			
				|  |  | -					t.setApportvalue(acb.add(t.getCorrectvalue()));
 | 
	
		
			
				|  |  | -				} else if (acb != null) {
 | 
	
		
			
				|  |  | -					t.setApportvalue(acb);
 | 
	
		
			
				|  |  | -				} else if (t.getCorrectvalue() != null) {
 | 
	
		
			
				|  |  | -					t.setApportvalue(t.getCorrectvalue());
 | 
	
		
			
				|  |  | -				} else {
 | 
	
		
			
				|  |  | -					t.setApportvalue(BigDecimal.ZERO);
 | 
	
		
			
				|  |  | -				}
 | 
	
		
			
				|  |  | -				if(ecv!=null && ecv.getApportvalue()!=null){
 | 
	
		
			
				|  |  | -					t.setBz(ecv.getBz()!=null?ecv.getBz():"人工录入,自动修改");
 | 
	
		
			
				|  |  | -					t.setApportvalue(ecv.getApportvalue().setScale(digits, BigDecimal.ROUND_HALF_UP));
 | 
	
		
			
				|  |  | -					t.setCorrectvalue(t.getApportvalue().subtract(t.getActualvalue()==null?BigDecimal.ZERO:t.getActualvalue()));
 | 
	
		
			
				|  |  | -				}
 | 
	
		
			
				|  |  | -				t.setUpman(updateUser);
 | 
	
		
			
				|  |  | -				t.setUptime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
 | 
	
		
			
				|  |  | -				//八万煤气柜柜容重写
 | 
	
		
			
				|  |  | -				if(t.getItemid().equalsIgnoreCase("DL421P00770002")&&t.getTimegranid().equalsIgnoreCase("DAY")){
 | 
	
		
			
				|  |  | -					t.setMintvalue(BigDecimal.ZERO);
 | 
	
		
			
				|  |  | -					t.setActualvalue(qmb);
 | 
	
		
			
				|  |  | -				    t.setApportvalue(qmb);
 | 
	
		
			
				|  |  | -				}
 | 
	
		
			
				|  |  | -				tRmCalpointValueMapper.updateByPrimaryKeySelective(t);
 | 
	
		
			
				|  |  | -			} else {
 | 
	
		
			
				|  |  | -				// 数据不存在,新增
 | 
	
		
			
				|  |  | -				t = new TRmCalpointValue();
 | 
	
		
			
				|  |  | -				t.setMintvalue(qcb);
 | 
	
		
			
				|  |  | -				t.setMendvalue(qmb);
 | 
	
		
			
				|  |  | -				t.setBz(bz);
 | 
	
		
			
				|  |  | -				t.setActualvalue(acb); // 计算值
 | 
	
		
			
				|  |  | -				t.setCorrectvalue(BigDecimal.ZERO); // 修正值
 | 
	
		
			
				|  |  | -				t.setApportvalue(acb); // 最终值
 | 
	
		
			
				|  |  | -				if(ecv!=null && ecv.getApportvalue()!=null){
 | 
	
		
			
				|  |  | -					t.setBz(ecv.getBz()!=null?ecv.getBz():"人工录入,自动修改");
 | 
	
		
			
				|  |  | -					t.setApportvalue(ecv.getApportvalue().setScale(digits, BigDecimal.ROUND_HALF_UP));
 | 
	
		
			
				|  |  | -					t.setCorrectvalue(t.getApportvalue().subtract(t.getActualvalue()==null?BigDecimal.ZERO:t.getActualvalue()));
 | 
	
		
			
				|  |  | -				}
 | 
	
		
			
				|  |  | -				t.setClock(clock);
 | 
	
		
			
				|  |  | -				t.setTimegranid(timegranid);
 | 
	
		
			
				|  |  | -				t.setItemid(itemid);
 | 
	
		
			
				|  |  | -				t.setItemname(itemname);
 | 
	
		
			
				|  |  | -				t.setCrman(updateUser);
 | 
	
		
			
				|  |  | -				t.setRecTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
 | 
	
		
			
				|  |  | -				//八万煤气柜柜容重写
 | 
	
		
			
				|  |  | -				if(t.getItemid().equalsIgnoreCase("DL421P00770002")&&t.getTimegranid().equalsIgnoreCase("DAY")){
 | 
	
		
			
				|  |  | -                    t.setMintvalue(BigDecimal.ZERO);
 | 
	
		
			
				|  |  | -                    t.setActualvalue(qmb);
 | 
	
		
			
				|  |  | -				    t.setApportvalue(qmb);
 | 
	
		
			
				|  |  | -				}
 | 
	
		
			
				|  |  | -				tRmCalpointValueMapper.insertSelective(t);
 | 
	
		
			
				|  |  | -			}
 | 
	
		
			
				|  |  | -			// 超标异常记录,当前只记录日数据,且最大最小值不都为0的计量点
 | 
	
		
			
				|  |  | -			if (timegranid.equalsIgnoreCase("DAY") && (maxval+minval>0) && (t.getApportvalue().doubleValue()>maxval || t.getApportvalue().doubleValue()<minval)) {
 | 
	
		
			
				|  |  | -				TRmCalpointExValue cev = new TRmCalpointExValue();
 | 
	
		
			
				|  |  | -				cev.setApportvalue(t.getApportvalue());
 | 
	
		
			
				|  |  | -				cev.setMaxvalue(new BigDecimal(Double.toString(maxval)));
 | 
	
		
			
				|  |  | -				cev.setMinvalue(new BigDecimal(Double.toString(minval)));
 | 
	
		
			
				|  |  | -				cev.setClock(clock);
 | 
	
		
			
				|  |  | -				cev.setItemid(itemid);
 | 
	
		
			
				|  |  | -				cev.setCreatetime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
 | 
	
		
			
				|  |  | -				cev.setExtype("0");
 | 
	
		
			
				|  |  | -				tRmCalpointExValueService.add(cev);
 | 
	
		
			
				|  |  | -			}
 | 
	
		
			
				|  |  | -		}else if(itemtype.equalsIgnoreCase("MANUAL")){// 手动
 | 
	
		
			
				|  |  | -			BigDecimal acb = BigDecimal.ZERO;// 计算值
 | 
	
		
			
				|  |  | -			// 手抄数据计算值获取,非基础数据用粒度累加,已有的基础数据用基础数据。
 | 
	
		
			
				|  |  | -			if(!mintimegranid.equalsIgnoreCase(timegranid)){
 | 
	
		
			
				|  |  | -				// 计算值由子时间粒度数据统计
 | 
	
		
			
				|  |  | -				if(timegranid.equalsIgnoreCase("MONTH")){
 | 
	
		
			
				|  |  | -					// 月计算值等于日最终值之和
 | 
	
		
			
				|  |  | -					HashMap<String, Object> maps = new HashMap<>();
 | 
	
		
			
				|  |  | -			        maps.put("itemid", itemid);
 | 
	
		
			
				|  |  | -			        maps.put("clock", clock);
 | 
	
		
			
				|  |  | -			        maps.put("timegranid", "DAY");
 | 
	
		
			
				|  |  | -					acb = new BigDecimal(Double.toString(this.getSumvalue(maps))).setScale(digits, BigDecimal.ROUND_HALF_UP);
 | 
	
		
			
				|  |  | -				}else if(timegranid.equalsIgnoreCase("YEAR")){
 | 
	
		
			
				|  |  | -					// 年计算值等于月最终值之和
 | 
	
		
			
				|  |  | -					HashMap<String, Object> maps = new HashMap<>();
 | 
	
		
			
				|  |  | -			        maps.put("itemid", itemid);
 | 
	
		
			
				|  |  | -			        maps.put("clock", clock);
 | 
	
		
			
				|  |  | -			        maps.put("timegranid", "MONTH");
 | 
	
		
			
				|  |  | -			        acb = new BigDecimal(Double.toString(this.getSumvalue(maps))).setScale(digits, BigDecimal.ROUND_HALF_UP);
 | 
	
		
			
				|  |  | -				}
 | 
	
		
			
				|  |  | -			}else{
 | 
	
		
			
				|  |  | -				if(t!= null){
 | 
	
		
			
				|  |  | -					acb = t.getActualvalue();
 | 
	
		
			
				|  |  | -				}
 | 
	
		
			
				|  |  | -			}
 | 
	
		
			
				|  |  | -			if (t!= null) {
 | 
	
		
			
				|  |  | -				t.setActualvalue(acb);
 | 
	
		
			
				|  |  | -				// 最终值=计算值+修正值
 | 
	
		
			
				|  |  | -				if (t.getCorrectvalue() != null) {
 | 
	
		
			
				|  |  | -					t.setApportvalue(acb.add(t.getCorrectvalue()).setScale(digits, BigDecimal.ROUND_HALF_UP));
 | 
	
		
			
				|  |  | -				} else {
 | 
	
		
			
				|  |  | -					t.setApportvalue(acb.setScale(digits, BigDecimal.ROUND_HALF_UP));
 | 
	
		
			
				|  |  | -				}
 | 
	
		
			
				|  |  | -				// 外挂数据更新
 | 
	
		
			
				|  |  | -				if(ecv!=null && ecv.getApportvalue()!=null){
 | 
	
		
			
				|  |  | -					t.setBz(ecv.getBz()!=null?ecv.getBz():"人工录入,自动修改");
 | 
	
		
			
				|  |  | -					t.setApportvalue(ecv.getApportvalue().setScale(digits, BigDecimal.ROUND_HALF_UP));
 | 
	
		
			
				|  |  | -					t.setCorrectvalue(t.getApportvalue().subtract(t.getActualvalue()==null?BigDecimal.ZERO:t.getActualvalue()));
 | 
	
		
			
				|  |  | -				}
 | 
	
		
			
				|  |  | -				t.setUpman(updateUser);
 | 
	
		
			
				|  |  | -				t.setUptime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
 | 
	
		
			
				|  |  | -				tRmCalpointValueMapper.updateByPrimaryKeySelective(t);
 | 
	
		
			
				|  |  | -			}else{
 | 
	
		
			
				|  |  | -				// 数据不存在,新增
 | 
	
		
			
				|  |  | -				t = new TRmCalpointValue();
 | 
	
		
			
				|  |  | -				t.setClock(clock);
 | 
	
		
			
				|  |  | -				t.setTimegranid(timegranid);
 | 
	
		
			
				|  |  | -				t.setItemid(itemid);
 | 
	
		
			
				|  |  | -				t.setItemname(itemname);
 | 
	
		
			
				|  |  | -				t.setCorrectvalue(BigDecimal.ZERO); // 修正值
 | 
	
		
			
				|  |  | -				t.setActualvalue(acb); // 计算值
 | 
	
		
			
				|  |  | -				t.setCorrectvalue(BigDecimal.ZERO); // 修正值
 | 
	
		
			
				|  |  | -				t.setApportvalue(acb.setScale(digits, BigDecimal.ROUND_HALF_UP)); // 最终值
 | 
	
		
			
				|  |  | -				if(ecv!=null && ecv.getApportvalue()!=null){
 | 
	
		
			
				|  |  | -					t.setBz(ecv.getBz()!=null?ecv.getBz():"人工录入,自动修改");
 | 
	
		
			
				|  |  | -					t.setApportvalue(ecv.getApportvalue().setScale(digits, BigDecimal.ROUND_HALF_UP));
 | 
	
		
			
				|  |  | -					t.setCorrectvalue(t.getApportvalue().subtract(t.getActualvalue()==null?BigDecimal.ZERO:t.getActualvalue()));
 | 
	
		
			
				|  |  | -				}
 | 
	
		
			
				|  |  | -				t.setCrman(updateUser);
 | 
	
		
			
				|  |  | -				t.setRecTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
 | 
	
		
			
				|  |  | -				tRmCalpointValueMapper.insertSelective(t);
 | 
	
		
			
				|  |  | -			}
 | 
	
		
			
				|  |  | -		}else if(itemtype.equalsIgnoreCase("VIRTUAL")){// 虚拟
 | 
	
		
			
				|  |  | -			BigDecimal acb = BigDecimal.ZERO;// 计算值
 | 
	
		
			
				|  |  | -			try {
 | 
	
		
			
				|  |  | -				if(!mintimegranid.equalsIgnoreCase(timegranid)){
 | 
	
		
			
				|  |  | -					// 计算值由子时间粒度数据统计
 | 
	
		
			
				|  |  | -					if(timegranid.equalsIgnoreCase("MONTH")){
 | 
	
		
			
				|  |  | -						// 月计算值等于日最终值之和
 | 
	
		
			
				|  |  | -						sql = "select round(sum(apportvalue), "+digits+") apportvalue "
 | 
	
		
			
				|  |  | -								+ "from T_RM_CALPOINT_VALUE where itemid = ? and timegranid='DAY' and clock like ?||'%'";
 | 
	
		
			
				|  |  | -						Double actval = jdbcTemplate.queryForObject(sql, new Object[]{itemid,clock}, Double.class);
 | 
	
		
			
				|  |  | -						acb = actval==null?BigDecimal.ZERO:new BigDecimal(Double.toString(actval)).setScale(digits, BigDecimal.ROUND_HALF_UP);
 | 
	
		
			
				|  |  | -					}else if(timegranid.equalsIgnoreCase("YEAR")){
 | 
	
		
			
				|  |  | -						// 年计算值等于月最终值之和
 | 
	
		
			
				|  |  | -						sql = "select round(sum(apportvalue), "+digits+") apportvalue "
 | 
	
		
			
				|  |  | -								+ "from T_RM_CALPOINT_VALUE where itemid = ? and timegranid='MONTH' and clock like ?||'%'";
 | 
	
		
			
				|  |  | -						Double actval = jdbcTemplate.queryForObject(sql, new Object[]{itemid,clock}, Double.class);
 | 
	
		
			
				|  |  | -						acb = actval==null?BigDecimal.ZERO:new BigDecimal(Double.toString(actval)).setScale(digits, BigDecimal.ROUND_HALF_UP);
 | 
	
		
			
				|  |  | -					}
 | 
	
		
			
				|  |  | -				} else{
 | 
	
		
			
				|  |  | -					// 获得计算公式
 | 
	
		
			
				|  |  | -					String formula = formulaService.getFormula(itemid,clock);
 | 
	
		
			
				|  |  | -					// 根据公式获取计算值,不会为null,负数为错误信息
 | 
	
		
			
				|  |  | -					Double dval = formulaService.getValByFormula(formula, timegranid, clock, digits, 0);
 | 
	
		
			
				|  |  | -					if(dval == null || dval < 0){
 | 
	
		
			
				|  |  | -						res = clock + "-itemid:" + itemid + " 计算公式错误。";
 | 
	
		
			
				|  |  | -						logger.error(clock + "-itemid:" + itemid + " 计算公式错误。");
 | 
	
		
			
				|  |  | -					}
 | 
	
		
			
				|  |  | -					acb = new BigDecimal(Double.toString(dval));
 | 
	
		
			
				|  |  | -				}
 | 
	
		
			
				|  |  | -				if(t!=null){
 | 
	
		
			
				|  |  | -					t.setActualvalue(acb);
 | 
	
		
			
				|  |  | -					// 最终值=计算值+修正值
 | 
	
		
			
				|  |  | -					if (t.getCorrectvalue() != null) {
 | 
	
		
			
				|  |  | -						t.setApportvalue(acb.add(t.getCorrectvalue()).setScale(digits, BigDecimal.ROUND_HALF_UP));
 | 
	
		
			
				|  |  | -					} else {
 | 
	
		
			
				|  |  | -						t.setApportvalue(acb.setScale(digits, BigDecimal.ROUND_HALF_UP));
 | 
	
		
			
				|  |  | -					}
 | 
	
		
			
				|  |  | -					if(ecv!=null && ecv.getApportvalue()!=null){
 | 
	
		
			
				|  |  | -						t.setBz(ecv.getBz()!=null?ecv.getBz():"人工录入,自动修改");
 | 
	
		
			
				|  |  | -						t.setApportvalue(ecv.getApportvalue().setScale(digits, BigDecimal.ROUND_HALF_UP));
 | 
	
		
			
				|  |  | -						t.setCorrectvalue(t.getApportvalue().subtract(t.getActualvalue()==null?BigDecimal.ZERO:t.getActualvalue()));
 | 
	
		
			
				|  |  | -					}
 | 
	
		
			
				|  |  | -					t.setUpman(updateUser);
 | 
	
		
			
				|  |  | -					t.setUptime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
 | 
	
		
			
				|  |  | -					tRmCalpointValueMapper.updateByPrimaryKeySelective(t);
 | 
	
		
			
				|  |  | -				}else{
 | 
	
		
			
				|  |  | -					t = new TRmCalpointValue();
 | 
	
		
			
				|  |  | -					t.setClock(clock);
 | 
	
		
			
				|  |  | -					t.setTimegranid(timegranid);
 | 
	
		
			
				|  |  | -					t.setItemid(itemid);
 | 
	
		
			
				|  |  | -					t.setItemname(itemname);
 | 
	
		
			
				|  |  | -					t.setApportvalue(acb); // 最终值
 | 
	
		
			
				|  |  | -					t.setCorrectvalue(BigDecimal.ZERO); // 修正值
 | 
	
		
			
				|  |  | -					t.setActualvalue(acb); // 计算值
 | 
	
		
			
				|  |  | -					if(ecv!=null && ecv.getApportvalue()!=null){
 | 
	
		
			
				|  |  | -						t.setBz(ecv.getBz()!=null?ecv.getBz():"人工录入,自动修改");
 | 
	
		
			
				|  |  | -						t.setApportvalue(ecv.getApportvalue().setScale(digits, BigDecimal.ROUND_HALF_UP));
 | 
	
		
			
				|  |  | -						t.setCorrectvalue(t.getApportvalue().subtract(t.getActualvalue()==null?BigDecimal.ZERO:t.getActualvalue()));
 | 
	
		
			
				|  |  | -					}
 | 
	
		
			
				|  |  | -					t.setCrman(updateUser);
 | 
	
		
			
				|  |  | -					t.setRecTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
 | 
	
		
			
				|  |  | -					tRmCalpointValueMapper.insertSelective(t);
 | 
	
		
			
				|  |  | -				}
 | 
	
		
			
				|  |  | -			} catch (Exception e) {
 | 
	
		
			
				|  |  | -				res = "虚拟计算错误:itemid-" + itemid + ",clock-" + clock;
 | 
	
		
			
				|  |  | -				logger.error("虚拟计算错误:itemid-" + itemid + ",clock-" + clock);
 | 
	
		
			
				|  |  | -				e.printStackTrace();
 | 
	
		
			
				|  |  | -			}
 | 
	
		
			
				|  |  | -		}
 | 
	
		
			
				|  |  | -		return res;
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	@Override
 | 
	
		
			
				|  |  | -	public List<Map<String, Object>> getCalpointValue(HashMap<String, Object> parmas) {
 | 
	
		
			
				|  |  | -		List<Map<String, Object>> l = new ArrayList<Map<String, Object>>();
 | 
	
		
			
				|  |  | -		String[] ids = parmas.get("ids").toString().split(",");
 | 
	
		
			
				|  |  | -		String start = parmas.get("start").toString();
 | 
	
		
			
				|  |  | -		String end = parmas.get("end").toString();
 | 
	
		
			
				|  |  | -		// 期初时间
 | 
	
		
			
				|  |  | -		String qc_clk = "";
 | 
	
		
			
				|  |  | -		// 期末时间
 | 
	
		
			
				|  |  | -		String qm_clk = "";
 | 
	
		
			
				|  |  | -		// 期末时间处理,如果是今天之前,期末为第二天0点,比如1月27日期末时间为1月28日0点.
 | 
	
		
			
				|  |  | -		String qm_clk2 = "";
 | 
	
		
			
				|  |  | -		try {
 | 
	
		
			
				|  |  | -			qc_clk = new SimpleDateFormat("yyyy-MM-dd").format(new SimpleDateFormat("yyyy-MM-dd").parse(start));
 | 
	
		
			
				|  |  | -			qm_clk = new SimpleDateFormat("yyyy-MM-dd").format(new SimpleDateFormat("yyyy-MM-dd").parse(end));
 | 
	
		
			
				|  |  | -			Calendar calendar = Calendar.getInstance();
 | 
	
		
			
				|  |  | -			calendar.setTime(new SimpleDateFormat("yyyy-MM-dd").parse(end));
 | 
	
		
			
				|  |  | -			calendar.add(Calendar.DAY_OF_YEAR, 1);
 | 
	
		
			
				|  |  | -			qm_clk2 = new SimpleDateFormat("yyyy-MM-dd").format(calendar.getTime());
 | 
	
		
			
				|  |  | -		} catch (ParseException e1) {
 | 
	
		
			
				|  |  | -			e1.printStackTrace();
 | 
	
		
			
				|  |  | -		}
 | 
	
		
			
				|  |  | -		for(int i=0;i<ids.length;i++){
 | 
	
		
			
				|  |  | -			String itemid = ids[i];
 | 
	
		
			
				|  |  | -			String ten = "1";
 | 
	
		
			
				|  |  | -			TRmCalpoint tRmCalpoint = tRmCalpointMapper.selectByPrimaryKey(itemid);
 | 
	
		
			
				|  |  | -			String energytypeid = tRmCalpoint.getEnergytypeid(); // 能介大类
 | 
	
		
			
				|  |  | -			String tagTable = tRmCalpoint.getTagTable(); // 小时表
 | 
	
		
			
				|  |  | -			String tagCol = tRmCalpoint.getTagCol(); // 小时表字段
 | 
	
		
			
				|  |  | -			Double mod = tRmCalpoint.getTagModulus() == null? 1d : tRmCalpoint.getTagModulus().doubleValue(); // 倍率
 | 
	
		
			
				|  |  | -			Short digits = tRmCalpoint.getDigits() == null ? 4 : tRmCalpoint.getDigits();
 | 
	
		
			
				|  |  | -			Short digits2 = tRmCalpoint.getMeterScale() == null ? 4 : tRmCalpoint.getMeterScale(); // 准点值精度
 | 
	
		
			
				|  |  | -			Double tagBad = -1d; // 异常点标签(读表异常时候插入的值)
 | 
	
		
			
				|  |  | -			Double qc = 0d; // 仪表期初值
 | 
	
		
			
				|  |  | -			Double qc2 = 0d; // 当日仪表期初值
 | 
	
		
			
				|  |  | -			Double qm = 0d; // 仪表期末值
 | 
	
		
			
				|  |  | -			// 获取仪表期初、期末值
 | 
	
		
			
				|  |  | -			String sqlqc = "select nvl(round("+tagCol+", "+digits2+"),0) from "+tagTable + "_ORG where clock = ?";
 | 
	
		
			
				|  |  | -			String sql2 = "select qm from (select nvl(round("+tagCol+", "+digits2+"),0) qm from "+tagTable + "_ORG where clock>= ? and clock<= ? order by clock desc) where rownum=1";
 | 
	
		
			
				|  |  | -			if(tagTable != null && tagCol!=null && !tagTable.trim().isEmpty() && !tagCol.trim().isEmpty()){
 | 
	
		
			
				|  |  | -				try {
 | 
	
		
			
				|  |  | -					// 数据丛1点对一点
 | 
	
		
			
				|  |  | -					qc = jdbcTemplate.queryForObject(sqlqc, new Object[]{qc_clk + " 01"}, Double.class);
 | 
	
		
			
				|  |  | -					if(qc!=null && Math.abs(qc) > Integer.MAX_VALUE){
 | 
	
		
			
				|  |  | -						logger.error("仪表数值异常:" + qc);
 | 
	
		
			
				|  |  | -						qc = 0d;
 | 
	
		
			
				|  |  | -					}
 | 
	
		
			
				|  |  | -				} catch(DataAccessException e) {
 | 
	
		
			
				|  |  | -					logger.error(qc_clk + "-itemid:" + itemid + " 没有仪表期初值。");
 | 
	
		
			
				|  |  | -					qc = tagBad;
 | 
	
		
			
				|  |  | -				}
 | 
	
		
			
				|  |  | -				try {
 | 
	
		
			
				|  |  | -					// 数据丛1点对一点
 | 
	
		
			
				|  |  | -					qm = jdbcTemplate.queryForObject(sql2, new Object[]{qm_clk + " 01", qm_clk2 + " 01"}, Double.class);
 | 
	
		
			
				|  |  | -					if(qm!=null && Math.abs(qm) > Integer.MAX_VALUE){
 | 
	
		
			
				|  |  | -						logger.error("仪表数值异常:" + qm);
 | 
	
		
			
				|  |  | -						qm = 0d;
 | 
	
		
			
				|  |  | -					}
 | 
	
		
			
				|  |  | -				} catch(DataAccessException e) {
 | 
	
		
			
				|  |  | -					logger.error(qm_clk + "-itemid:" + itemid + " 没有仪表期末值。");
 | 
	
		
			
				|  |  | -					qm = tagBad;
 | 
	
		
			
				|  |  | -				}
 | 
	
		
			
				|  |  | -			}
 | 
	
		
			
				|  |  | -			Double ap = 0d; // 计算值
 | 
	
		
			
				|  |  | -			Double ap1 = 0d; // 计算值,当日
 | 
	
		
			
				|  |  | -			// 今日之前的数据
 | 
	
		
			
				|  |  | -			String sql3 = "select nvl(round(sum(apportvalue), "+digits2+"),0) from T_RM_CALPOINT_VALUE where timegranid='DAY' and itemid=? and clock>=? and clock<?";
 | 
	
		
			
				|  |  | -			// 今日数据额外计算
 | 
	
		
			
				|  |  | -			if(end.equals(new SimpleDateFormat("yyyy-MM-dd").format(new Date()))){
 | 
	
		
			
				|  |  | -				// 今日之前的计算值
 | 
	
		
			
				|  |  | -				try {
 | 
	
		
			
				|  |  | -					ap = jdbcTemplate.queryForObject(sql3, new Object[]{itemid, start, end}, Double.class);
 | 
	
		
			
				|  |  | -					if(ap!=null && Math.abs(ap) > Integer.MAX_VALUE){
 | 
	
		
			
				|  |  | -						logger.error("仪表数值异常:" + ap);
 | 
	
		
			
				|  |  | -						ap = 0d;
 | 
	
		
			
				|  |  | -					}
 | 
	
		
			
				|  |  | -				} catch(DataAccessException e) {
 | 
	
		
			
				|  |  | -					ap = tagBad;
 | 
	
		
			
				|  |  | -				}
 | 
	
		
			
				|  |  | -				// 当日期初
 | 
	
		
			
				|  |  | -				try {
 | 
	
		
			
				|  |  | -					// 数据丛1点对一点
 | 
	
		
			
				|  |  | -					qc2 = jdbcTemplate.queryForObject(sqlqc, new Object[]{end + " 01"}, Double.class);
 | 
	
		
			
				|  |  | -					if(qc2!=null && Math.abs(qc2) > Integer.MAX_VALUE){
 | 
	
		
			
				|  |  | -						qc2 = 0d;
 | 
	
		
			
				|  |  | -					}
 | 
	
		
			
				|  |  | -				} catch(DataAccessException e) {
 | 
	
		
			
				|  |  | -					qc2 = tagBad;
 | 
	
		
			
				|  |  | -				}
 | 
	
		
			
				|  |  | -				// 查询计量点十分钟表配置信息
 | 
	
		
			
				|  |  | -				CordasConfiguration c = cordasConfigurationMapper.selectByPrimaryKey(itemid);
 | 
	
		
			
				|  |  | -				if(c!=null && c.getTimingtable()!=null && !c.getTimingtable().isEmpty() && c.getTimingcolum()!=null){
 | 
	
		
			
				|  |  | -					String timingtable = c.getTimingtable();
 | 
	
		
			
				|  |  | -					String timingcolum = c.getTimingcolum();
 | 
	
		
			
				|  |  | -					String sqlqm = "select qm from (select nvl(round("+timingcolum+", "+digits2+"),0) qm from "+timingtable + " where to_char(tim, 'YYYY-MM-DD')=? order by tim desc) where rownum=1";
 | 
	
		
			
				|  |  | -					try {
 | 
	
		
			
				|  |  | -						qm = jdbcTemplate.queryForObject(sqlqm, new Object[]{end}, Double.class);
 | 
	
		
			
				|  |  | -						if(qm!=null && Math.abs(qm) > Integer.MAX_VALUE){
 | 
	
		
			
				|  |  | -							logger.error("仪表数值异常:" + qm);
 | 
	
		
			
				|  |  | -							qm = 0d;
 | 
	
		
			
				|  |  | -						}
 | 
	
		
			
				|  |  | -					} catch(DataAccessException e) {
 | 
	
		
			
				|  |  | -						logger.error(end + "-itemid:" + itemid + " 没有十分钟仪表期末值。");
 | 
	
		
			
				|  |  | -						qm = tagBad;
 | 
	
		
			
				|  |  | -					}
 | 
	
		
			
				|  |  | -					// 有清零数据计算值用小时值累加 + 十分钟累加,其他期初期末数据正常用期末-期初
 | 
	
		
			
				|  |  | -					if(qm == tagBad || qc2 == tagBad || qc2 == 0d || new BigDecimal(Double.toString(qm)).subtract(new BigDecimal(Double.toString(qc2))).doubleValue()<0 
 | 
	
		
			
				|  |  | -							|| !energytypeid.equalsIgnoreCase("E")){
 | 
	
		
			
				|  |  | -						// 获取最后1小时的时间clock
 | 
	
		
			
				|  |  | -						String sh = "select clock from (select clock from "+tagTable+" where substr(clock,0,10)=? order by clock desc) where rownum=1";
 | 
	
		
			
				|  |  | -						String clk = jdbcTemplate.queryForObject(sh, new Object[]{end}, String.class);
 | 
	
		
			
				|  |  | -						// 小时数据累加
 | 
	
		
			
				|  |  | -						String sql = "select nvl(round(sum("+tagCol+")*"+mod+", "+digits+"),0) from "+tagTable+" where substr(clock,0,10) = ?";
 | 
	
		
			
				|  |  | -						try {
 | 
	
		
			
				|  |  | -							ap1 = jdbcTemplate.queryForObject(sql, new Object[]{end}, Double.class);
 | 
	
		
			
				|  |  | -							if(ap1!=null && Math.abs(ap1) > Integer.MAX_VALUE){
 | 
	
		
			
				|  |  | -								ap1 = 0d;
 | 
	
		
			
				|  |  | -							}
 | 
	
		
			
				|  |  | -						}catch(Exception e) {
 | 
	
		
			
				|  |  | -							ap1 = 0d;
 | 
	
		
			
				|  |  | -						}
 | 
	
		
			
				|  |  | -						// 计算10分钟数据,累加
 | 
	
		
			
				|  |  | -						String sql10 = "select nvl("+timingcolum+",0) zj,case when lag("+timingcolum+") over(order by tim) is null then 0 "
 | 
	
		
			
				|  |  | -								+ "else ("+timingcolum+" - lag("+timingcolum+") over(order by tim)) end jj "
 | 
	
		
			
				|  |  | -								+ "from "+timingtable+" where to_char(tim, 'YYYY-MM-DD hh24')>? order by tim";
 | 
	
		
			
				|  |  | -						List lt = jdbcTemplate.queryForList(sql10, new Object[]{clk});
 | 
	
		
			
				|  |  | -						Double ap3 = 0d; // 10分钟累计值
 | 
	
		
			
				|  |  | -						if(lt!=null && lt.size()>0){
 | 
	
		
			
				|  |  | -							for(int j=0; j<lt.size();j++){
 | 
	
		
			
				|  |  | -								Map mt = (Map)lt.get(j);
 | 
	
		
			
				|  |  | -								Double zj = Double.valueOf(mt.get("ZJ").toString());
 | 
	
		
			
				|  |  | -								Double jj = Double.valueOf(mt.get("JJ").toString());
 | 
	
		
			
				|  |  | -								if(jj >= 0){
 | 
	
		
			
				|  |  | -									ap3 = new BigDecimal(Double.toString(ap3)).add(new BigDecimal(Double.toString(jj))).doubleValue();
 | 
	
		
			
				|  |  | -								}else{
 | 
	
		
			
				|  |  | -									logger.error(clk + "-表:" + timingtable +"-列:" + timingcolum + " 读表累计值变小。");
 | 
	
		
			
				|  |  | -									ap3 = new BigDecimal(Double.toString(ap3)).add(new BigDecimal(Double.toString(zj))).doubleValue();
 | 
	
		
			
				|  |  | -								}
 | 
	
		
			
				|  |  | -							}
 | 
	
		
			
				|  |  | -						}
 | 
	
		
			
				|  |  | -						ap3 = new BigDecimal(Double.toString(ap3)).multiply(new BigDecimal(mod)).setScale(digits, BigDecimal.ROUND_HALF_UP).doubleValue();
 | 
	
		
			
				|  |  | -						ap1 = new BigDecimal(Double.toString(ap1)).add(new BigDecimal(Double.toString(ap3))).setScale(digits, BigDecimal.ROUND_HALF_UP).doubleValue();
 | 
	
		
			
				|  |  | -					}else{
 | 
	
		
			
				|  |  | -						// 仪表期末值 - 仪表期初值
 | 
	
		
			
				|  |  | -						ap1 = new BigDecimal(Double.toString(qm)).subtract(new BigDecimal(Double.toString(qc2))).multiply(new BigDecimal(mod)).setScale(digits, BigDecimal.ROUND_HALF_UP).doubleValue();
 | 
	
		
			
				|  |  | -					}
 | 
	
		
			
				|  |  | -				}else{
 | 
	
		
			
				|  |  | -					ten = "0";
 | 
	
		
			
				|  |  | -					// 有清零数据计算值用小时值累加,其他期初期末数据正常用期末-期初
 | 
	
		
			
				|  |  | -					if(qm == tagBad || qc2 == tagBad || qc2 == 0d || new BigDecimal(Double.toString(qm)).subtract(new BigDecimal(Double.toString(qc2))).doubleValue()<0 
 | 
	
		
			
				|  |  | -							|| !energytypeid.equalsIgnoreCase("E")){
 | 
	
		
			
				|  |  | -						String sql = "select nvl(round(sum("+tagCol+")*"+mod+", "+digits+"),0) from "+tagTable+" where substr(clock,0,10) = ?";
 | 
	
		
			
				|  |  | -						try {
 | 
	
		
			
				|  |  | -							ap1 = jdbcTemplate.queryForObject(sql, new Object[]{end}, Double.class);
 | 
	
		
			
				|  |  | -							if(ap1!=null && Math.abs(ap1) > Integer.MAX_VALUE){
 | 
	
		
			
				|  |  | -								ap1 = 0d;
 | 
	
		
			
				|  |  | -							}
 | 
	
		
			
				|  |  | -						}catch(Exception e) {
 | 
	
		
			
				|  |  | -							ap1 = 0d;
 | 
	
		
			
				|  |  | -						}
 | 
	
		
			
				|  |  | -					}else{
 | 
	
		
			
				|  |  | -						// 仪表期末值 - 仪表期初值
 | 
	
		
			
				|  |  | -						ap1 = new BigDecimal(Double.toString(qm)).subtract(new BigDecimal(Double.toString(qc2))).multiply(new BigDecimal(mod)).setScale(digits, BigDecimal.ROUND_HALF_UP).doubleValue();
 | 
	
		
			
				|  |  | -					}
 | 
	
		
			
				|  |  | -				}
 | 
	
		
			
				|  |  | -				ap = new BigDecimal(Double.toString(ap1)).add(new BigDecimal(Double.toString(ap))).setScale(digits, BigDecimal.ROUND_HALF_UP).doubleValue();
 | 
	
		
			
				|  |  | -			}else{
 | 
	
		
			
				|  |  | -				try {
 | 
	
		
			
				|  |  | -					ap = jdbcTemplate.queryForObject(sql3, new Object[]{itemid, start, qm_clk2}, Double.class);
 | 
	
		
			
				|  |  | -					if(ap!=null && Math.abs(ap) > Integer.MAX_VALUE){
 | 
	
		
			
				|  |  | -						logger.error("仪表数值异常:" + ap);
 | 
	
		
			
				|  |  | -						ap = 0d;
 | 
	
		
			
				|  |  | -					}
 | 
	
		
			
				|  |  | -				} catch(DataAccessException e) {
 | 
	
		
			
				|  |  | -					ap = tagBad;
 | 
	
		
			
				|  |  | -				}
 | 
	
		
			
				|  |  | -			}
 | 
	
		
			
				|  |  | -			Map<String, Object> m = new HashMap<String, Object>();
 | 
	
		
			
				|  |  | -			m.put("itemid", itemid);
 | 
	
		
			
				|  |  | -			m.put("qc", new BigDecimal(Double.toString(qc)).toPlainString());
 | 
	
		
			
				|  |  | -			m.put("qm", new BigDecimal(Double.toString(qm)).toPlainString());
 | 
	
		
			
				|  |  | -			m.put("ap", new BigDecimal(Double.toString(ap)).toPlainString());
 | 
	
		
			
				|  |  | -			m.put("ten", ten);
 | 
	
		
			
				|  |  | -			l.add(m);
 | 
	
		
			
				|  |  | -		}
 | 
	
		
			
				|  |  | -		return l;
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	@Override
 | 
	
		
			
				|  |  | -	public String restatCalpData(String itemid, String clock, String timegranid, String opuser) {
 | 
	
		
			
				|  |  | -		TRmCalpoint tRmCalpoint = tRmCalpointMapper.selectByPrimaryKey(itemid);
 | 
	
		
			
				|  |  | -		return restatCalData(tRmCalpoint, clock, timegranid,opuser);
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -	
 | 
	
		
			
				|  |  | -	@Override
 | 
	
		
			
				|  |  | -    public Double getSumvalue(HashMap<String, Object> params) {
 | 
	
		
			
				|  |  | -        return tRmCalpointValueMapper.getSumvalue(params);
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	@Override
 | 
	
		
			
				|  |  | -	public void resWData(String clock, String clock2) {
 | 
	
		
			
				|  |  | -		//水计量点统计
 | 
	
		
			
				|  |  | -		emsWaterRealtimeService.getWaterTenMinutes();
 | 
	
		
			
				|  |  | -		emsWaterRealtimeService.getWaterHour(clock,clock2);
 | 
	
		
			
				|  |  | -		emsWaterRealtimeService.getHistoryWaterToHour();
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	@Override
 | 
	
		
			
				|  |  | -	public List<TRmCalpointValue> getDataForBb() {
 | 
	
		
			
				|  |  | -		return tRmCalpointValueMapper.getDataForBb();
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -	public void  insetDataForBb(){
 | 
	
		
			
				|  |  | -		List<TRmCalpointValue> dataForBb = this.getDataForBb();
 | 
	
		
			
				|  |  | -		HashMap<String,Object> hashMap =  new HashMap();
 | 
	
		
			
				|  |  | -		dataForBb.forEach( item -> {
 | 
	
		
			
				|  |  | -			item.setTimegranid("DAY");
 | 
	
		
			
				|  |  | -			item.setCrman("系统");
 | 
	
		
			
				|  |  | -			item.setCorrectvalue(new BigDecimal("0"));
 | 
	
		
			
				|  |  | -			item.setActualvalue(item.getApportvalue());
 | 
	
		
			
				|  |  | -			item.setRecTime(DateUtils.dateStr(new Date(),"yyyy-MM-dd HH:mm:ss"));
 | 
	
		
			
				|  |  | -			hashMap.put("itemid",item.getItemid());
 | 
	
		
			
				|  |  | -			hashMap.put("clock",item.getClock());
 | 
	
		
			
				|  |  | -			hashMap.put("timegranid",item.getTimegranid());
 | 
	
		
			
				|  |  | -			TRmCalpointValue tRmCalpointValue = tRmCalpointValueMapper.selectByPrimaryKey(hashMap);
 | 
	
		
			
				|  |  | -			if (tRmCalpointValue != null ){
 | 
	
		
			
				|  |  | -				tRmCalpointValueMapper.updateByPrimaryKeySelective(item);
 | 
	
		
			
				|  |  | -			}
 | 
	
		
			
				|  |  | -			else {
 | 
	
		
			
				|  |  | -				tRmCalpointValueMapper.insert(item);
 | 
	
		
			
				|  |  | -			}
 | 
	
		
			
				|  |  | -		});
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | +package com.steerinfo.ems.trmcalpointvalue.service.impl;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +import com.steerinfo.auth.utils.JwtUtil;
 | 
	
		
			
				|  |  | +import com.steerinfo.ems.Utils.DateUtils;
 | 
	
		
			
				|  |  | +import com.steerinfo.ems.cordasconfiguration.mapper.CordasConfigurationMapper;
 | 
	
		
			
				|  |  | +import com.steerinfo.ems.cordasconfiguration.model.CordasConfiguration;
 | 
	
		
			
				|  |  | +import com.steerinfo.ems.emscalpointvalue.mapper.EmsCalpointValueMapper;
 | 
	
		
			
				|  |  | +import com.steerinfo.ems.emscalpointvalue.model.EmsCalpointValue;
 | 
	
		
			
				|  |  | +import com.steerinfo.ems.emswaterrealtime.service.IEmsWaterRealtimeService;
 | 
	
		
			
				|  |  | +import com.steerinfo.ems.formula.service.IFormulaService;
 | 
	
		
			
				|  |  | +import com.steerinfo.ems.mesemsdieseloil.service.IMesEmsDieseloilService;
 | 
	
		
			
				|  |  | +import com.steerinfo.ems.trmcalpoint.mapper.TRmCalpointMapper;
 | 
	
		
			
				|  |  | +import com.steerinfo.ems.trmcalpoint.model.TRmCalpoint;
 | 
	
		
			
				|  |  | +import com.steerinfo.ems.trmcalpointexvalue.model.TRmCalpointExValue;
 | 
	
		
			
				|  |  | +import com.steerinfo.ems.trmcalpointexvalue.service.ITRmCalpointExValueService;
 | 
	
		
			
				|  |  | +import com.steerinfo.ems.trmcalpointvalue.mapper.TRmCalpointValueMapper;
 | 
	
		
			
				|  |  | +import com.steerinfo.ems.trmcalpointvalue.model.TRmCalpointValue;
 | 
	
		
			
				|  |  | +import com.steerinfo.ems.trmcalpointvalue.service.ITRmCalpointValueService;
 | 
	
		
			
				|  |  | +import com.steerinfo.framework.mapper.IBaseMapper;
 | 
	
		
			
				|  |  | +import com.steerinfo.framework.service.impl.BaseServiceImpl;
 | 
	
		
			
				|  |  | +import org.slf4j.Logger;
 | 
	
		
			
				|  |  | +import org.slf4j.LoggerFactory;
 | 
	
		
			
				|  |  | +import org.springframework.beans.factory.annotation.Autowired;
 | 
	
		
			
				|  |  | +import org.springframework.dao.DataAccessException;
 | 
	
		
			
				|  |  | +import org.springframework.jdbc.core.JdbcTemplate;
 | 
	
		
			
				|  |  | +import org.springframework.stereotype.Service;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +import java.math.BigDecimal;
 | 
	
		
			
				|  |  | +import java.text.ParseException;
 | 
	
		
			
				|  |  | +import java.text.SimpleDateFormat;
 | 
	
		
			
				|  |  | +import java.util.*;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +/**
 | 
	
		
			
				|  |  | + * TRmCalpointValue服务实现:
 | 
	
		
			
				|  |  | + * @author generator
 | 
	
		
			
				|  |  | + * @version 1.0-SNAPSHORT 2019-10-17 03:55
 | 
	
		
			
				|  |  | + * 类描述
 | 
	
		
			
				|  |  | + * 修订历史:
 | 
	
		
			
				|  |  | + * 日期:2019-10-17
 | 
	
		
			
				|  |  | + * 作者:generator
 | 
	
		
			
				|  |  | + * 参考:
 | 
	
		
			
				|  |  | + * 描述:TRmCalpointValue服务实现
 | 
	
		
			
				|  |  | + * @see null
 | 
	
		
			
				|  |  | + * @Copyright 湖南视拓信息技术股份有限公司. All rights reserved.
 | 
	
		
			
				|  |  | + */
 | 
	
		
			
				|  |  | +@Service(value = "tRmCalpointValueService")
 | 
	
		
			
				|  |  | +public class TRmCalpointValueServiceImpl extends BaseServiceImpl<TRmCalpointValue, HashMap<String, Object>> implements ITRmCalpointValueService {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	private static final Logger logger = LoggerFactory.getLogger(TRmCalpointValueServiceImpl.class);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	@Autowired
 | 
	
		
			
				|  |  | +    private JdbcTemplate jdbcTemplate;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    @Autowired
 | 
	
		
			
				|  |  | +    private TRmCalpointValueMapper tRmCalpointValueMapper;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    @Autowired
 | 
	
		
			
				|  |  | +    private TRmCalpointMapper tRmCalpointMapper;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    @Autowired
 | 
	
		
			
				|  |  | +    private IFormulaService formulaService;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    @Autowired
 | 
	
		
			
				|  |  | +    private CordasConfigurationMapper cordasConfigurationMapper;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    @Autowired
 | 
	
		
			
				|  |  | +    private EmsCalpointValueMapper emsCalpointValueMapper;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    @Autowired
 | 
	
		
			
				|  |  | +    ITRmCalpointExValueService tRmCalpointExValueService;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    @Autowired
 | 
	
		
			
				|  |  | +    IMesEmsDieseloilService mesEmsDieseloilService;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	@Autowired
 | 
	
		
			
				|  |  | +	IEmsWaterRealtimeService emsWaterRealtimeService;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    @Override
 | 
	
		
			
				|  |  | +    protected IBaseMapper<TRmCalpointValue, HashMap<String, Object>> getMapper() {
 | 
	
		
			
				|  |  | +        return tRmCalpointValueMapper;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	@Override
 | 
	
		
			
				|  |  | +	//@Transactional(rollbackFor=Exception.class)
 | 
	
		
			
				|  |  | +	public void statData(Date date) {
 | 
	
		
			
				|  |  | +		Calendar calendar = Calendar.getInstance();
 | 
	
		
			
				|  |  | +		calendar.setTime(date);
 | 
	
		
			
				|  |  | +		int dm = calendar.get(Calendar.DAY_OF_MONTH);
 | 
	
		
			
				|  |  | +		int dy = calendar.get(Calendar.DAY_OF_YEAR);
 | 
	
		
			
				|  |  | +		String today = new SimpleDateFormat("yyyy-MM-dd").format(calendar.getTime());
 | 
	
		
			
				|  |  | +		String thisMonth = new SimpleDateFormat("yyyy-MM").format(calendar.getTime());
 | 
	
		
			
				|  |  | +		String thisYear = calendar.get(Calendar.YEAR) + "";
 | 
	
		
			
				|  |  | +		String lastYear = (calendar.get(Calendar.YEAR)-1) + "";
 | 
	
		
			
				|  |  | +		calendar.add(Calendar.DAY_OF_YEAR, -1); // 减1天获得昨日日期
 | 
	
		
			
				|  |  | +		String yesterday = new SimpleDateFormat("yyyy-MM-dd").format(calendar.getTime());
 | 
	
		
			
				|  |  | +		calendar.add(Calendar.DAY_OF_YEAR, 1);
 | 
	
		
			
				|  |  | +		calendar.add(Calendar.MONTH, -1); // 减1月获得上月
 | 
	
		
			
				|  |  | +		String lastMonth = new SimpleDateFormat("yyyy-MM").format(calendar.getTime());
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		Map<String, Object> m = new HashMap<String, Object>();
 | 
	
		
			
				|  |  | +		m.put("useflag", "1");
 | 
	
		
			
				|  |  | +		// 查询需要统计的计量点信息
 | 
	
		
			
				|  |  | +		List<TRmCalpoint> l = tRmCalpointMapper.selectCalpoints(m);
 | 
	
		
			
				|  |  | +		if(l!=null && l.size()>0){
 | 
	
		
			
				|  |  | +			for(TRmCalpoint tRmCalpoint : l){
 | 
	
		
			
				|  |  | +				String itemtype = tRmCalpoint.getItemtype(); // 类型 AUTO:自动,MANUAL:手抄,VIRTUAL:虚拟
 | 
	
		
			
				|  |  | +				String mintimegranid = tRmCalpoint.getMintimegranid()==null? "DAY" : tRmCalpoint.getMintimegranid();
 | 
	
		
			
				|  |  | +				// 最小粒度日时间粒度数据
 | 
	
		
			
				|  |  | +				if(mintimegranid.equalsIgnoreCase("DAY") || mintimegranid.equalsIgnoreCase("SHIFT")){
 | 
	
		
			
				|  |  | +					// 手动提前生成时间粒度
 | 
	
		
			
				|  |  | +					String dclk = itemtype.equalsIgnoreCase("MANUAL")?today:yesterday;
 | 
	
		
			
				|  |  | +					restatCalData(tRmCalpoint, dclk, "DAY", "系统");
 | 
	
		
			
				|  |  | +				}
 | 
	
		
			
				|  |  | +				// 月时间粒度数据,每月统计上月数据
 | 
	
		
			
				|  |  | +				if (dm < 3 && !mintimegranid.equalsIgnoreCase("YEAR")) {
 | 
	
		
			
				|  |  | +					restatCalData(tRmCalpoint, lastMonth, "MONTH", "系统");
 | 
	
		
			
				|  |  | +				}
 | 
	
		
			
				|  |  | +				// 年时间粒度数据,每年第一天统计去年数据
 | 
	
		
			
				|  |  | +				if (dy < 3) {
 | 
	
		
			
				|  |  | +					restatCalData(tRmCalpoint, lastYear, "YEAR", "系统");
 | 
	
		
			
				|  |  | +				}
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  | +			logger.info(new SimpleDateFormat("yyyy-MM-dd").format(date) + " 计量点定时统计数据任务执行完毕~");
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	@Override
 | 
	
		
			
				|  |  | +	public TRmCalpointValue modifyAndCompute(TRmCalpointValue tRmCalpointValue) {
 | 
	
		
			
				|  |  | +		tRmCalpointValueMapper.updateByPrimaryKeySelective(tRmCalpointValue);
 | 
	
		
			
				|  |  | +		String itemid = tRmCalpointValue.getItemid();
 | 
	
		
			
				|  |  | +		String clock = tRmCalpointValue.getClock();
 | 
	
		
			
				|  |  | +		String timegranid = tRmCalpointValue.getTimegranid();
 | 
	
		
			
				|  |  | +		// 重新计算
 | 
	
		
			
				|  |  | +		formulaService.reCalculate(itemid, clock, timegranid, clock);
 | 
	
		
			
				|  |  | +		return tRmCalpointValueMapper.selectByPrimaryKey(tRmCalpointValue.getId());
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	@Override
 | 
	
		
			
				|  |  | +	public void statDataShift(Date date) {
 | 
	
		
			
				|  |  | +		Calendar cal = Calendar.getInstance();
 | 
	
		
			
				|  |  | +		cal.setTime(date);
 | 
	
		
			
				|  |  | +		cal.add(Calendar.HOUR_OF_DAY, -8); // 减8小时获得需要统计的上一个班的时间
 | 
	
		
			
				|  |  | +		SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH");
 | 
	
		
			
				|  |  | +		int dh = cal.get(Calendar.HOUR_OF_DAY);
 | 
	
		
			
				|  |  | +		if(dh%8==0){
 | 
	
		
			
				|  |  | +			logger.info("节点时间不统计数据,以防数据出错");
 | 
	
		
			
				|  |  | +			return;
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +		// 统计日
 | 
	
		
			
				|  |  | +		String statTim = new SimpleDateFormat("yyyy-MM-dd ").format(cal.getTime());
 | 
	
		
			
				|  |  | +		// clock 格式:yyyy-MM-dd HH
 | 
	
		
			
				|  |  | +		String clock = statTim+String.format("%02d", (dh/8)*8+8);
 | 
	
		
			
				|  |  | +		// 期初时间
 | 
	
		
			
				|  |  | +		String starth = statTim+String.format("%02d", (dh/8)*8);
 | 
	
		
			
				|  |  | +		// 期末时间
 | 
	
		
			
				|  |  | +		String endh = "";
 | 
	
		
			
				|  |  | +		try {
 | 
	
		
			
				|  |  | +			endh = sf.format(sf.parse(clock));
 | 
	
		
			
				|  |  | +		} catch (Exception e) {
 | 
	
		
			
				|  |  | +			logger.error("日期格式错误");
 | 
	
		
			
				|  |  | +			return;
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +		Map<String, Object> m = new HashMap<String, Object>();
 | 
	
		
			
				|  |  | +		m.put("useflag", "1");
 | 
	
		
			
				|  |  | +		m.put("mintimegranid", "SHIFT");
 | 
	
		
			
				|  |  | +		// 查询需要统计的计量点信息
 | 
	
		
			
				|  |  | +		List<TRmCalpoint> l = tRmCalpointMapper.selectCalpoints(m);
 | 
	
		
			
				|  |  | +		if(l!=null && l.size()>0){
 | 
	
		
			
				|  |  | +			for(TRmCalpoint tRmCalpoint : l){
 | 
	
		
			
				|  |  | +				String itemtype = tRmCalpoint.getItemtype(); // 类型 AUTO:自动,MANUAL:手抄,VIRTUAL:虚拟
 | 
	
		
			
				|  |  | +				String itemid = tRmCalpoint.getItemid();
 | 
	
		
			
				|  |  | +				String itemname = tRmCalpoint.getItemname();
 | 
	
		
			
				|  |  | +				String tagTable = tRmCalpoint.getTagTable()==null? "" :tRmCalpoint.getTagTable().trim(); // 小时表
 | 
	
		
			
				|  |  | +				String tagCol = tRmCalpoint.getTagCol()==null? "" :tRmCalpoint.getTagCol().trim(); // 小时表字段
 | 
	
		
			
				|  |  | +				String energytypeid = tRmCalpoint.getEnergytypeid(); // 能介大类
 | 
	
		
			
				|  |  | +				String tagBadStr = tRmCalpoint.getTagBadSymbol()==null? "-1" : tRmCalpoint.getTagBadSymbol();
 | 
	
		
			
				|  |  | +				Double mod = tRmCalpoint.getTagModulus() == null? 1d : tRmCalpoint.getTagModulus().doubleValue(); // 倍率
 | 
	
		
			
				|  |  | +				Double tagBad = -1d; // 异常点标签(读表异常时候插入的值)
 | 
	
		
			
				|  |  | +				try {
 | 
	
		
			
				|  |  | +					tagBad = Double.parseDouble(tagBadStr);
 | 
	
		
			
				|  |  | +				} catch (NumberFormatException e) {
 | 
	
		
			
				|  |  | +					logger.error("计量点" + itemid + "的tag_bad_symbol值格式应该为负数,当前值为:" + tagBadStr);
 | 
	
		
			
				|  |  | +					tagBad = -1d;
 | 
	
		
			
				|  |  | +				}
 | 
	
		
			
				|  |  | +				if(itemtype.equalsIgnoreCase("AUTO") && (tagTable.isEmpty() || tagCol.isEmpty())){
 | 
	
		
			
				|  |  | +					logger.error("计量点的数据表与数据列信息不完整!itemid:" + itemid);
 | 
	
		
			
				|  |  | +					// 班时间粒度该项目数据是否已经存在
 | 
	
		
			
				|  |  | +					String sql = "select count(1) from T_RM_CALPOINT_VALUE where clock = ? and timegranid='SHIFT' and itemid = ?";
 | 
	
		
			
				|  |  | +					int c = jdbcTemplate.queryForObject(sql, new Object[]{clock,itemid}, Integer.class);
 | 
	
		
			
				|  |  | +					if(c>0){
 | 
	
		
			
				|  |  | +						logger.error(clock + "-itemid:" + itemid + " 已存在数据。");
 | 
	
		
			
				|  |  | +					}else{
 | 
	
		
			
				|  |  | +						TRmCalpointValue t = new TRmCalpointValue();
 | 
	
		
			
				|  |  | +						t.setClock(clock);
 | 
	
		
			
				|  |  | +						t.setTimegranid("SHIFT");
 | 
	
		
			
				|  |  | +						t.setItemid(itemid);
 | 
	
		
			
				|  |  | +						t.setItemname(itemname);
 | 
	
		
			
				|  |  | +						t.setApportvalue(BigDecimal.ZERO); // 最终值
 | 
	
		
			
				|  |  | +						t.setActualvalue(BigDecimal.ZERO); // 计算值
 | 
	
		
			
				|  |  | +						t.setCorrectvalue(BigDecimal.ZERO); // 修正值
 | 
	
		
			
				|  |  | +						t.setMintvalue(BigDecimal.ZERO);
 | 
	
		
			
				|  |  | +						t.setMendvalue(BigDecimal.ZERO);
 | 
	
		
			
				|  |  | +						t.setSumvalue(BigDecimal.ZERO);
 | 
	
		
			
				|  |  | +						t.setBz("-1:请配置数据表与数据列");
 | 
	
		
			
				|  |  | +						t.setRecTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
 | 
	
		
			
				|  |  | +						t.setUpman("系统");
 | 
	
		
			
				|  |  | +						tRmCalpointValueMapper.insertSelective(t);
 | 
	
		
			
				|  |  | +						//throw new RuntimeException("请先在计量点信息维护中配置计量点的数据表与数据列!");
 | 
	
		
			
				|  |  | +						continue;
 | 
	
		
			
				|  |  | +					}
 | 
	
		
			
				|  |  | +				}
 | 
	
		
			
				|  |  | +				Short digits = tRmCalpoint.getDigits() == null ? 4 : tRmCalpoint.getDigits();
 | 
	
		
			
				|  |  | +				Short digits2 = tRmCalpoint.getMeterScale() == null ? 4 : tRmCalpoint.getMeterScale(); // 准点值精度
 | 
	
		
			
				|  |  | +				Double qc = 0d; // 仪表期初值
 | 
	
		
			
				|  |  | +				Double qm = 0d; // 仪表期末值
 | 
	
		
			
				|  |  | +				
 | 
	
		
			
				|  |  | +				// 班时间粒度该项目数据是否已经存在
 | 
	
		
			
				|  |  | +				String sql = "select count(1) from T_RM_CALPOINT_VALUE where clock = ? and timegranid='SHIFT' and itemid = ?";
 | 
	
		
			
				|  |  | +				int c = jdbcTemplate.queryForObject(sql, new Object[]{clock,itemid}, Integer.class);
 | 
	
		
			
				|  |  | +				if(c>0){
 | 
	
		
			
				|  |  | +					logger.error(clock + "-itemid:" + itemid + " 已存在数据。");
 | 
	
		
			
				|  |  | +				}else{
 | 
	
		
			
				|  |  | +					TRmCalpointValue t = new TRmCalpointValue();
 | 
	
		
			
				|  |  | +					t.setClock(clock);
 | 
	
		
			
				|  |  | +					t.setTimegranid("SHIFT");
 | 
	
		
			
				|  |  | +					t.setItemid(itemid);
 | 
	
		
			
				|  |  | +					t.setItemname(itemname);
 | 
	
		
			
				|  |  | +					t.setApportvalue(BigDecimal.ZERO); // 最终值
 | 
	
		
			
				|  |  | +					t.setCorrectvalue(BigDecimal.ZERO); // 修正值
 | 
	
		
			
				|  |  | +					t.setActualvalue(BigDecimal.ZERO); // 计算值
 | 
	
		
			
				|  |  | +					if(itemtype.equalsIgnoreCase("AUTO") && !tagTable.equalsIgnoreCase("MES_EMS_DIESELOIL")){
 | 
	
		
			
				|  |  | +						// 获取仪表期初、期末值
 | 
	
		
			
				|  |  | +						sql = "select nvl(round("+tagCol+", "+digits2+"),0) from "+tagTable + "_ORG where clock = ?";
 | 
	
		
			
				|  |  | +						try {
 | 
	
		
			
				|  |  | +							qc = jdbcTemplate.queryForObject(sql, new Object[]{starth}, Double.class);
 | 
	
		
			
				|  |  | +							if(qc!=null && Math.abs(qc) > Integer.MAX_VALUE){
 | 
	
		
			
				|  |  | +								t.setBz("仪表期初值异常:" + qc);
 | 
	
		
			
				|  |  | +								qc = tagBad;
 | 
	
		
			
				|  |  | +							}
 | 
	
		
			
				|  |  | +						} catch(DataAccessException e) {
 | 
	
		
			
				|  |  | +							logger.error(starth + "-itemid:" + itemid + " 没有仪表期初值。");
 | 
	
		
			
				|  |  | +							qc = tagBad;
 | 
	
		
			
				|  |  | +						}
 | 
	
		
			
				|  |  | +						try {
 | 
	
		
			
				|  |  | +							qm = jdbcTemplate.queryForObject(sql, new Object[]{endh}, Double.class);
 | 
	
		
			
				|  |  | +							if(qm!=null && Math.abs(qm) > Integer.MAX_VALUE){
 | 
	
		
			
				|  |  | +								t.setBz("仪表期末值异常:" + qm);
 | 
	
		
			
				|  |  | +								qm = tagBad;
 | 
	
		
			
				|  |  | +							}
 | 
	
		
			
				|  |  | +						} catch(DataAccessException e) {
 | 
	
		
			
				|  |  | +							logger.error(endh + "-itemid:" + itemid + " 没有仪表期末值。");
 | 
	
		
			
				|  |  | +							qm = tagBad;
 | 
	
		
			
				|  |  | +						}
 | 
	
		
			
				|  |  | +						t.setMintvalue(qc==null?null:new BigDecimal(Double.toString(qc)));
 | 
	
		
			
				|  |  | +						t.setMendvalue(qm==null?null:new BigDecimal(Double.toString(qm)));
 | 
	
		
			
				|  |  | +						if(qm == tagBad || qc == tagBad || qc == 0d || new BigDecimal(Double.toString(qm)).subtract(new BigDecimal(Double.toString(qc))).doubleValue()<0
 | 
	
		
			
				|  |  | +								|| !energytypeid.equalsIgnoreCase("E")){
 | 
	
		
			
				|  |  | +							sql = "select nvl(round(sum("+tagCol+")*"+mod+", "+digits+"),0) from "+tagTable+" where clock >= ? and clock<?";
 | 
	
		
			
				|  |  | +							Double d = 0d;
 | 
	
		
			
				|  |  | +							try {
 | 
	
		
			
				|  |  | +								d = jdbcTemplate.queryForObject(sql, new Object[]{starth,endh}, Double.class);
 | 
	
		
			
				|  |  | +								if(d!=null && Math.abs(d) > Integer.MAX_VALUE){
 | 
	
		
			
				|  |  | +									t.setBz("仪表数值异常:" + d);
 | 
	
		
			
				|  |  | +									d = 0d;
 | 
	
		
			
				|  |  | +								}
 | 
	
		
			
				|  |  | +							}catch(Exception e) {
 | 
	
		
			
				|  |  | +								e.printStackTrace();
 | 
	
		
			
				|  |  | +								logger.error(endh + "-itemid:" + itemid + " 取值错误, tagTable-" + tagTable + ",tagCol-" + tagCol);
 | 
	
		
			
				|  |  | +								continue;
 | 
	
		
			
				|  |  | +							}
 | 
	
		
			
				|  |  | +							t.setApportvalue(d==null?null:new BigDecimal(Double.toString(d))); // 最终值
 | 
	
		
			
				|  |  | +							t.setActualvalue(d==null?null:new BigDecimal(Double.toString(d))); // 计算值
 | 
	
		
			
				|  |  | +						}else{
 | 
	
		
			
				|  |  | +							// 仪表期末值 - 仪表期初值
 | 
	
		
			
				|  |  | +							BigDecimal ap = new BigDecimal(Double.toString(qm)).subtract(new BigDecimal(Double.toString(qc))).multiply(new BigDecimal(mod)).setScale(digits, BigDecimal.ROUND_HALF_UP);
 | 
	
		
			
				|  |  | +							t.setApportvalue(ap); // 最终值
 | 
	
		
			
				|  |  | +							t.setActualvalue(ap); // 计算值
 | 
	
		
			
				|  |  | +						}
 | 
	
		
			
				|  |  | +					}else if(itemtype.equalsIgnoreCase("MANUAL")){ // 手动
 | 
	
		
			
				|  |  | +						// 当前小时数
 | 
	
		
			
				|  |  | +						int h = Calendar.getInstance().get(Calendar.HOUR_OF_DAY);
 | 
	
		
			
				|  |  | +						// clock 格式:yyyy-MM-dd HH,手动计量点提前生成数据
 | 
	
		
			
				|  |  | +						String clk = new SimpleDateFormat("yyyy-MM-dd ").format(new Date())+String.format("%02d", (h/8)*8+8);
 | 
	
		
			
				|  |  | +						t.setClock(clk);
 | 
	
		
			
				|  |  | +					}else if(itemtype.equalsIgnoreCase("VIRTUAL")){
 | 
	
		
			
				|  |  | +						// 获得计算公式
 | 
	
		
			
				|  |  | +						String formula = formulaService.getFormula(itemid,clock);
 | 
	
		
			
				|  |  | +						// 根据公式获取计算值
 | 
	
		
			
				|  |  | +						Double dval = formulaService.getValByFormula(formula, "SHIFT", clock, digits, 0);
 | 
	
		
			
				|  |  | +						if(dval < 0){
 | 
	
		
			
				|  |  | +							logger.error(clock + "-itemid:" + itemid + " 计算公式错误。");
 | 
	
		
			
				|  |  | +						}
 | 
	
		
			
				|  |  | +						t.setApportvalue(new BigDecimal(Double.toString(dval))); // 最终值
 | 
	
		
			
				|  |  | +						t.setActualvalue(new BigDecimal(Double.toString(dval))); // 计算值
 | 
	
		
			
				|  |  | +					}
 | 
	
		
			
				|  |  | +					t.setRecTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
 | 
	
		
			
				|  |  | +					t.setUpman("系统");
 | 
	
		
			
				|  |  | +					tRmCalpointValueMapper.insertSelective(t);
 | 
	
		
			
				|  |  | +				}
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +		logger.info(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date) + " 计量点班粒度定时统计数据任务执行完毕~");
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	@Override
 | 
	
		
			
				|  |  | +	public String restatAllData(String clock, String timegranid) {
 | 
	
		
			
				|  |  | +		String opuser = JwtUtil.getUseridByToken();
 | 
	
		
			
				|  |  | +		// 班粒度,只重新计算当月班数据
 | 
	
		
			
				|  |  | +		if(timegranid.equalsIgnoreCase("SHIFT")){
 | 
	
		
			
				|  |  | +			Date startDay = new Date();
 | 
	
		
			
				|  |  | +			Date endDay = new Date();
 | 
	
		
			
				|  |  | +			SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH");
 | 
	
		
			
				|  |  | +			try {
 | 
	
		
			
				|  |  | +				startDay = sf.parse(clock);
 | 
	
		
			
				|  |  | +			} catch (Exception e) {
 | 
	
		
			
				|  |  | +				return "日期格式错误";
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  | +			Calendar cal = Calendar.getInstance();
 | 
	
		
			
				|  |  | +			cal.add(Calendar.HOUR_OF_DAY, -1);
 | 
	
		
			
				|  |  | +			cal.add(Calendar.MINUTE, -1);
 | 
	
		
			
				|  |  | +			
 | 
	
		
			
				|  |  | +			// 当月,统计最后时间为昨天
 | 
	
		
			
				|  |  | +			if(new SimpleDateFormat("yyyy-MM").format(cal.getTime()).equals(clock.substring(0, 7))){
 | 
	
		
			
				|  |  | +				endDay = cal.getTime();
 | 
	
		
			
				|  |  | +			}else{
 | 
	
		
			
				|  |  | +				// 非当月,统计到下月初
 | 
	
		
			
				|  |  | +				Calendar c = Calendar.getInstance();
 | 
	
		
			
				|  |  | +				c.setTime(startDay);
 | 
	
		
			
				|  |  | +				c.set(Calendar.DAY_OF_MONTH, 1);
 | 
	
		
			
				|  |  | +				c.add(Calendar.MONTH, 1);
 | 
	
		
			
				|  |  | +				c.set(Calendar.HOUR_OF_DAY, 0);
 | 
	
		
			
				|  |  | +				endDay = c.getTime();
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  | +			while(!startDay.after(endDay)){
 | 
	
		
			
				|  |  | +				// 统计结束时间 
 | 
	
		
			
				|  |  | +				String clk = sf.format(startDay);
 | 
	
		
			
				|  |  | +				int st = Integer.valueOf(clk.substring(11));
 | 
	
		
			
				|  |  | +				// 0点数据转成班记录24点,clock
 | 
	
		
			
				|  |  | +				if(st == 0){
 | 
	
		
			
				|  |  | +					clk = sf.format(new Date(startDay.getTime() - 1000l)).substring(0, 11) + 24;
 | 
	
		
			
				|  |  | +				}
 | 
	
		
			
				|  |  | +				Map<String, Object> m = new HashMap<String, Object>();
 | 
	
		
			
				|  |  | +				m.put("useflag", "1");
 | 
	
		
			
				|  |  | +				m.put("mintimegranid", "SHIFT");
 | 
	
		
			
				|  |  | +				// 查询需要统计的计量点信息
 | 
	
		
			
				|  |  | +				List<TRmCalpoint> l = tRmCalpointMapper.selectCalpoints(m);
 | 
	
		
			
				|  |  | +				if(l!=null && l.size()>0){
 | 
	
		
			
				|  |  | +					for(TRmCalpoint tRmCalpoint : l){
 | 
	
		
			
				|  |  | +						restatCalData(tRmCalpoint, clk, "SHIFT", opuser);
 | 
	
		
			
				|  |  | +					}
 | 
	
		
			
				|  |  | +				}
 | 
	
		
			
				|  |  | +				startDay = new Date(startDay.getTime() + 8*3600*1000L);
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  | +		}else if(timegranid.equalsIgnoreCase("DAY")){ // 重新计算日、月、年粒度数据
 | 
	
		
			
				|  |  | +			Date startDay = null; // 计算开始日期
 | 
	
		
			
				|  |  | +			Date endDay = null; // 计算结束日期
 | 
	
		
			
				|  |  | +			try {
 | 
	
		
			
				|  |  | +				startDay = new SimpleDateFormat("yyyy-MM-dd").parse(clock);
 | 
	
		
			
				|  |  | +			} catch (ParseException e) {
 | 
	
		
			
				|  |  | +				return "日期格式错误";
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  | +			// 最后可以统计的日期
 | 
	
		
			
				|  |  | +			Calendar cal = Calendar.getInstance();
 | 
	
		
			
				|  |  | +			cal.add(Calendar.HOUR_OF_DAY, -1);
 | 
	
		
			
				|  |  | +			cal.add(Calendar.MINUTE, -1);
 | 
	
		
			
				|  |  | +			// 当月,统计最后时间为昨天
 | 
	
		
			
				|  |  | +			if(new SimpleDateFormat("yyyy-MM").format(cal.getTime()).equals(clock.substring(0, 7))){
 | 
	
		
			
				|  |  | +				endDay = cal.getTime();
 | 
	
		
			
				|  |  | +			}else{
 | 
	
		
			
				|  |  | +				// 非当月,统计到月底
 | 
	
		
			
				|  |  | +				Calendar c = Calendar.getInstance();
 | 
	
		
			
				|  |  | +				c.setTime(startDay);
 | 
	
		
			
				|  |  | +				c.set(Calendar.DAY_OF_MONTH, 1);
 | 
	
		
			
				|  |  | +				c.add(Calendar.MONTH, 1);
 | 
	
		
			
				|  |  | +				c.add(Calendar.DAY_OF_YEAR, -1);
 | 
	
		
			
				|  |  | +				endDay = c.getTime();
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  | +			// 统计开始日期
 | 
	
		
			
				|  |  | +			Calendar sta = Calendar.getInstance();
 | 
	
		
			
				|  |  | +			sta.setTime(startDay);
 | 
	
		
			
				|  |  | +			// 月粒度统计
 | 
	
		
			
				|  |  | +			int startMonth = sta.get(Calendar.MONTH)+1;
 | 
	
		
			
				|  |  | +			int endMonth = 12;
 | 
	
		
			
				|  |  | +			// 如果是今年,计算最后月份为上月
 | 
	
		
			
				|  |  | +			if(sta.get(Calendar.YEAR) ==  cal.get(Calendar.YEAR)){
 | 
	
		
			
				|  |  | +				endMonth = cal.get(Calendar.MONTH);
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  | +			// 查询需要统计的计量点信息,最小粒度为班和日的
 | 
	
		
			
				|  |  | +			Map<String, Object> m = new HashMap<String, Object>();
 | 
	
		
			
				|  |  | +			m.put("useflag", "1");
 | 
	
		
			
				|  |  | +			m.put("mintimegranid", "SHIFT");
 | 
	
		
			
				|  |  | +			List<TRmCalpoint> l = tRmCalpointMapper.selectCalpoints(m);
 | 
	
		
			
				|  |  | +			m.put("mintimegranid", "DAY");
 | 
	
		
			
				|  |  | +			l.addAll(tRmCalpointMapper.selectCalpoints(m));
 | 
	
		
			
				|  |  | +			// 重新计算日数据
 | 
	
		
			
				|  |  | +			while(!startDay.after(endDay)){
 | 
	
		
			
				|  |  | +				String clk = new SimpleDateFormat("yyyy-MM-dd").format(startDay);
 | 
	
		
			
				|  |  | +				for(TRmCalpoint tRmCalpoint : l){
 | 
	
		
			
				|  |  | +					restatCalData(tRmCalpoint, clk, "DAY", opuser);
 | 
	
		
			
				|  |  | +				}
 | 
	
		
			
				|  |  | +				startDay = new Date(startDay.getTime() + 3600*24*1000L);
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  | +			// 重新计算月数据,主要修改月累积值
 | 
	
		
			
				|  |  | +			while(startMonth <= endMonth){
 | 
	
		
			
				|  |  | +				String clk = sta.get(Calendar.YEAR) + "-" + startMonth;
 | 
	
		
			
				|  |  | +				if(startMonth < 10){
 | 
	
		
			
				|  |  | +					clk = sta.get(Calendar.YEAR) + "-0" + startMonth;
 | 
	
		
			
				|  |  | +				}
 | 
	
		
			
				|  |  | +				for(TRmCalpoint tRmCalpoint : l){
 | 
	
		
			
				|  |  | +					restatCalData(tRmCalpoint, clk, "MONTH", opuser);
 | 
	
		
			
				|  |  | +				}
 | 
	
		
			
				|  |  | +				startMonth++;
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  | +			// 不是今年,重新计算年数据
 | 
	
		
			
				|  |  | +			if(sta.get(Calendar.YEAR) !=  cal.get(Calendar.YEAR)){
 | 
	
		
			
				|  |  | +				String clk = sta.get(Calendar.YEAR) + "";
 | 
	
		
			
				|  |  | +				for(TRmCalpoint tRmCalpoint : l){
 | 
	
		
			
				|  |  | +					restatCalData(tRmCalpoint, clk, "YEAR", opuser);
 | 
	
		
			
				|  |  | +				}
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  | +		}else if(timegranid.equalsIgnoreCase("MONTH")){
 | 
	
		
			
				|  |  | +			Date startDay = null; // 计算开始日期
 | 
	
		
			
				|  |  | +			try {
 | 
	
		
			
				|  |  | +				startDay = new SimpleDateFormat("yyyy-MM").parse(clock);
 | 
	
		
			
				|  |  | +			} catch (ParseException e) {
 | 
	
		
			
				|  |  | +				return "日期格式错误";
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  | +			// 最后可以统计的日期
 | 
	
		
			
				|  |  | +			Calendar cal = Calendar.getInstance();
 | 
	
		
			
				|  |  | +			cal.add(Calendar.HOUR_OF_DAY, -1);
 | 
	
		
			
				|  |  | +			cal.add(Calendar.MINUTE, -1);
 | 
	
		
			
				|  |  | +			// 统计开始日期
 | 
	
		
			
				|  |  | +			Calendar sta = Calendar.getInstance();
 | 
	
		
			
				|  |  | +			sta.setTime(startDay);
 | 
	
		
			
				|  |  | +			// 月粒度统计
 | 
	
		
			
				|  |  | +			int startMonth = sta.get(Calendar.MONTH)+1;
 | 
	
		
			
				|  |  | +			int endMonth = 12;
 | 
	
		
			
				|  |  | +			// 如果是今年,计算最后月份为上月
 | 
	
		
			
				|  |  | +			if(sta.get(Calendar.YEAR) ==  cal.get(Calendar.YEAR)){
 | 
	
		
			
				|  |  | +				endMonth = cal.get(Calendar.MONTH);
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  | +			// 查询需要统计的计量点信息,最小粒度为班、日和年的
 | 
	
		
			
				|  |  | +			Map<String, Object> m = new HashMap<String, Object>();
 | 
	
		
			
				|  |  | +			m.put("useflag", "1");
 | 
	
		
			
				|  |  | +			m.put("mintimegranid", "SHIFT");
 | 
	
		
			
				|  |  | +			List<TRmCalpoint> l = tRmCalpointMapper.selectCalpoints(m);
 | 
	
		
			
				|  |  | +			m.put("mintimegranid", "DAY");
 | 
	
		
			
				|  |  | +			l.addAll(tRmCalpointMapper.selectCalpoints(m));
 | 
	
		
			
				|  |  | +			m.put("mintimegranid", "MONTH");
 | 
	
		
			
				|  |  | +			l.addAll(tRmCalpointMapper.selectCalpoints(m));
 | 
	
		
			
				|  |  | +			// 重新计算月数据,主要修改月累积值
 | 
	
		
			
				|  |  | +			while(startMonth <= endMonth){
 | 
	
		
			
				|  |  | +				String clk = sta.get(Calendar.YEAR) + "-" + startMonth;
 | 
	
		
			
				|  |  | +				if(startMonth < 10){
 | 
	
		
			
				|  |  | +					clk = sta.get(Calendar.YEAR) + "-0" + startMonth;
 | 
	
		
			
				|  |  | +				}
 | 
	
		
			
				|  |  | +				for(TRmCalpoint tRmCalpoint : l){
 | 
	
		
			
				|  |  | +					restatCalData(tRmCalpoint, clk, "MONTH", opuser);
 | 
	
		
			
				|  |  | +				}
 | 
	
		
			
				|  |  | +				startMonth++;
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  | +			// 不是今年,重新计算年数据
 | 
	
		
			
				|  |  | +			if(sta.get(Calendar.YEAR) !=  cal.get(Calendar.YEAR)){
 | 
	
		
			
				|  |  | +				String clk = sta.get(Calendar.YEAR) + "";
 | 
	
		
			
				|  |  | +				for(TRmCalpoint tRmCalpoint : l){
 | 
	
		
			
				|  |  | +					restatCalData(tRmCalpoint, clk, "YEAR", opuser);
 | 
	
		
			
				|  |  | +				}
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  | +		}else if(timegranid.equalsIgnoreCase("YEAR")){
 | 
	
		
			
				|  |  | +			// 只计算最小粒度为年的
 | 
	
		
			
				|  |  | +			// 查询需要统计的计量点信息,最小粒度年的
 | 
	
		
			
				|  |  | +			Map<String, Object> m = new HashMap<String, Object>();
 | 
	
		
			
				|  |  | +			m.put("useflag", "1");
 | 
	
		
			
				|  |  | +			m.put("mintimegranid", "YEAR");
 | 
	
		
			
				|  |  | +			List<TRmCalpoint> l = tRmCalpointMapper.selectCalpoints(m);
 | 
	
		
			
				|  |  | +			for(TRmCalpoint tRmCalpoint : l){
 | 
	
		
			
				|  |  | +				restatCalData(tRmCalpoint, clock, "YEAR", opuser);
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +		return "";
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	@Override
 | 
	
		
			
				|  |  | +	public String restatCalData(TRmCalpoint tRmCalpoint, String clock, String timegranid, String updateUser) {
 | 
	
		
			
				|  |  | +		String res= "";
 | 
	
		
			
				|  |  | +		String mintimegranid = tRmCalpoint.getMintimegranid()==null?"DAY":tRmCalpoint.getMintimegranid(); // 最小时间粒度
 | 
	
		
			
				|  |  | +		String itemtype = tRmCalpoint.getItemtype(); // 类型 AUTO:自动,MANUAL:手抄,VIRTUAL:虚拟
 | 
	
		
			
				|  |  | +		String itemid = tRmCalpoint.getItemid();
 | 
	
		
			
				|  |  | +		String itemname = tRmCalpoint.getItemname();
 | 
	
		
			
				|  |  | +		String energytypeid = tRmCalpoint.getEnergytypeid(); // 能介大类
 | 
	
		
			
				|  |  | +		String tagTable = tRmCalpoint.getTagTable()==null? "" :tRmCalpoint.getTagTable().trim(); // 小时表
 | 
	
		
			
				|  |  | +		String tagCol = tRmCalpoint.getTagCol()==null? "" :tRmCalpoint.getTagCol().trim(); // 小时表字段
 | 
	
		
			
				|  |  | +		String tagBadStr = tRmCalpoint.getTagBadSymbol()==null? "-1" : tRmCalpoint.getTagBadSymbol();
 | 
	
		
			
				|  |  | +		Short digits = tRmCalpoint.getDigits() == null ? 4 : tRmCalpoint.getDigits();
 | 
	
		
			
				|  |  | +		Short digits2 = tRmCalpoint.getMeterScale() == null ? 4 : tRmCalpoint.getMeterScale(); // 准点值精度
 | 
	
		
			
				|  |  | +		Double qc = 0d; // 仪表期初值
 | 
	
		
			
				|  |  | +		Double qm = 0d; // 仪表期末值
 | 
	
		
			
				|  |  | +		Double mod = tRmCalpoint.getTagModulus() == null? 1d : tRmCalpoint.getTagModulus().doubleValue(); // 倍率
 | 
	
		
			
				|  |  | +		Double tagBad = -1d; // 异常点标签(读表异常时候插入的值)
 | 
	
		
			
				|  |  | +		Double maxval = 0d;
 | 
	
		
			
				|  |  | +		Double minval = 0d;
 | 
	
		
			
				|  |  | +		updateUser = updateUser==null || updateUser.isEmpty()?JwtUtil.getUseridByToken():updateUser;
 | 
	
		
			
				|  |  | +		try {
 | 
	
		
			
				|  |  | +			tagBad = Double.parseDouble(tagBadStr);
 | 
	
		
			
				|  |  | +		} catch (NumberFormatException e) {
 | 
	
		
			
				|  |  | +			logger.error("计量点" + itemid + "的tag_bad_symbol值格式应该为负数,当前值为:" + tagBadStr);
 | 
	
		
			
				|  |  | +			tagBad = -1d;
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +		try {
 | 
	
		
			
				|  |  | +			maxval = tRmCalpoint.getMaxVal()==null || tRmCalpoint.getMaxVal().isEmpty()?0:Double.valueOf(tRmCalpoint.getMaxVal());
 | 
	
		
			
				|  |  | +			minval = tRmCalpoint.getMinVal()==null || tRmCalpoint.getMinVal().isEmpty()?0:Double.valueOf(tRmCalpoint.getMinVal());
 | 
	
		
			
				|  |  | +		} catch (NumberFormatException e) {
 | 
	
		
			
				|  |  | +			logger.error("计量点" + itemid + "的最大值最小值格式错误,当前最大值为:" + tRmCalpoint.getMaxVal() + ",最小值为:"+ tRmCalpoint.getMinVal());
 | 
	
		
			
				|  |  | +			maxval = 0d;
 | 
	
		
			
				|  |  | +			minval = 0d;
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +		HashMap<String, Object> id = new HashMap<String, Object>();
 | 
	
		
			
				|  |  | +		id.put("clock", clock);
 | 
	
		
			
				|  |  | +		id.put("timegranid", timegranid);
 | 
	
		
			
				|  |  | +		id.put("itemid", itemid);
 | 
	
		
			
				|  |  | +		String sql = "";
 | 
	
		
			
				|  |  | +		// 如果有人工录入数据,以人工录入数据为准
 | 
	
		
			
				|  |  | +		HashMap<String, Object> cid = new HashMap<String, Object>();
 | 
	
		
			
				|  |  | +		cid.put("clock", clock);
 | 
	
		
			
				|  |  | +		cid.put("itemid", itemid);
 | 
	
		
			
				|  |  | +		EmsCalpointValue ecv = null;
 | 
	
		
			
				|  |  | +		if(tRmCalpoint.getEnergytypeid().equalsIgnoreCase("W") == false) {  //水数据不工步人工值到计量点数据
 | 
	
		
			
				|  |  | +			ecv = emsCalpointValueMapper.selectByPrimaryKey(cid);
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +		// 获取原数据
 | 
	
		
			
				|  |  | +		TRmCalpointValue t = tRmCalpointValueMapper.selectByPrimaryKey(id);
 | 
	
		
			
				|  |  | +		// 自动上传计量点
 | 
	
		
			
				|  |  | +		if(itemtype.equalsIgnoreCase("AUTO")){
 | 
	
		
			
				|  |  | +			if(tagTable.equalsIgnoreCase("MES_EMS_DIESELOIL")){ // 柴油特殊处理,只重新计算年数据
 | 
	
		
			
				|  |  | +				if(!timegranid.equalsIgnoreCase("YEAR")){
 | 
	
		
			
				|  |  | +					mesEmsDieseloilService.reCalData2(clock, tRmCalpoint);
 | 
	
		
			
				|  |  | +					return "";
 | 
	
		
			
				|  |  | +				}else{
 | 
	
		
			
				|  |  | +					BigDecimal acb = BigDecimal.ZERO;// 计算值
 | 
	
		
			
				|  |  | +					// 年计算值等于月最终值之和
 | 
	
		
			
				|  |  | +					sql = "select round(sum(apportvalue), "+digits+") apportvalue "
 | 
	
		
			
				|  |  | +							+ "from T_RM_CALPOINT_VALUE where itemid = ? and timegranid='MONTH' and clock like ?||'%'";
 | 
	
		
			
				|  |  | +					Double actval = jdbcTemplate.queryForObject(sql, new Object[]{itemid,clock}, Double.class);
 | 
	
		
			
				|  |  | +					acb = actval==null?BigDecimal.ZERO:new BigDecimal(Double.toString(actval)).setScale(digits, BigDecimal.ROUND_HALF_UP);
 | 
	
		
			
				|  |  | +					if(t!=null){
 | 
	
		
			
				|  |  | +						t.setActualvalue(acb);
 | 
	
		
			
				|  |  | +						if(t.getCorrectvalue()!=null){
 | 
	
		
			
				|  |  | +							t.setApportvalue(acb.add(t.getCorrectvalue().setScale(digits, BigDecimal.ROUND_HALF_UP)));
 | 
	
		
			
				|  |  | +						}else{
 | 
	
		
			
				|  |  | +							t.setApportvalue(acb);
 | 
	
		
			
				|  |  | +						}
 | 
	
		
			
				|  |  | +						t.setUpman(updateUser);
 | 
	
		
			
				|  |  | +						t.setUptime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
 | 
	
		
			
				|  |  | +						tRmCalpointValueMapper.updateByPrimaryKeySelective(t);
 | 
	
		
			
				|  |  | +					}else{
 | 
	
		
			
				|  |  | +						// 数据不存在,新增
 | 
	
		
			
				|  |  | +						t = new TRmCalpointValue();
 | 
	
		
			
				|  |  | +						t.setActualvalue(acb); // 计算值
 | 
	
		
			
				|  |  | +						t.setClock(clock);
 | 
	
		
			
				|  |  | +						t.setTimegranid(timegranid);
 | 
	
		
			
				|  |  | +						t.setItemid(itemid);
 | 
	
		
			
				|  |  | +						t.setItemname(itemname);
 | 
	
		
			
				|  |  | +						t.setApportvalue(acb); // 最终值
 | 
	
		
			
				|  |  | +						t.setCorrectvalue(BigDecimal.ZERO); // 修正值
 | 
	
		
			
				|  |  | +						t.setCrman(updateUser);
 | 
	
		
			
				|  |  | +						t.setRecTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
 | 
	
		
			
				|  |  | +						tRmCalpointValueMapper.insertSelective(t);
 | 
	
		
			
				|  |  | +					}
 | 
	
		
			
				|  |  | +				}
 | 
	
		
			
				|  |  | +				return res;
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  | +			String qck = ""; // 期初仪表时间点
 | 
	
		
			
				|  |  | +			String qmk = ""; // 期末仪表时间点
 | 
	
		
			
				|  |  | +			if(timegranid.equalsIgnoreCase("SHIFT")){
 | 
	
		
			
				|  |  | +				Date end = new Date();
 | 
	
		
			
				|  |  | +				SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH");
 | 
	
		
			
				|  |  | +				try {
 | 
	
		
			
				|  |  | +					end = sf.parse(clock);
 | 
	
		
			
				|  |  | +				} catch (Exception e) {
 | 
	
		
			
				|  |  | +					return "日期格式错误";
 | 
	
		
			
				|  |  | +				}
 | 
	
		
			
				|  |  | +				qmk = sf.format(end);
 | 
	
		
			
				|  |  | +				Calendar ca = Calendar.getInstance();
 | 
	
		
			
				|  |  | +				ca.setTime(end);
 | 
	
		
			
				|  |  | +				ca.add(Calendar.HOUR_OF_DAY, -8);
 | 
	
		
			
				|  |  | +				qck = sf.format(ca.getTime());
 | 
	
		
			
				|  |  | +			}else if(timegranid.equalsIgnoreCase("DAY")){
 | 
	
		
			
				|  |  | +				// 数据丛1点对一点
 | 
	
		
			
				|  |  | +				qck = clock + " 01";
 | 
	
		
			
				|  |  | +				SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH");
 | 
	
		
			
				|  |  | +				Date end = new Date();
 | 
	
		
			
				|  |  | +				try {
 | 
	
		
			
				|  |  | +					end = sf.parse(qck);
 | 
	
		
			
				|  |  | +				} catch (Exception e) {
 | 
	
		
			
				|  |  | +					return "日期格式错误";
 | 
	
		
			
				|  |  | +				}
 | 
	
		
			
				|  |  | +				Calendar ca = Calendar.getInstance();
 | 
	
		
			
				|  |  | +				ca.setTime(end);
 | 
	
		
			
				|  |  | +				ca.add(Calendar.DAY_OF_YEAR, 1);
 | 
	
		
			
				|  |  | +				qmk = sf.format(ca.getTime());
 | 
	
		
			
				|  |  | +			}else if(timegranid.equalsIgnoreCase("MONTH")){
 | 
	
		
			
				|  |  | +				// 数据丛1点对一点
 | 
	
		
			
				|  |  | +				qck = clock + "-01 01";
 | 
	
		
			
				|  |  | +				SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH");
 | 
	
		
			
				|  |  | +				Date end = new Date();
 | 
	
		
			
				|  |  | +				try {
 | 
	
		
			
				|  |  | +					end = sf.parse(qck);
 | 
	
		
			
				|  |  | +				} catch (Exception e) {
 | 
	
		
			
				|  |  | +					return "日期格式错误";
 | 
	
		
			
				|  |  | +				}
 | 
	
		
			
				|  |  | +				Calendar ca = Calendar.getInstance();
 | 
	
		
			
				|  |  | +				ca.setTime(end);
 | 
	
		
			
				|  |  | +				ca.add(Calendar.MONTH, 1);
 | 
	
		
			
				|  |  | +				qmk = sf.format(ca.getTime());
 | 
	
		
			
				|  |  | +			}else if(timegranid.equalsIgnoreCase("YEAR")){
 | 
	
		
			
				|  |  | +				// 数据丛1点对一点
 | 
	
		
			
				|  |  | +				qck = clock + "-01-01 01";
 | 
	
		
			
				|  |  | +				SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH");
 | 
	
		
			
				|  |  | +				Date end = new Date();
 | 
	
		
			
				|  |  | +				try {
 | 
	
		
			
				|  |  | +					end = sf.parse(qck);
 | 
	
		
			
				|  |  | +				} catch (Exception e) {
 | 
	
		
			
				|  |  | +					return "日期格式错误";
 | 
	
		
			
				|  |  | +				}
 | 
	
		
			
				|  |  | +				Calendar ca = Calendar.getInstance();
 | 
	
		
			
				|  |  | +				ca.setTime(end);
 | 
	
		
			
				|  |  | +				ca.add(Calendar.YEAR, 1);
 | 
	
		
			
				|  |  | +				qmk = sf.format(ca.getTime());
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  | +			BigDecimal acb = BigDecimal.ZERO;// 计算值
 | 
	
		
			
				|  |  | +			BigDecimal qcb = BigDecimal.ZERO;// 期初值
 | 
	
		
			
				|  |  | +			BigDecimal qmb = BigDecimal.ZERO;// 期末值
 | 
	
		
			
				|  |  | +			String bz = ""; // 备注
 | 
	
		
			
				|  |  | +			if(!tagTable.isEmpty() && !tagCol.isEmpty()){
 | 
	
		
			
				|  |  | +				// 获取仪表期初、期末值、计算值
 | 
	
		
			
				|  |  | +				sql = "select nvl(round("+tagCol+", "+digits2+"),0) from "+tagTable + "_ORG where clock = ?";
 | 
	
		
			
				|  |  | +				try {
 | 
	
		
			
				|  |  | +					qc = jdbcTemplate.queryForObject(sql, new Object[]{qck}, Double.class);
 | 
	
		
			
				|  |  | +					if(qc!=null && Math.abs(qc) > Integer.MAX_VALUE){
 | 
	
		
			
				|  |  | +						bz = "仪表期初值异常:" + qc;
 | 
	
		
			
				|  |  | +						qc = tagBad;
 | 
	
		
			
				|  |  | +					}
 | 
	
		
			
				|  |  | +				} catch(DataAccessException e) {
 | 
	
		
			
				|  |  | +					logger.error(qck + "-itemid:" + itemid + " 没有仪表期初值。");
 | 
	
		
			
				|  |  | +					qc = tagBad;
 | 
	
		
			
				|  |  | +				}
 | 
	
		
			
				|  |  | +				try {
 | 
	
		
			
				|  |  | +					qm = jdbcTemplate.queryForObject(sql, new Object[]{qmk}, Double.class);
 | 
	
		
			
				|  |  | +					if(qm!=null && Math.abs(qm) > Integer.MAX_VALUE){
 | 
	
		
			
				|  |  | +						if(bz.length()>0){
 | 
	
		
			
				|  |  | +							bz = bz + ", ";
 | 
	
		
			
				|  |  | +						}
 | 
	
		
			
				|  |  | +						bz += "仪表期末值异常:" + qm;
 | 
	
		
			
				|  |  | +						qm = tagBad;
 | 
	
		
			
				|  |  | +					}
 | 
	
		
			
				|  |  | +				} catch(DataAccessException e) {
 | 
	
		
			
				|  |  | +					res = qmk + "-itemid:" + itemid + " 没有仪表期末值。";
 | 
	
		
			
				|  |  | +					logger.error(qmk + "-itemid:" + itemid + " 没有仪表期末值。");
 | 
	
		
			
				|  |  | +					qm = tagBad;
 | 
	
		
			
				|  |  | +				}
 | 
	
		
			
				|  |  | +				// 计算值由小时表统计
 | 
	
		
			
				|  |  | +				if(mintimegranid.equalsIgnoreCase(timegranid) || timegranid.equalsIgnoreCase("DAY") || timegranid.equalsIgnoreCase("SHIFT")){
 | 
	
		
			
				|  |  | +					if (qm == tagBad || qc == tagBad || qc == 0 || new BigDecimal(Double.toString(qm)).subtract(new BigDecimal(Double.toString(qc))).doubleValue() < 0
 | 
	
		
			
				|  |  | +							|| !energytypeid.equalsIgnoreCase("E")) {
 | 
	
		
			
				|  |  | +						sql = "select nvl(round(sum("+tagCol+")*"+mod+", "+digits+"),0) from "+tagTable+" where clock>=? and clock<?";
 | 
	
		
			
				|  |  | +						// 数据应该是0点到0点,次日0点的数据是今日23点到0点的数据,所以也应该计算在今日数据内.
 | 
	
		
			
				|  |  | +						// 但是今日0点数据是昨日今日23点到0点的数据,所以今日0点不计算在内
 | 
	
		
			
				|  |  | +						//sql = "select nvl(round(sum("+tagCol+")*"+mod+", "+digits+"),0) from "+tagTable+" where clock>? and clock<=?";
 | 
	
		
			
				|  |  | +						Double d = 0d;
 | 
	
		
			
				|  |  | +						try {
 | 
	
		
			
				|  |  | +							d = jdbcTemplate.queryForObject(sql, new Object[]{qck,qmk}, Double.class);
 | 
	
		
			
				|  |  | +							if(d!=null && Math.abs(d) > Integer.MAX_VALUE){
 | 
	
		
			
				|  |  | +								bz = "仪表数值异常:" + d;
 | 
	
		
			
				|  |  | +								d = 0d;
 | 
	
		
			
				|  |  | +							}
 | 
	
		
			
				|  |  | +						}catch(Exception e) {
 | 
	
		
			
				|  |  | +							d = 0d;
 | 
	
		
			
				|  |  | +							e.printStackTrace();
 | 
	
		
			
				|  |  | +							res = clock + ",itemid:" + itemid + " 取值错误, tagTable:" + tagTable + ",tagCol:" + tagCol;
 | 
	
		
			
				|  |  | +							logger.error(clock + ",itemid:" + itemid + " 取值错误, tagTable:" + tagTable + ",tagCol:" + tagCol);
 | 
	
		
			
				|  |  | +						}
 | 
	
		
			
				|  |  | +						acb = d==null?null:new BigDecimal(Double.toString(d));
 | 
	
		
			
				|  |  | +					}else{
 | 
	
		
			
				|  |  | +						// 仪表期末值 - 仪表期初值
 | 
	
		
			
				|  |  | +						acb = new BigDecimal(Double.toString(qm)).subtract(new BigDecimal(Double.toString(qc))).multiply(new BigDecimal(mod)).setScale(digits, BigDecimal.ROUND_HALF_UP);
 | 
	
		
			
				|  |  | +					}
 | 
	
		
			
				|  |  | +				}else{
 | 
	
		
			
				|  |  | +					// 计算值由子时间粒度数据统计
 | 
	
		
			
				|  |  | +					if(timegranid.equalsIgnoreCase("MONTH")){
 | 
	
		
			
				|  |  | +						// 月计算值等于日最终值之和
 | 
	
		
			
				|  |  | +						sql = "select round(sum(apportvalue), "+digits+") apportvalue "
 | 
	
		
			
				|  |  | +								+ "from T_RM_CALPOINT_VALUE where itemid = ? and timegranid='DAY' and clock like ?||'%'";
 | 
	
		
			
				|  |  | +						Double actval = jdbcTemplate.queryForObject(sql, new Object[]{itemid,clock}, Double.class);
 | 
	
		
			
				|  |  | +						acb = actval==null?BigDecimal.ZERO:new BigDecimal(Double.toString(actval)).setScale(digits, BigDecimal.ROUND_HALF_UP);
 | 
	
		
			
				|  |  | +					}else if(timegranid.equalsIgnoreCase("YEAR")){
 | 
	
		
			
				|  |  | +						// 年计算值等于月最终值之和
 | 
	
		
			
				|  |  | +						sql = "select round(sum(apportvalue), "+digits+") apportvalue "
 | 
	
		
			
				|  |  | +								+ "from T_RM_CALPOINT_VALUE where itemid = ? and timegranid='MONTH' and clock like ?||'%'";
 | 
	
		
			
				|  |  | +						Double actval = jdbcTemplate.queryForObject(sql, new Object[]{itemid,clock}, Double.class);
 | 
	
		
			
				|  |  | +						acb = actval==null?BigDecimal.ZERO:new BigDecimal(Double.toString(actval)).setScale(digits, BigDecimal.ROUND_HALF_UP);
 | 
	
		
			
				|  |  | +					}
 | 
	
		
			
				|  |  | +				}
 | 
	
		
			
				|  |  | +			}else{
 | 
	
		
			
				|  |  | +				res = "计量点的数据表与数据列信息不完整!itemid:"+itemid;
 | 
	
		
			
				|  |  | +				logger.error("计量点的数据表与数据列信息不完整!itemid:"+itemid);
 | 
	
		
			
				|  |  | +				bz = "-1:请配置数据表与数据列";
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  | +			// 期初与期末
 | 
	
		
			
				|  |  | +			qcb = qc==null?null:new BigDecimal(Double.toString(qc));
 | 
	
		
			
				|  |  | +			qmb = qm==null?null:new BigDecimal(Double.toString(qm));
 | 
	
		
			
				|  |  | +			if (t != null) {
 | 
	
		
			
				|  |  | +				t.setMintvalue(qcb);
 | 
	
		
			
				|  |  | +				t.setMendvalue(qmb);
 | 
	
		
			
				|  |  | +				t.setBz(bz);
 | 
	
		
			
				|  |  | +				t.setActualvalue(acb);
 | 
	
		
			
				|  |  | +				// 最终值=计算值+修正值
 | 
	
		
			
				|  |  | +				if (acb != null && t.getCorrectvalue() != null) {
 | 
	
		
			
				|  |  | +					t.setApportvalue(acb.add(t.getCorrectvalue()));
 | 
	
		
			
				|  |  | +				} else if (acb != null) {
 | 
	
		
			
				|  |  | +					t.setApportvalue(acb);
 | 
	
		
			
				|  |  | +				} else if (t.getCorrectvalue() != null) {
 | 
	
		
			
				|  |  | +					t.setApportvalue(t.getCorrectvalue());
 | 
	
		
			
				|  |  | +				} else {
 | 
	
		
			
				|  |  | +					t.setApportvalue(BigDecimal.ZERO);
 | 
	
		
			
				|  |  | +				}
 | 
	
		
			
				|  |  | +				if(ecv!=null && ecv.getApportvalue()!=null){
 | 
	
		
			
				|  |  | +					t.setBz(ecv.getBz()!=null?ecv.getBz():"人工录入,自动修改");
 | 
	
		
			
				|  |  | +					t.setApportvalue(ecv.getApportvalue().setScale(digits, BigDecimal.ROUND_HALF_UP));
 | 
	
		
			
				|  |  | +					t.setCorrectvalue(t.getApportvalue().subtract(t.getActualvalue()==null?BigDecimal.ZERO:t.getActualvalue()));
 | 
	
		
			
				|  |  | +				}
 | 
	
		
			
				|  |  | +				t.setUpman(updateUser);
 | 
	
		
			
				|  |  | +				t.setUptime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
 | 
	
		
			
				|  |  | +				//八万煤气柜柜容重写
 | 
	
		
			
				|  |  | +				if(t.getItemid().equalsIgnoreCase("DL421P00770002")&&t.getTimegranid().equalsIgnoreCase("DAY")){
 | 
	
		
			
				|  |  | +					t.setMintvalue(BigDecimal.ZERO);
 | 
	
		
			
				|  |  | +					t.setActualvalue(qmb);
 | 
	
		
			
				|  |  | +				    t.setApportvalue(qmb);
 | 
	
		
			
				|  |  | +				}
 | 
	
		
			
				|  |  | +				tRmCalpointValueMapper.updateByPrimaryKeySelective(t);
 | 
	
		
			
				|  |  | +			} else {
 | 
	
		
			
				|  |  | +				// 数据不存在,新增
 | 
	
		
			
				|  |  | +				t = new TRmCalpointValue();
 | 
	
		
			
				|  |  | +				t.setMintvalue(qcb);
 | 
	
		
			
				|  |  | +				t.setMendvalue(qmb);
 | 
	
		
			
				|  |  | +				t.setBz(bz);
 | 
	
		
			
				|  |  | +				t.setActualvalue(acb); // 计算值
 | 
	
		
			
				|  |  | +				t.setCorrectvalue(BigDecimal.ZERO); // 修正值
 | 
	
		
			
				|  |  | +				t.setApportvalue(acb); // 最终值
 | 
	
		
			
				|  |  | +				if(ecv!=null && ecv.getApportvalue()!=null){
 | 
	
		
			
				|  |  | +					t.setBz(ecv.getBz()!=null?ecv.getBz():"人工录入,自动修改");
 | 
	
		
			
				|  |  | +					t.setApportvalue(ecv.getApportvalue().setScale(digits, BigDecimal.ROUND_HALF_UP));
 | 
	
		
			
				|  |  | +					t.setCorrectvalue(t.getApportvalue().subtract(t.getActualvalue()==null?BigDecimal.ZERO:t.getActualvalue()));
 | 
	
		
			
				|  |  | +				}
 | 
	
		
			
				|  |  | +				t.setClock(clock);
 | 
	
		
			
				|  |  | +				t.setTimegranid(timegranid);
 | 
	
		
			
				|  |  | +				t.setItemid(itemid);
 | 
	
		
			
				|  |  | +				t.setItemname(itemname);
 | 
	
		
			
				|  |  | +				t.setCrman(updateUser);
 | 
	
		
			
				|  |  | +				t.setRecTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
 | 
	
		
			
				|  |  | +				//八万煤气柜柜容重写
 | 
	
		
			
				|  |  | +				if(t.getItemid().equalsIgnoreCase("DL421P00770002")&&t.getTimegranid().equalsIgnoreCase("DAY")){
 | 
	
		
			
				|  |  | +                    t.setMintvalue(BigDecimal.ZERO);
 | 
	
		
			
				|  |  | +                    t.setActualvalue(qmb);
 | 
	
		
			
				|  |  | +				    t.setApportvalue(qmb);
 | 
	
		
			
				|  |  | +				}
 | 
	
		
			
				|  |  | +				tRmCalpointValueMapper.insertSelective(t);
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  | +			// 超标异常记录,当前只记录日数据,且最大最小值不都为0的计量点
 | 
	
		
			
				|  |  | +			if (timegranid.equalsIgnoreCase("DAY") && (maxval+minval>0) && (t.getApportvalue().doubleValue()>maxval || t.getApportvalue().doubleValue()<minval)) {
 | 
	
		
			
				|  |  | +				TRmCalpointExValue cev = new TRmCalpointExValue();
 | 
	
		
			
				|  |  | +				cev.setApportvalue(t.getApportvalue());
 | 
	
		
			
				|  |  | +				cev.setMaxvalue(new BigDecimal(Double.toString(maxval)));
 | 
	
		
			
				|  |  | +				cev.setMinvalue(new BigDecimal(Double.toString(minval)));
 | 
	
		
			
				|  |  | +				cev.setClock(clock);
 | 
	
		
			
				|  |  | +				cev.setItemid(itemid);
 | 
	
		
			
				|  |  | +				cev.setCreatetime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
 | 
	
		
			
				|  |  | +				cev.setExtype("0");
 | 
	
		
			
				|  |  | +				tRmCalpointExValueService.add(cev);
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  | +		}else if(itemtype.equalsIgnoreCase("MANUAL")){// 手动
 | 
	
		
			
				|  |  | +			BigDecimal acb = BigDecimal.ZERO;// 计算值
 | 
	
		
			
				|  |  | +			// 手抄数据计算值获取,非基础数据用粒度累加,已有的基础数据用基础数据。
 | 
	
		
			
				|  |  | +			if(!mintimegranid.equalsIgnoreCase(timegranid)){
 | 
	
		
			
				|  |  | +				// 计算值由子时间粒度数据统计
 | 
	
		
			
				|  |  | +				if(timegranid.equalsIgnoreCase("MONTH")){
 | 
	
		
			
				|  |  | +					// 月计算值等于日最终值之和
 | 
	
		
			
				|  |  | +					HashMap<String, Object> maps = new HashMap<>();
 | 
	
		
			
				|  |  | +			        maps.put("itemid", itemid);
 | 
	
		
			
				|  |  | +			        maps.put("clock", clock);
 | 
	
		
			
				|  |  | +			        maps.put("timegranid", "DAY");
 | 
	
		
			
				|  |  | +					acb = new BigDecimal(Double.toString(this.getSumvalue(maps))).setScale(digits, BigDecimal.ROUND_HALF_UP);
 | 
	
		
			
				|  |  | +				}else if(timegranid.equalsIgnoreCase("YEAR")){
 | 
	
		
			
				|  |  | +					// 年计算值等于月最终值之和
 | 
	
		
			
				|  |  | +					HashMap<String, Object> maps = new HashMap<>();
 | 
	
		
			
				|  |  | +			        maps.put("itemid", itemid);
 | 
	
		
			
				|  |  | +			        maps.put("clock", clock);
 | 
	
		
			
				|  |  | +			        maps.put("timegranid", "MONTH");
 | 
	
		
			
				|  |  | +			        acb = new BigDecimal(Double.toString(this.getSumvalue(maps))).setScale(digits, BigDecimal.ROUND_HALF_UP);
 | 
	
		
			
				|  |  | +				}
 | 
	
		
			
				|  |  | +			}else{
 | 
	
		
			
				|  |  | +				if(t!= null){
 | 
	
		
			
				|  |  | +					acb = t.getActualvalue();
 | 
	
		
			
				|  |  | +				}
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  | +			if (t!= null) {
 | 
	
		
			
				|  |  | +				t.setActualvalue(acb);
 | 
	
		
			
				|  |  | +				// 最终值=计算值+修正值
 | 
	
		
			
				|  |  | +				if (t.getCorrectvalue() != null) {
 | 
	
		
			
				|  |  | +					t.setApportvalue(acb.add(t.getCorrectvalue()).setScale(digits, BigDecimal.ROUND_HALF_UP));
 | 
	
		
			
				|  |  | +				} else {
 | 
	
		
			
				|  |  | +					t.setApportvalue(acb.setScale(digits, BigDecimal.ROUND_HALF_UP));
 | 
	
		
			
				|  |  | +				}
 | 
	
		
			
				|  |  | +				// 外挂数据更新
 | 
	
		
			
				|  |  | +				if(ecv!=null && ecv.getApportvalue()!=null){
 | 
	
		
			
				|  |  | +					t.setBz(ecv.getBz()!=null?ecv.getBz():"人工录入,自动修改");
 | 
	
		
			
				|  |  | +					t.setApportvalue(ecv.getApportvalue().setScale(digits, BigDecimal.ROUND_HALF_UP));
 | 
	
		
			
				|  |  | +					t.setCorrectvalue(t.getApportvalue().subtract(t.getActualvalue()==null?BigDecimal.ZERO:t.getActualvalue()));
 | 
	
		
			
				|  |  | +				}
 | 
	
		
			
				|  |  | +				t.setUpman(updateUser);
 | 
	
		
			
				|  |  | +				t.setUptime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
 | 
	
		
			
				|  |  | +				tRmCalpointValueMapper.updateByPrimaryKeySelective(t);
 | 
	
		
			
				|  |  | +			}else{
 | 
	
		
			
				|  |  | +				// 数据不存在,新增
 | 
	
		
			
				|  |  | +				t = new TRmCalpointValue();
 | 
	
		
			
				|  |  | +				t.setClock(clock);
 | 
	
		
			
				|  |  | +				t.setTimegranid(timegranid);
 | 
	
		
			
				|  |  | +				t.setItemid(itemid);
 | 
	
		
			
				|  |  | +				t.setItemname(itemname);
 | 
	
		
			
				|  |  | +				t.setCorrectvalue(BigDecimal.ZERO); // 修正值
 | 
	
		
			
				|  |  | +				t.setActualvalue(acb); // 计算值
 | 
	
		
			
				|  |  | +				t.setCorrectvalue(BigDecimal.ZERO); // 修正值
 | 
	
		
			
				|  |  | +				t.setApportvalue(acb.setScale(digits, BigDecimal.ROUND_HALF_UP)); // 最终值
 | 
	
		
			
				|  |  | +				if(ecv!=null && ecv.getApportvalue()!=null){
 | 
	
		
			
				|  |  | +					t.setBz(ecv.getBz()!=null?ecv.getBz():"人工录入,自动修改");
 | 
	
		
			
				|  |  | +					t.setApportvalue(ecv.getApportvalue().setScale(digits, BigDecimal.ROUND_HALF_UP));
 | 
	
		
			
				|  |  | +					t.setCorrectvalue(t.getApportvalue().subtract(t.getActualvalue()==null?BigDecimal.ZERO:t.getActualvalue()));
 | 
	
		
			
				|  |  | +				}
 | 
	
		
			
				|  |  | +				t.setCrman(updateUser);
 | 
	
		
			
				|  |  | +				t.setRecTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
 | 
	
		
			
				|  |  | +				tRmCalpointValueMapper.insertSelective(t);
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  | +		}else if(itemtype.equalsIgnoreCase("VIRTUAL")){// 虚拟
 | 
	
		
			
				|  |  | +			BigDecimal acb = BigDecimal.ZERO;// 计算值
 | 
	
		
			
				|  |  | +			try {
 | 
	
		
			
				|  |  | +				if(!mintimegranid.equalsIgnoreCase(timegranid)){
 | 
	
		
			
				|  |  | +					// 计算值由子时间粒度数据统计
 | 
	
		
			
				|  |  | +					if(timegranid.equalsIgnoreCase("MONTH")){
 | 
	
		
			
				|  |  | +						// 月计算值等于日最终值之和
 | 
	
		
			
				|  |  | +						sql = "select round(sum(apportvalue), "+digits+") apportvalue "
 | 
	
		
			
				|  |  | +								+ "from T_RM_CALPOINT_VALUE where itemid = ? and timegranid='DAY' and clock like ?||'%'";
 | 
	
		
			
				|  |  | +						Double actval = jdbcTemplate.queryForObject(sql, new Object[]{itemid,clock}, Double.class);
 | 
	
		
			
				|  |  | +						acb = actval==null?BigDecimal.ZERO:new BigDecimal(Double.toString(actval)).setScale(digits, BigDecimal.ROUND_HALF_UP);
 | 
	
		
			
				|  |  | +					}else if(timegranid.equalsIgnoreCase("YEAR")){
 | 
	
		
			
				|  |  | +						// 年计算值等于月最终值之和
 | 
	
		
			
				|  |  | +						sql = "select round(sum(apportvalue), "+digits+") apportvalue "
 | 
	
		
			
				|  |  | +								+ "from T_RM_CALPOINT_VALUE where itemid = ? and timegranid='MONTH' and clock like ?||'%'";
 | 
	
		
			
				|  |  | +						Double actval = jdbcTemplate.queryForObject(sql, new Object[]{itemid,clock}, Double.class);
 | 
	
		
			
				|  |  | +						acb = actval==null?BigDecimal.ZERO:new BigDecimal(Double.toString(actval)).setScale(digits, BigDecimal.ROUND_HALF_UP);
 | 
	
		
			
				|  |  | +					}
 | 
	
		
			
				|  |  | +				} else{
 | 
	
		
			
				|  |  | +					// 获得计算公式
 | 
	
		
			
				|  |  | +					String formula = formulaService.getFormula(itemid,clock);
 | 
	
		
			
				|  |  | +					// 根据公式获取计算值,不会为null,负数为错误信息
 | 
	
		
			
				|  |  | +					Double dval = formulaService.getValByFormula(formula, timegranid, clock, digits, 0);
 | 
	
		
			
				|  |  | +					if(dval == null || dval < 0){
 | 
	
		
			
				|  |  | +						res = clock + "-itemid:" + itemid + " 计算公式错误。";
 | 
	
		
			
				|  |  | +						logger.error(clock + "-itemid:" + itemid + " 计算公式错误。");
 | 
	
		
			
				|  |  | +					}
 | 
	
		
			
				|  |  | +					acb = new BigDecimal(Double.toString(dval));
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +					//根据跳变范围上下随机浮动并取整
 | 
	
		
			
				|  |  | +					if(tRmCalpoint!=null && tRmCalpoint.getCalcMod()!=null && "FLOAT".equals(tRmCalpoint.getCalcMod())){
 | 
	
		
			
				|  |  | +						if(tRmCalpoint.getRangeVal()!=null){
 | 
	
		
			
				|  |  | +							int max = new BigDecimal(dval).divide(tRmCalpoint.getRangeVal(),0,BigDecimal.ROUND_HALF_UP).intValue();
 | 
	
		
			
				|  |  | +							int min = new BigDecimal(dval).multiply(tRmCalpoint.getRangeVal()).setScale(1,BigDecimal.ROUND_HALF_UP).intValue();
 | 
	
		
			
				|  |  | +							//求差
 | 
	
		
			
				|  |  | +							int mid = max - min;
 | 
	
		
			
				|  |  | +							//产生随机数
 | 
	
		
			
				|  |  | +							acb = new BigDecimal(Math.random() * (mid + 1) + min).setScale(digits,BigDecimal.ROUND_HALF_UP);
 | 
	
		
			
				|  |  | +						}
 | 
	
		
			
				|  |  | +					}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +				}
 | 
	
		
			
				|  |  | +				if(t!=null){
 | 
	
		
			
				|  |  | +					t.setActualvalue(acb);
 | 
	
		
			
				|  |  | +					// 最终值=计算值+修正值
 | 
	
		
			
				|  |  | +					if (t.getCorrectvalue() != null) {
 | 
	
		
			
				|  |  | +						t.setApportvalue(acb.add(t.getCorrectvalue()).setScale(digits, BigDecimal.ROUND_HALF_UP));
 | 
	
		
			
				|  |  | +					} else {
 | 
	
		
			
				|  |  | +						t.setApportvalue(acb.setScale(digits, BigDecimal.ROUND_HALF_UP));
 | 
	
		
			
				|  |  | +					}
 | 
	
		
			
				|  |  | +					if(ecv!=null && ecv.getApportvalue()!=null){
 | 
	
		
			
				|  |  | +						t.setBz(ecv.getBz()!=null?ecv.getBz():"人工录入,自动修改");
 | 
	
		
			
				|  |  | +						t.setApportvalue(ecv.getApportvalue().setScale(digits, BigDecimal.ROUND_HALF_UP));
 | 
	
		
			
				|  |  | +						t.setCorrectvalue(t.getApportvalue().subtract(t.getActualvalue()==null?BigDecimal.ZERO:t.getActualvalue()));
 | 
	
		
			
				|  |  | +					}
 | 
	
		
			
				|  |  | +					t.setUpman(updateUser);
 | 
	
		
			
				|  |  | +					t.setUptime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
 | 
	
		
			
				|  |  | +					tRmCalpointValueMapper.updateByPrimaryKeySelective(t);
 | 
	
		
			
				|  |  | +				}else{
 | 
	
		
			
				|  |  | +					t = new TRmCalpointValue();
 | 
	
		
			
				|  |  | +					t.setClock(clock);
 | 
	
		
			
				|  |  | +					t.setTimegranid(timegranid);
 | 
	
		
			
				|  |  | +					t.setItemid(itemid);
 | 
	
		
			
				|  |  | +					t.setItemname(itemname);
 | 
	
		
			
				|  |  | +					t.setApportvalue(acb); // 最终值
 | 
	
		
			
				|  |  | +					t.setCorrectvalue(BigDecimal.ZERO); // 修正值
 | 
	
		
			
				|  |  | +					t.setActualvalue(acb); // 计算值
 | 
	
		
			
				|  |  | +					if(ecv!=null && ecv.getApportvalue()!=null){
 | 
	
		
			
				|  |  | +						t.setBz(ecv.getBz()!=null?ecv.getBz():"人工录入,自动修改");
 | 
	
		
			
				|  |  | +						t.setApportvalue(ecv.getApportvalue().setScale(digits, BigDecimal.ROUND_HALF_UP));
 | 
	
		
			
				|  |  | +						t.setCorrectvalue(t.getApportvalue().subtract(t.getActualvalue()==null?BigDecimal.ZERO:t.getActualvalue()));
 | 
	
		
			
				|  |  | +					}
 | 
	
		
			
				|  |  | +					t.setCrman(updateUser);
 | 
	
		
			
				|  |  | +					t.setRecTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
 | 
	
		
			
				|  |  | +					tRmCalpointValueMapper.insertSelective(t);
 | 
	
		
			
				|  |  | +				}
 | 
	
		
			
				|  |  | +			} catch (Exception e) {
 | 
	
		
			
				|  |  | +				res = "虚拟计算错误:itemid-" + itemid + ",clock-" + clock;
 | 
	
		
			
				|  |  | +				logger.error("虚拟计算错误:itemid-" + itemid + ",clock-" + clock);
 | 
	
		
			
				|  |  | +				e.printStackTrace();
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +		return res;
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	@Override
 | 
	
		
			
				|  |  | +	public List<Map<String, Object>> getCalpointValue(HashMap<String, Object> parmas) {
 | 
	
		
			
				|  |  | +		List<Map<String, Object>> l = new ArrayList<Map<String, Object>>();
 | 
	
		
			
				|  |  | +		String[] ids = parmas.get("ids").toString().split(",");
 | 
	
		
			
				|  |  | +		String start = parmas.get("start").toString();
 | 
	
		
			
				|  |  | +		String end = parmas.get("end").toString();
 | 
	
		
			
				|  |  | +		// 期初时间
 | 
	
		
			
				|  |  | +		String qc_clk = "";
 | 
	
		
			
				|  |  | +		// 期末时间
 | 
	
		
			
				|  |  | +		String qm_clk = "";
 | 
	
		
			
				|  |  | +		// 期末时间处理,如果是今天之前,期末为第二天0点,比如1月27日期末时间为1月28日0点.
 | 
	
		
			
				|  |  | +		String qm_clk2 = "";
 | 
	
		
			
				|  |  | +		try {
 | 
	
		
			
				|  |  | +			qc_clk = new SimpleDateFormat("yyyy-MM-dd").format(new SimpleDateFormat("yyyy-MM-dd").parse(start));
 | 
	
		
			
				|  |  | +			qm_clk = new SimpleDateFormat("yyyy-MM-dd").format(new SimpleDateFormat("yyyy-MM-dd").parse(end));
 | 
	
		
			
				|  |  | +			Calendar calendar = Calendar.getInstance();
 | 
	
		
			
				|  |  | +			calendar.setTime(new SimpleDateFormat("yyyy-MM-dd").parse(end));
 | 
	
		
			
				|  |  | +			calendar.add(Calendar.DAY_OF_YEAR, 1);
 | 
	
		
			
				|  |  | +			qm_clk2 = new SimpleDateFormat("yyyy-MM-dd").format(calendar.getTime());
 | 
	
		
			
				|  |  | +		} catch (ParseException e1) {
 | 
	
		
			
				|  |  | +			e1.printStackTrace();
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +		for(int i=0;i<ids.length;i++){
 | 
	
		
			
				|  |  | +			String itemid = ids[i];
 | 
	
		
			
				|  |  | +			String ten = "1";
 | 
	
		
			
				|  |  | +			TRmCalpoint tRmCalpoint = tRmCalpointMapper.selectByPrimaryKey(itemid);
 | 
	
		
			
				|  |  | +			String energytypeid = tRmCalpoint.getEnergytypeid(); // 能介大类
 | 
	
		
			
				|  |  | +			String tagTable = tRmCalpoint.getTagTable(); // 小时表
 | 
	
		
			
				|  |  | +			String tagCol = tRmCalpoint.getTagCol(); // 小时表字段
 | 
	
		
			
				|  |  | +			Double mod = tRmCalpoint.getTagModulus() == null? 1d : tRmCalpoint.getTagModulus().doubleValue(); // 倍率
 | 
	
		
			
				|  |  | +			Short digits = tRmCalpoint.getDigits() == null ? 4 : tRmCalpoint.getDigits();
 | 
	
		
			
				|  |  | +			Short digits2 = tRmCalpoint.getMeterScale() == null ? 4 : tRmCalpoint.getMeterScale(); // 准点值精度
 | 
	
		
			
				|  |  | +			Double tagBad = -1d; // 异常点标签(读表异常时候插入的值)
 | 
	
		
			
				|  |  | +			Double qc = 0d; // 仪表期初值
 | 
	
		
			
				|  |  | +			Double qc2 = 0d; // 当日仪表期初值
 | 
	
		
			
				|  |  | +			Double qm = 0d; // 仪表期末值
 | 
	
		
			
				|  |  | +			// 获取仪表期初、期末值
 | 
	
		
			
				|  |  | +			String sqlqc = "select nvl(round("+tagCol+", "+digits2+"),0) from "+tagTable + "_ORG where clock = ?";
 | 
	
		
			
				|  |  | +			String sql2 = "select qm from (select nvl(round("+tagCol+", "+digits2+"),0) qm from "+tagTable + "_ORG where clock>= ? and clock<= ? order by clock desc) where rownum=1";
 | 
	
		
			
				|  |  | +			if(tagTable != null && tagCol!=null && !tagTable.trim().isEmpty() && !tagCol.trim().isEmpty()){
 | 
	
		
			
				|  |  | +				try {
 | 
	
		
			
				|  |  | +					// 数据丛1点对一点
 | 
	
		
			
				|  |  | +					qc = jdbcTemplate.queryForObject(sqlqc, new Object[]{qc_clk + " 01"}, Double.class);
 | 
	
		
			
				|  |  | +					if(qc!=null && Math.abs(qc) > Integer.MAX_VALUE){
 | 
	
		
			
				|  |  | +						logger.error("仪表数值异常:" + qc);
 | 
	
		
			
				|  |  | +						qc = 0d;
 | 
	
		
			
				|  |  | +					}
 | 
	
		
			
				|  |  | +				} catch(DataAccessException e) {
 | 
	
		
			
				|  |  | +					logger.error(qc_clk + "-itemid:" + itemid + " 没有仪表期初值。");
 | 
	
		
			
				|  |  | +					qc = tagBad;
 | 
	
		
			
				|  |  | +				}
 | 
	
		
			
				|  |  | +				try {
 | 
	
		
			
				|  |  | +					// 数据丛1点对一点
 | 
	
		
			
				|  |  | +					qm = jdbcTemplate.queryForObject(sql2, new Object[]{qm_clk + " 01", qm_clk2 + " 01"}, Double.class);
 | 
	
		
			
				|  |  | +					if(qm!=null && Math.abs(qm) > Integer.MAX_VALUE){
 | 
	
		
			
				|  |  | +						logger.error("仪表数值异常:" + qm);
 | 
	
		
			
				|  |  | +						qm = 0d;
 | 
	
		
			
				|  |  | +					}
 | 
	
		
			
				|  |  | +				} catch(DataAccessException e) {
 | 
	
		
			
				|  |  | +					logger.error(qm_clk + "-itemid:" + itemid + " 没有仪表期末值。");
 | 
	
		
			
				|  |  | +					qm = tagBad;
 | 
	
		
			
				|  |  | +				}
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  | +			Double ap = 0d; // 计算值
 | 
	
		
			
				|  |  | +			Double ap1 = 0d; // 计算值,当日
 | 
	
		
			
				|  |  | +			// 今日之前的数据
 | 
	
		
			
				|  |  | +			String sql3 = "select nvl(round(sum(apportvalue), "+digits2+"),0) from T_RM_CALPOINT_VALUE where timegranid='DAY' and itemid=? and clock>=? and clock<?";
 | 
	
		
			
				|  |  | +			// 今日数据额外计算
 | 
	
		
			
				|  |  | +			if(end.equals(new SimpleDateFormat("yyyy-MM-dd").format(new Date()))){
 | 
	
		
			
				|  |  | +				// 今日之前的计算值
 | 
	
		
			
				|  |  | +				try {
 | 
	
		
			
				|  |  | +					ap = jdbcTemplate.queryForObject(sql3, new Object[]{itemid, start, end}, Double.class);
 | 
	
		
			
				|  |  | +					if(ap!=null && Math.abs(ap) > Integer.MAX_VALUE){
 | 
	
		
			
				|  |  | +						logger.error("仪表数值异常:" + ap);
 | 
	
		
			
				|  |  | +						ap = 0d;
 | 
	
		
			
				|  |  | +					}
 | 
	
		
			
				|  |  | +				} catch(DataAccessException e) {
 | 
	
		
			
				|  |  | +					ap = tagBad;
 | 
	
		
			
				|  |  | +				}
 | 
	
		
			
				|  |  | +				// 当日期初
 | 
	
		
			
				|  |  | +				try {
 | 
	
		
			
				|  |  | +					// 数据丛1点对一点
 | 
	
		
			
				|  |  | +					qc2 = jdbcTemplate.queryForObject(sqlqc, new Object[]{end + " 01"}, Double.class);
 | 
	
		
			
				|  |  | +					if(qc2!=null && Math.abs(qc2) > Integer.MAX_VALUE){
 | 
	
		
			
				|  |  | +						qc2 = 0d;
 | 
	
		
			
				|  |  | +					}
 | 
	
		
			
				|  |  | +				} catch(DataAccessException e) {
 | 
	
		
			
				|  |  | +					qc2 = tagBad;
 | 
	
		
			
				|  |  | +				}
 | 
	
		
			
				|  |  | +				// 查询计量点十分钟表配置信息
 | 
	
		
			
				|  |  | +				CordasConfiguration c = cordasConfigurationMapper.selectByPrimaryKey(itemid);
 | 
	
		
			
				|  |  | +				if(c!=null && c.getTimingtable()!=null && !c.getTimingtable().isEmpty() && c.getTimingcolum()!=null){
 | 
	
		
			
				|  |  | +					String timingtable = c.getTimingtable();
 | 
	
		
			
				|  |  | +					String timingcolum = c.getTimingcolum();
 | 
	
		
			
				|  |  | +					String sqlqm = "select qm from (select nvl(round("+timingcolum+", "+digits2+"),0) qm from "+timingtable + " where to_char(tim, 'YYYY-MM-DD')=? order by tim desc) where rownum=1";
 | 
	
		
			
				|  |  | +					try {
 | 
	
		
			
				|  |  | +						qm = jdbcTemplate.queryForObject(sqlqm, new Object[]{end}, Double.class);
 | 
	
		
			
				|  |  | +						if(qm!=null && Math.abs(qm) > Integer.MAX_VALUE){
 | 
	
		
			
				|  |  | +							logger.error("仪表数值异常:" + qm);
 | 
	
		
			
				|  |  | +							qm = 0d;
 | 
	
		
			
				|  |  | +						}
 | 
	
		
			
				|  |  | +					} catch(DataAccessException e) {
 | 
	
		
			
				|  |  | +						logger.error(end + "-itemid:" + itemid + " 没有十分钟仪表期末值。");
 | 
	
		
			
				|  |  | +						qm = tagBad;
 | 
	
		
			
				|  |  | +					}
 | 
	
		
			
				|  |  | +					// 有清零数据计算值用小时值累加 + 十分钟累加,其他期初期末数据正常用期末-期初
 | 
	
		
			
				|  |  | +					if(qm == tagBad || qc2 == tagBad || qc2 == 0d || new BigDecimal(Double.toString(qm)).subtract(new BigDecimal(Double.toString(qc2))).doubleValue()<0
 | 
	
		
			
				|  |  | +							|| !energytypeid.equalsIgnoreCase("E")){
 | 
	
		
			
				|  |  | +						// 获取最后1小时的时间clock
 | 
	
		
			
				|  |  | +						String sh = "select clock from (select clock from "+tagTable+" where substr(clock,0,10)=? order by clock desc) where rownum=1";
 | 
	
		
			
				|  |  | +						String clk = jdbcTemplate.queryForObject(sh, new Object[]{end}, String.class);
 | 
	
		
			
				|  |  | +						// 小时数据累加
 | 
	
		
			
				|  |  | +						String sql = "select nvl(round(sum("+tagCol+")*"+mod+", "+digits+"),0) from "+tagTable+" where substr(clock,0,10) = ?";
 | 
	
		
			
				|  |  | +						try {
 | 
	
		
			
				|  |  | +							ap1 = jdbcTemplate.queryForObject(sql, new Object[]{end}, Double.class);
 | 
	
		
			
				|  |  | +							if(ap1!=null && Math.abs(ap1) > Integer.MAX_VALUE){
 | 
	
		
			
				|  |  | +								ap1 = 0d;
 | 
	
		
			
				|  |  | +							}
 | 
	
		
			
				|  |  | +						}catch(Exception e) {
 | 
	
		
			
				|  |  | +							ap1 = 0d;
 | 
	
		
			
				|  |  | +						}
 | 
	
		
			
				|  |  | +						// 计算10分钟数据,累加
 | 
	
		
			
				|  |  | +						String sql10 = "select nvl("+timingcolum+",0) zj,case when lag("+timingcolum+") over(order by tim) is null then 0 "
 | 
	
		
			
				|  |  | +								+ "else ("+timingcolum+" - lag("+timingcolum+") over(order by tim)) end jj "
 | 
	
		
			
				|  |  | +								+ "from "+timingtable+" where to_char(tim, 'YYYY-MM-DD hh24')>? order by tim";
 | 
	
		
			
				|  |  | +						List lt = jdbcTemplate.queryForList(sql10, new Object[]{clk});
 | 
	
		
			
				|  |  | +						Double ap3 = 0d; // 10分钟累计值
 | 
	
		
			
				|  |  | +						if(lt!=null && lt.size()>0){
 | 
	
		
			
				|  |  | +							for(int j=0; j<lt.size();j++){
 | 
	
		
			
				|  |  | +								Map mt = (Map)lt.get(j);
 | 
	
		
			
				|  |  | +								Double zj = Double.valueOf(mt.get("ZJ").toString());
 | 
	
		
			
				|  |  | +								Double jj = Double.valueOf(mt.get("JJ").toString());
 | 
	
		
			
				|  |  | +								if(jj >= 0){
 | 
	
		
			
				|  |  | +									ap3 = new BigDecimal(Double.toString(ap3)).add(new BigDecimal(Double.toString(jj))).doubleValue();
 | 
	
		
			
				|  |  | +								}else{
 | 
	
		
			
				|  |  | +									logger.error(clk + "-表:" + timingtable +"-列:" + timingcolum + " 读表累计值变小。");
 | 
	
		
			
				|  |  | +									ap3 = new BigDecimal(Double.toString(ap3)).add(new BigDecimal(Double.toString(zj))).doubleValue();
 | 
	
		
			
				|  |  | +								}
 | 
	
		
			
				|  |  | +							}
 | 
	
		
			
				|  |  | +						}
 | 
	
		
			
				|  |  | +						ap3 = new BigDecimal(Double.toString(ap3)).multiply(new BigDecimal(mod)).setScale(digits, BigDecimal.ROUND_HALF_UP).doubleValue();
 | 
	
		
			
				|  |  | +						ap1 = new BigDecimal(Double.toString(ap1)).add(new BigDecimal(Double.toString(ap3))).setScale(digits, BigDecimal.ROUND_HALF_UP).doubleValue();
 | 
	
		
			
				|  |  | +					}else{
 | 
	
		
			
				|  |  | +						// 仪表期末值 - 仪表期初值
 | 
	
		
			
				|  |  | +						ap1 = new BigDecimal(Double.toString(qm)).subtract(new BigDecimal(Double.toString(qc2))).multiply(new BigDecimal(mod)).setScale(digits, BigDecimal.ROUND_HALF_UP).doubleValue();
 | 
	
		
			
				|  |  | +					}
 | 
	
		
			
				|  |  | +				}else{
 | 
	
		
			
				|  |  | +					ten = "0";
 | 
	
		
			
				|  |  | +					// 有清零数据计算值用小时值累加,其他期初期末数据正常用期末-期初
 | 
	
		
			
				|  |  | +					if(qm == tagBad || qc2 == tagBad || qc2 == 0d || new BigDecimal(Double.toString(qm)).subtract(new BigDecimal(Double.toString(qc2))).doubleValue()<0
 | 
	
		
			
				|  |  | +							|| !energytypeid.equalsIgnoreCase("E")){
 | 
	
		
			
				|  |  | +						String sql = "select nvl(round(sum("+tagCol+")*"+mod+", "+digits+"),0) from "+tagTable+" where substr(clock,0,10) = ?";
 | 
	
		
			
				|  |  | +						try {
 | 
	
		
			
				|  |  | +							ap1 = jdbcTemplate.queryForObject(sql, new Object[]{end}, Double.class);
 | 
	
		
			
				|  |  | +							if(ap1!=null && Math.abs(ap1) > Integer.MAX_VALUE){
 | 
	
		
			
				|  |  | +								ap1 = 0d;
 | 
	
		
			
				|  |  | +							}
 | 
	
		
			
				|  |  | +						}catch(Exception e) {
 | 
	
		
			
				|  |  | +							ap1 = 0d;
 | 
	
		
			
				|  |  | +						}
 | 
	
		
			
				|  |  | +					}else{
 | 
	
		
			
				|  |  | +						// 仪表期末值 - 仪表期初值
 | 
	
		
			
				|  |  | +						ap1 = new BigDecimal(Double.toString(qm)).subtract(new BigDecimal(Double.toString(qc2))).multiply(new BigDecimal(mod)).setScale(digits, BigDecimal.ROUND_HALF_UP).doubleValue();
 | 
	
		
			
				|  |  | +					}
 | 
	
		
			
				|  |  | +				}
 | 
	
		
			
				|  |  | +				ap = new BigDecimal(Double.toString(ap1)).add(new BigDecimal(Double.toString(ap))).setScale(digits, BigDecimal.ROUND_HALF_UP).doubleValue();
 | 
	
		
			
				|  |  | +			}else{
 | 
	
		
			
				|  |  | +				try {
 | 
	
		
			
				|  |  | +					ap = jdbcTemplate.queryForObject(sql3, new Object[]{itemid, start, qm_clk2}, Double.class);
 | 
	
		
			
				|  |  | +					if(ap!=null && Math.abs(ap) > Integer.MAX_VALUE){
 | 
	
		
			
				|  |  | +						logger.error("仪表数值异常:" + ap);
 | 
	
		
			
				|  |  | +						ap = 0d;
 | 
	
		
			
				|  |  | +					}
 | 
	
		
			
				|  |  | +				} catch(DataAccessException e) {
 | 
	
		
			
				|  |  | +					ap = tagBad;
 | 
	
		
			
				|  |  | +				}
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  | +			Map<String, Object> m = new HashMap<String, Object>();
 | 
	
		
			
				|  |  | +			m.put("itemid", itemid);
 | 
	
		
			
				|  |  | +			m.put("qc", new BigDecimal(Double.toString(qc)).toPlainString());
 | 
	
		
			
				|  |  | +			m.put("qm", new BigDecimal(Double.toString(qm)).toPlainString());
 | 
	
		
			
				|  |  | +			m.put("ap", new BigDecimal(Double.toString(ap)).toPlainString());
 | 
	
		
			
				|  |  | +			m.put("ten", ten);
 | 
	
		
			
				|  |  | +			l.add(m);
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +		return l;
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	@Override
 | 
	
		
			
				|  |  | +	public String restatCalpData(String itemid, String clock, String timegranid, String opuser) {
 | 
	
		
			
				|  |  | +		TRmCalpoint tRmCalpoint = tRmCalpointMapper.selectByPrimaryKey(itemid);
 | 
	
		
			
				|  |  | +		return restatCalData(tRmCalpoint, clock, timegranid,opuser);
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	@Override
 | 
	
		
			
				|  |  | +    public Double getSumvalue(HashMap<String, Object> params) {
 | 
	
		
			
				|  |  | +        return tRmCalpointValueMapper.getSumvalue(params);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	@Override
 | 
	
		
			
				|  |  | +	public void resWData(String clock, String clock2) {
 | 
	
		
			
				|  |  | +		//水计量点统计
 | 
	
		
			
				|  |  | +		emsWaterRealtimeService.getWaterTenMinutes();
 | 
	
		
			
				|  |  | +		emsWaterRealtimeService.getWaterHour(clock,clock2);
 | 
	
		
			
				|  |  | +		emsWaterRealtimeService.getHistoryWaterToHour();
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	@Override
 | 
	
		
			
				|  |  | +	public List<TRmCalpointValue> getDataForBb() {
 | 
	
		
			
				|  |  | +		return tRmCalpointValueMapper.getDataForBb();
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +	public void  insetDataForBb(){
 | 
	
		
			
				|  |  | +		List<TRmCalpointValue> dataForBb = this.getDataForBb();
 | 
	
		
			
				|  |  | +		HashMap<String,Object> hashMap =  new HashMap();
 | 
	
		
			
				|  |  | +		dataForBb.forEach( item -> {
 | 
	
		
			
				|  |  | +			item.setTimegranid("DAY");
 | 
	
		
			
				|  |  | +			item.setCrman("系统");
 | 
	
		
			
				|  |  | +			item.setCorrectvalue(new BigDecimal("0"));
 | 
	
		
			
				|  |  | +			item.setActualvalue(item.getApportvalue());
 | 
	
		
			
				|  |  | +			item.setRecTime(DateUtils.dateStr(new Date(),"yyyy-MM-dd HH:mm:ss"));
 | 
	
		
			
				|  |  | +			hashMap.put("itemid",item.getItemid());
 | 
	
		
			
				|  |  | +			hashMap.put("clock",item.getClock());
 | 
	
		
			
				|  |  | +			hashMap.put("timegranid",item.getTimegranid());
 | 
	
		
			
				|  |  | +			TRmCalpointValue tRmCalpointValue = tRmCalpointValueMapper.selectByPrimaryKey(hashMap);
 | 
	
		
			
				|  |  | +			if (tRmCalpointValue != null ){
 | 
	
		
			
				|  |  | +				tRmCalpointValueMapper.updateByPrimaryKeySelective(item);
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  | +			else {
 | 
	
		
			
				|  |  | +				tRmCalpointValueMapper.insert(item);
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  | +		});
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +}
 |