|
@@ -6,12 +6,14 @@ import com.jjt.calc.domain.TwinCalcHourEnergy;
|
|
|
import com.jjt.calc.mapper.TwinCalcHourEnergyMapper;
|
|
|
import com.jjt.calc.service.ITwinCalcHourEnergyService;
|
|
|
import com.jjt.common.utils.DateUtils;
|
|
|
+import com.jjt.common.utils.StringUtils;
|
|
|
import com.jjt.utils.IotService;
|
|
|
import com.jjt.utils.Tools;
|
|
|
-import com.jjt.ws.domain.TwinWorkshop;
|
|
|
import com.jjt.ws.domain.TwinWorkshopEnergy;
|
|
|
-import com.jjt.ws.service.ITwinWorkshopService;
|
|
|
+import com.jjt.ws.service.ITwinWorkshopCalcService;
|
|
|
+import com.jjt.ws.service.ITwinWorkshopEnergyService;
|
|
|
import javafx.util.Pair;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
import org.apache.ibatis.session.ExecutorType;
|
|
|
import org.apache.ibatis.session.SqlSession;
|
|
|
import org.apache.ibatis.session.SqlSessionFactory;
|
|
@@ -21,8 +23,10 @@ import javax.annotation.Resource;
|
|
|
import java.math.BigDecimal;
|
|
|
import java.time.LocalDate;
|
|
|
import java.time.LocalDateTime;
|
|
|
+import java.time.LocalTime;
|
|
|
import java.time.ZoneOffset;
|
|
|
import java.util.*;
|
|
|
+import java.util.stream.Collectors;
|
|
|
|
|
|
/**
|
|
|
* 能源1小时统计数据Service业务层处理
|
|
@@ -31,6 +35,7 @@ import java.util.*;
|
|
|
* @date 2025-01-18
|
|
|
*/
|
|
|
@Service
|
|
|
+@Slf4j
|
|
|
public class TwinCalcHourEnergyServiceImpl implements ITwinCalcHourEnergyService {
|
|
|
@Resource
|
|
|
private TwinCalcHourEnergyMapper twinCalcHourEnergyMapper;
|
|
@@ -39,7 +44,9 @@ public class TwinCalcHourEnergyServiceImpl implements ITwinCalcHourEnergyService
|
|
|
@Resource
|
|
|
private SqlSessionFactory factory;
|
|
|
@Resource
|
|
|
- private ITwinWorkshopService workshopService;
|
|
|
+ private ITwinWorkshopEnergyService energyService;
|
|
|
+ @Resource
|
|
|
+ private ITwinWorkshopCalcService calcService;
|
|
|
|
|
|
/**
|
|
|
* 查询能源1小时统计数据
|
|
@@ -119,33 +126,48 @@ public class TwinCalcHourEnergyServiceImpl implements ITwinCalcHourEnergyService
|
|
|
int period = start.getHour();
|
|
|
Long startTime = start.toInstant(ZoneOffset.of("+8")).toEpochMilli();
|
|
|
Long endTime = end.toInstant(ZoneOffset.of("+8")).toEpochMilli();
|
|
|
- String baseSql = "select %s from %s where time>%s and time <=%s";
|
|
|
- TwinWorkshop ws = workshopService.selectTwinWorkshopByWsCode("WS_01");
|
|
|
- List<TwinWorkshopEnergy> energyList = ws.getTwinWorkshopEnergyList();
|
|
|
- List<TwinCalcHourEnergy> list = new ArrayList<>();
|
|
|
- for (TwinWorkshopEnergy energy : energyList) {
|
|
|
- String sql = String.format(baseSql, energy.getEnergyCode(), energy.getEnergyPath(), startTime, endTime);
|
|
|
- JSONObject jsonObject = iotService.query(sql);
|
|
|
- JSONObject data = jsonObject.getJSONObject("data");
|
|
|
- JSONArray values = data.getJSONArray("values");
|
|
|
- if (values.size() == 0) {
|
|
|
- continue;
|
|
|
+ List<TwinWorkshopEnergy> energyList = energyService.selectTwinWorkshopEnergyList(new TwinWorkshopEnergy());
|
|
|
+ // 转换为 Map<String, TwinWorkshopEnergy>,使用 能源ID 属性作为键
|
|
|
+ Map<Long, TwinWorkshopEnergy> energyMap = energyList.stream().collect(Collectors.toMap(TwinWorkshopEnergy::getEnergyId, obj -> obj));
|
|
|
+ List<String> fieldList = new ArrayList<>();
|
|
|
+ energyList.forEach(energy -> {
|
|
|
+ String field = energy.getEnergyPath() + " AS " + energy.getEnergyId();
|
|
|
+ fieldList.add(field);
|
|
|
+ });
|
|
|
+
|
|
|
+ String sql = "select %s from root.tl.suxi where time>%s and time <=%s";
|
|
|
+ sql = String.format(sql, String.join(",", fieldList), startTime, endTime);
|
|
|
+ iotService.query(sql);
|
|
|
+ JSONObject jsonObject = iotService.query(sql);
|
|
|
+ JSONObject data = jsonObject.getJSONObject("data");
|
|
|
+ JSONArray values = data.getJSONArray("values");
|
|
|
+ JSONArray columnNames = data.getJSONArray("columnNames");
|
|
|
+
|
|
|
+// JSONArray timestamps = data.getJSONArray("timestamps");
|
|
|
+
|
|
|
+ List<TwinCalcHourEnergy> calcHourEnergyList = new ArrayList<>();
|
|
|
+ if (values.size() == 1) {
|
|
|
+ JSONArray da = values.getJSONArray(0);
|
|
|
+ for (int i = 0; i < da.size(); i++) {
|
|
|
+ Long id = columnNames.getLong(i);
|
|
|
+ String v = da.getStr(i);
|
|
|
+ if (StringUtils.isNotEmpty(v)) {
|
|
|
+ BigDecimal value = new BigDecimal(v);
|
|
|
+ TwinCalcHourEnergy calc = new TwinCalcHourEnergy();
|
|
|
+ TwinWorkshopEnergy energy = energyMap.get(id);
|
|
|
+ value = value.multiply(energy.getCoefficient());
|
|
|
+ calc.setEnergyId(id);
|
|
|
+ calc.setDataDate(date);
|
|
|
+ calc.setHour(period);
|
|
|
+ calc.setDataValue(value);
|
|
|
+ calcHourEnergyList.add(calc);
|
|
|
+ }
|
|
|
}
|
|
|
- JSONArray first = values.getJSONArray(0);
|
|
|
- JSONArray last = values.getJSONArray(values.size() - 1);
|
|
|
- int res = last.getInt(0) - first.getInt(0);
|
|
|
- TwinCalcHourEnergy calcEnergy = new TwinCalcHourEnergy();
|
|
|
- calcEnergy.setEnergyId(energy.getEnergyId());
|
|
|
- BigDecimal dataV = BigDecimal.valueOf(res).multiply(energy.getCoefficient());
|
|
|
- calcEnergy.setDataValue(dataV);
|
|
|
- calcEnergy.setDataDate(date);
|
|
|
- calcEnergy.setHour(period);
|
|
|
- list.add(calcEnergy);
|
|
|
}
|
|
|
- if (list.size() > 0) {
|
|
|
- try (SqlSession sqlSession = factory.openSession(ExecutorType.BATCH, false)) {
|
|
|
+ try (SqlSession sqlSession = factory.openSession(ExecutorType.BATCH, false)) {
|
|
|
+ if (calcHourEnergyList.size() > 0) {
|
|
|
TwinCalcHourEnergyMapper mapper = sqlSession.getMapper(TwinCalcHourEnergyMapper.class);
|
|
|
- list.forEach(mapper::insertTwinCalcHourEnergy);
|
|
|
+ calcHourEnergyList.forEach(mapper::insertTwinCalcHourEnergy);
|
|
|
sqlSession.commit();
|
|
|
}
|
|
|
}
|
|
@@ -157,9 +179,6 @@ public class TwinCalcHourEnergyServiceImpl implements ITwinCalcHourEnergyService
|
|
|
@Override
|
|
|
public void calcLastEnergy() {
|
|
|
LocalDateTime ldt = Tools.currWholeTime();
|
|
|
- //上一个小时
|
|
|
- ldt = ldt.minusHours(1);
|
|
|
- //这里不需要向前取一秒了
|
|
|
LocalDateTime start = ldt;
|
|
|
LocalDateTime end = ldt.plusHours(1);
|
|
|
calcEnergy(start, end);
|
|
@@ -180,9 +199,42 @@ public class TwinCalcHourEnergyServiceImpl implements ITwinCalcHourEnergyService
|
|
|
Date eTime = pair.getValue();
|
|
|
TwinCalcHourEnergy hour = new TwinCalcHourEnergy();
|
|
|
Map<String, Object> params = new HashMap<>(16);
|
|
|
- params.put("sTime", DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS,sTime));
|
|
|
+ params.put("sTime", DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, sTime));
|
|
|
params.put("eTime", DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, eTime));
|
|
|
hour.setParams(params);
|
|
|
return selectTwinCalcHourEnergyList(hour);
|
|
|
}
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 从数据库最后一个时间段统计至上一个时段
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public void calc2Curr() {
|
|
|
+ TwinCalcHourEnergy lastHour = lastRecord();
|
|
|
+ LocalDate localDate = DateUtils.toLocalDate(lastHour.getDataDate());
|
|
|
+ LocalDateTime start = LocalDateTime.of(localDate, LocalTime.MIN).plusHours(lastHour.getHour() + 1);
|
|
|
+ LocalDateTime end = start.plusHours(1);
|
|
|
+
|
|
|
+ LocalDateTime stop = Tools.currWholeTime();
|
|
|
+ while (!end.isAfter(stop)) {
|
|
|
+ calcEnergy(start, end);
|
|
|
+ log.info("补录数据===========start:{},end:{},stop:{}", start, end, stop);
|
|
|
+ if (end.getHour() == 7) {
|
|
|
+ //跨天,统计前一天的总数据
|
|
|
+ log.info("----------------{},{}", start, end);
|
|
|
+ calcService.calc(start.toLocalDate().minusDays(1));
|
|
|
+ }
|
|
|
+ start = end;
|
|
|
+ end = end.plusHours(1);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取最后一条记录
|
|
|
+ *
|
|
|
+ * @return 结果
|
|
|
+ */
|
|
|
+ private TwinCalcHourEnergy lastRecord() {
|
|
|
+ return twinCalcHourEnergyMapper.lastRecord();
|
|
|
+ }
|
|
|
}
|