package com.whyc.service; import com.github.pagehelper.PageInfo; import com.whyc.dto.Response; import com.whyc.mapper.CallBack; import com.whyc.pojo.db_power_history.BattRealTimeDataHistory; import com.whyc.util.SubTablePageInfoUtil; import com.whyc.util.ThreadLocalUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.sql.ResultSet; import java.sql.SQLException; import java.text.ParseException; import java.util.Calendar; import java.util.Date; import java.util.LinkedList; import java.util.List; @Service public class BattRealTimeDataHistoryService { @Autowired private SubTablePageInfoUtil subTablePageInfoUtil; @Autowired private MybatisSqlExecuteService sqlExecuteService; public Response getPage(int pageNum, int pageSize, int battGroupId, String startTime, String endTime) throws ParseException, InterruptedException { PageInfo pageInfo = subTablePageInfoUtil.getPageInfoByMonthTable(pageNum, pageSize, ThreadLocalUtil.parse(startTime, 1), ThreadLocalUtil.parse(endTime, 1), "db_power_history", "tb_batt_realdata_" + battGroupId, new BattRealTimeDataHistory() ); return new Response().set(1, pageInfo); } /** * 充电结束时间的定位逻辑为: * _电池组id表中,记录时间大于dischargeEndTime且电流为0的记录中,顺序取出第一个记录. * 考虑到充电结束时间可能跨表,所以需要查询下一个月的表. * @return */ public BattRealTimeDataHistory getChargeEnd(int battGroupId, Calendar dischargeEndTime) { //查询的年月为dischargeEndTime的年月 int year = dischargeEndTime.get(Calendar.YEAR); int month = dischargeEndTime.get(Calendar.MONTH); //String tableName = "tb_batt_realdata_" + battGroupId + "_" + year + "_" + (month+1); //查询dischargeEndTime的年月加上一个月 int yearOfNextMonth = year; int monthOfNextMonth = month; if (month == 11) { yearOfNextMonth++; monthOfNextMonth = 0; }else{ monthOfNextMonth++; } String battGroupIdTable = getBattGroupIdTable(battGroupId, dischargeEndTime.getTime()); String sql = "select * from db_power_history.tb_batt_realdata_" + battGroupIdTable + " where record_time > '" + dischargeEndTime.getTime() + "' and group_curr = 0 limit 1"; List list = sqlExecuteService.executeQuery_call(sql, new CallBack() { @Override public List getResults(ResultSet rs) throws SQLException { List list = new LinkedList<>(); //如果存在记录 while (rs.next()) { BattRealTimeDataHistory his = new BattRealTimeDataHistory(); his.setBattGroupId(rs.getInt("binf_id")); his.setRecordTime(rs.getTimestamp("record_time")); his.setOnlineVol(rs.getFloat("online_vol")); his.setGroupVol(rs.getFloat("group_vol")); his.setGroupTmp(rs.getFloat("group_tmp")); his.setGroupCurr(rs.getFloat("group_curr")); list.add(his); } return list; } }); //如果不存在记录,则查询下一个月的表 if (list.size() == 0) { //String tableNameNextMonth = "tb_batt_realdata_" + battGroupId + "_" + yearOfNextMonth + "_" + (monthOfNextMonth+1); dischargeEndTime.add(Calendar.MONTH, 1); String battGroupITableNameNextMonth = getBattGroupIdTable(battGroupId, dischargeEndTime.getTime()); //还原dischargeEndTime dischargeEndTime.add(Calendar.MONTH, -1); String sqlNextMonth = "select * from db_power_history." + battGroupITableNameNextMonth + " where record_time > '" + dischargeEndTime.getTime() + "' and group_curr = 0 limit 1"; List listNextMonth = sqlExecuteService.executeQuery_call(sqlNextMonth, new CallBack() { @Override public List getResults(ResultSet rs) throws SQLException { List list = new LinkedList<>(); //如果存在记录 while (rs.next()) { BattRealTimeDataHistory his = new BattRealTimeDataHistory(); his.setBattGroupId(rs.getInt("binf_id")); his.setRecordTime(rs.getTimestamp("record_time")); his.setOnlineVol(rs.getFloat("online_vol")); his.setGroupVol(rs.getFloat("group_vol")); his.setGroupTmp(rs.getFloat("group_tmp")); his.setGroupCurr(rs.getFloat("group_curr")); list.add(his); } return list; } }); return listNextMonth.size() == 0 ? null : listNextMonth.get(0); }else{ return list.get(0); } } public List getFcVolList(int battGroupId, Date testStartTime) { String battGroupIdTable = getBattGroupIdTable(battGroupId, testStartTime); String sql = "select * from db_power_history.tb_batt_realdata_" + battGroupIdTable + " where record_time < '" + testStartTime + "' and batt_test_type = 1 order by num desc limit 104"; List fcVolList = sqlExecuteService.executeQuery_call(sql, new CallBack() { @Override public List getResults(ResultSet rs) throws SQLException { List list = new LinkedList<>(); //如果存在记录 while (rs.next()) { BattRealTimeDataHistory his = new BattRealTimeDataHistory(); his.setMonNum(rs.getInt("mon_num")); his.setMonVol(rs.getFloat("mon_vol")); his.setMonTmp(rs.getFloat("mon_tmp")); list.add(his); } return list; } }); return fcVolList; } public List getPreVolList(int battGroupId, Date testStartTime) { String battGroupIdTable = getBattGroupIdTable(battGroupId, testStartTime); String sql = "select * from db_power_history.tb_batt_realdata_" + battGroupIdTable + " where record_time = '" + testStartTime + "' order by mon_num asc limit 104"; List fcVolList = sqlExecuteService.executeQuery_call(sql, new CallBack() { @Override public List getResults(ResultSet rs) throws SQLException { List list = new LinkedList<>(); //如果存在记录 while (rs.next()) { BattRealTimeDataHistory his = new BattRealTimeDataHistory(); his.setMonNum(rs.getInt("mon_num")); his.setMonVol(rs.getFloat("mon_vol")); his.setMonTmp(rs.getFloat("mon_tmp")); list.add(his); } return list; } }); return fcVolList; } public List getRecordList(int battGroupId, Date recordTime) { String battGroupIdTable = getBattGroupIdTable(battGroupId, recordTime); String sql = "select * from db_power_history.tb_batt_realdata_" + battGroupIdTable + " where record_time >= '" + recordTime + "' order by num asc limit 104"; List fcVolList = sqlExecuteService.executeQuery_call(sql, new CallBack() { @Override public List getResults(ResultSet rs) throws SQLException { List list = new LinkedList<>(); //如果存在记录 while (rs.next()) { BattRealTimeDataHistory his = new BattRealTimeDataHistory(); his.setMonNum(rs.getInt("mon_num")); his.setMonVol(rs.getFloat("mon_vol")); his.setMonTmp(rs.getFloat("mon_tmp")); list.add(his); } return list; } }); return fcVolList; } public Date getChargeStartTime(int battGroupId, Date recordTime) { String battGroupIdTable = getBattGroupIdTable(battGroupId, recordTime); String sql = "select record_time from db_power_history.tb_batt_realdata_" + battGroupIdTable + " where record_time > '" + recordTime + "' and batt_test_type = 2 order limit 1"; List timeList = sqlExecuteService.executeQuery_call(sql, new CallBack() { @Override public List getResults(ResultSet rs) throws SQLException { List list = new LinkedList<>(); //如果存在记录 while (rs.next()) { Date recordTime = rs.getTimestamp("record_time"); list.add(recordTime); } return list; } }); return timeList.get(0); } public List getFcVolListAfter(int battGroupId, Date testStartTime) { String battGroupIdTable = getBattGroupIdTable(battGroupId, testStartTime); String sql = "select * from db_power_history.tb_batt_realdata_" + battGroupIdTable + " where record_time > '" + testStartTime + "' and batt_test_type = 1 order by num desc limit 104"; List fcVolList = sqlExecuteService.executeQuery_call(sql, new CallBack() { @Override public List getResults(ResultSet rs) throws SQLException { List list = new LinkedList<>(); //如果存在记录 while (rs.next()) { BattRealTimeDataHistory his = new BattRealTimeDataHistory(); his.setMonNum(rs.getInt("mon_num")); his.setMonVol(rs.getFloat("mon_vol")); his.setMonTmp(rs.getFloat("mon_tmp")); list.add(his); } return list; } }); return fcVolList; } private String getBattGroupIdTable(int battGroupId, Date time) { Calendar timeCalendar = Calendar.getInstance(); timeCalendar.setTime(time); int year = timeCalendar.get(Calendar.YEAR); int month = timeCalendar.get(Calendar.MONTH)+1; if (month < 10){ return battGroupId + "_" + year + "_0" + month; }else{ return battGroupId + "_" + month + "_" + month; } } public List getFirstRecordList(String tableName) { String sql = "select * from db_power_history." + tableName + " limit 104"; List list = sqlExecuteService.executeQuery_call(sql, new CallBack() { @Override public List getResults(ResultSet rs) throws SQLException { List list = new LinkedList<>(); //如果存在记录 while (rs.next()) { BattRealTimeDataHistory his = new BattRealTimeDataHistory(); his.setTestStartTime(rs.getTimestamp("test_start_time")); his.setMonNum(rs.getInt("mon_num")); his.setMonVol(rs.getFloat("mon_vol")); his.setMonRes(rs.getFloat("mon_res")); his.setMonTmp(rs.getFloat("mon_tmp")); list.add(his); } return list; } }); return list; } /** * select * from tb_batt_realdata_100001_2025_04 where record_time in * (SELECT MIN(record_time) AS min_time FROM tb_batt_realdata_100001_2025_04 * GROUP BY DATE(record_time)) * * @param tableName * @param timeAgo * @return */ public List getFirstRecordListOfDay(String tableName, Date timeAgo) { String sqlExtra; if(timeAgo!=null){ sqlExtra = " where record_time > '" + timeAgo + "'"; }else{ sqlExtra = ""; } String sql = "select * from db_power_history." + tableName + " where record_time in (SELECT MIN(record_time) FROM db_power_history." + tableName + sqlExtra +" GROUP BY DATE(record_time))"; List list = sqlExecuteService.executeQuery_call(sql, new CallBack() { @Override public List getResults(ResultSet rs) throws SQLException { List list = new LinkedList<>(); //如果存在记录 while (rs.next()) { BattRealTimeDataHistory his = new BattRealTimeDataHistory(); his.setTestStartTime(rs.getTimestamp("test_start_time")); his.setRecordTime(rs.getTimestamp("record_time")); his.setMonNum(rs.getInt("mon_num")); his.setMonVol(rs.getFloat("mon_vol")); his.setMonRes(rs.getFloat("mon_res")); his.setMonTmp(rs.getFloat("mon_tmp")); list.add(his); } return list; } }); return list; } }