whyclxw
2025-05-27 22e80b64405b03d39305134dacbe821b8d5a23ad
电池,设备,电源历史告警
7个文件已修改
1个文件已删除
7个文件已添加
1678 ■■■■■ 已修改文件
src/main/java/com/whyc/controller/AlarmHistoryController.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/dto/AlmHis/BattAlarmRes.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/dto/AlmHis/BattAlmPar.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/dto/AlmHis/DevAlmPar.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/dto/AlmHis/PwrAlmPar.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/dto/Real/AlmDto.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/factory/ThreadPoolExecutorFactory.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/mapper/CommonMapper.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/pojo/db_alarm/DevalarmDataHistory.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/pojo/db_pwrdev_alarm/PwrdevAlarmHistory.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/service/AlarmHisService.java 80 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/service/SubTablePageInfoService.java 730 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/util/SubTablePageInfoUtil.java 352 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/util/SubTablePageInfoUtils.java 322 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/CommonMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/controller/AlarmHistoryController.java
New file
@@ -0,0 +1,43 @@
package com.whyc.controller;
import com.whyc.dto.AlmHis.BattAlmPar;
import com.whyc.dto.AlmHis.DevAlmPar;
import com.whyc.dto.AlmHis.PwrAlmPar;
import com.whyc.dto.Real.AlmDto;
import com.whyc.dto.Response;
import com.whyc.service.AlarmHisService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.text.ParseException;
@RestController
@Api(tags = "告警历史管理")
@RequestMapping("almHis")
public class AlarmHistoryController {
    @Autowired
    private AlarmHisService service;
    @PostMapping("getBattAlmHis")
    @ApiOperation(value = "电池告警历史记录查询")
    public Response serchByInfo(@RequestBody BattAlmPar almDto) throws ParseException, InterruptedException {
        return service.getBattAlmHis(almDto);
    }
    @PostMapping("getDevAlmHis")
    @ApiOperation(value = "设备告警历史记录查询")
    public Response getDevAlmHis(@RequestBody DevAlmPar almDto) throws ParseException, InterruptedException {
        return service.getDevAlmHis(almDto);
    }
    @PostMapping("getPwrAlmHis")
    @ApiOperation(value = "电源告警历史记录查询")
    public Response getPwrAlmHis(@RequestBody PwrAlmPar almDto) throws ParseException, InterruptedException {
        return service.getPwrAlmHis(almDto);
    }
}
src/main/java/com/whyc/dto/AlmHis/BattAlarmRes.java
New file
@@ -0,0 +1,25 @@
package com.whyc.dto.AlmHis;
import com.whyc.pojo.db_alarm.BattalarmDataHistory;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
import java.io.Serializable;
import java.util.List;
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class BattAlarmRes implements Serializable {
    private int battgroupId;//电池组id
    private String stationName;//机房名称
    private String provice;//机房名称
    private String city;//机房名称
    private String country;//机房名称
    private String stationId;//机房id
    private String battGroupName;//电池组名称
    private List<BattalarmDataHistory> adataHs;//历史告警信息
}
src/main/java/com/whyc/dto/AlmHis/BattAlmPar.java
New file
@@ -0,0 +1,28 @@
package com.whyc.dto.AlmHis;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.util.Date;
import java.util.List;
@Data
public class BattAlmPar {
    private String provice;
    private String city;
    private String country;
    private String stationName;
    private List<Integer> almIds;
    private Integer almLevel;
    private Integer pageNum;
    private Integer pageSize;
    private Integer uid;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date almStartTime;//开始时间
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date almEndTime;//结束时间
    private String recordYear;
    private Integer limitStart;
    private Integer limitEnd;
}
src/main/java/com/whyc/dto/AlmHis/DevAlmPar.java
New file
@@ -0,0 +1,29 @@
package com.whyc.dto.AlmHis;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.util.Date;
import java.util.List;
@Data
public class DevAlmPar {
    private String provice;
    private String city;
    private String country;
    private String stationName;
    private List<Integer> almIds;
    private Integer almLevel;
    private Integer pageNum;
    private Integer pageSize;
    private Integer uid;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date almStartTime;//开始时间
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date almEndTime;//结束时间
    private String recordYear;
    private Integer limitStart;
    private Integer limitEnd;
}
src/main/java/com/whyc/dto/AlmHis/PwrAlmPar.java
New file
@@ -0,0 +1,28 @@
package com.whyc.dto.AlmHis;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.util.Date;
import java.util.List;
@Data
public class PwrAlmPar {
    private String provice;
    private String city;
    private String country;
    private String stationName;
    private List<Integer> almIds;
    private Integer almLevel;
    private Integer pageNum;
    private Integer pageSize;
    private Integer uid;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date almStartTime;//开始时间
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date almEndTime;//结束时间
    private String recordYear;
    private Integer limitStart;
    private Integer limitEnd;
}
src/main/java/com/whyc/dto/Real/AlmDto.java
@@ -1,7 +1,10 @@
package com.whyc.dto.Real;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
import java.util.List;
@Data
@@ -11,8 +14,13 @@
    private String country;
    private String stationName;
    private List<Integer> almIds;
    private String almLevel;
    private Integer almLevel;
    private Integer pageNum;
    private Integer pageSize;
    private Integer uid;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date almStartTime;//开始时间
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date almEndTime;//结束时间
}
src/main/java/com/whyc/factory/ThreadPoolExecutorFactory.java
@@ -11,7 +11,7 @@
    private static ThreadPoolExecutor init() {
        //线程池初始化,拒绝策略为丢弃
        UserThreadFactory userThreadFactory = new UserThreadFactory("br");
        ThreadPoolExecutor pool = new ThreadPoolExecutor(8, 48, 10, TimeUnit.SECONDS, new LinkedBlockingDeque<>(16), userThreadFactory,new ThreadPoolExecutor.AbortPolicy());
        ThreadPoolExecutor pool = new ThreadPoolExecutor(10, 48, 10, TimeUnit.SECONDS, new LinkedBlockingDeque<>(16), userThreadFactory,new ThreadPoolExecutor.AbortPolicy());
        poolExecutor = pool;
        return pool;
    }
src/main/java/com/whyc/mapper/CommonMapper.java
@@ -19,7 +19,7 @@
    //Object getMaxValue(String schema,String table,String field,String valuePrefix);
    Object getMaxValue(@Param("schema") String schema,@Param("table") String table,@Param("field")  String field);
    boolean existTable(String dbName, String tableName);
    String existTable(String dbName, String tableName);
    //void truncate(String dbName, String tableName);
src/main/java/com/whyc/pojo/db_alarm/DevalarmDataHistory.java
@@ -1,6 +1,7 @@
package com.whyc.pojo.db_alarm;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
@@ -73,5 +74,15 @@
    @ApiModelProperty(value = "告警重要等级[0:重要;1:紧急]")
    private Integer almSeverity;
    @TableField(exist = false)
    private String stationName;
    @TableField(exist = false)
    private String provice;
    @TableField(exist = false)
    private String city;
    @TableField(exist = false)
    private String country;
    @TableField(exist = false)
    private String devName;
}
src/main/java/com/whyc/pojo/db_pwrdev_alarm/PwrdevAlarmHistory.java
@@ -1,6 +1,7 @@
package com.whyc.pojo.db_pwrdev_alarm;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
@@ -32,7 +33,7 @@
    private Long num;
    @ApiModelProperty(value = "电源ID")
    private Long powerId;
    private Integer powerId;
    @ApiModelProperty(value = "告警ID")
    private Integer almId;
@@ -67,5 +68,16 @@
    @ApiModelProperty(value = "告警重要等级[0:重要;1:紧急]")
    private Integer almSeverity;
    @TableField(exist = false)
    private String stationName;
    @TableField(exist = false)
    private String provice;
    @TableField(exist = false)
    private String city;
    @TableField(exist = false)
    private String country;
    @TableField(exist = false)
    private String powerName;
}
src/main/java/com/whyc/service/AlarmHisService.java
New file
@@ -0,0 +1,80 @@
package com.whyc.service;
import com.github.pagehelper.PageInfo;
import com.whyc.dto.AlmHis.BattAlmPar;
import com.whyc.dto.AlmHis.DevAlmPar;
import com.whyc.dto.AlmHis.PwrAlmPar;
import com.whyc.dto.Real.AlmDto;
import com.whyc.dto.Response;
import com.whyc.pojo.db_user.User;
import com.whyc.util.ActionUtil;
import com.whyc.util.MessageUtils;
import com.whyc.util.SubTablePageInfoUtils;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.text.ParseException;
import java.util.Date;
import java.util.List;
@Service
public class AlarmHisService {
    @Resource
    private SubTablePageInfoUtils subTablePageInfoUtils;
    //电池告警历史记录查询
    public Response getBattAlmHis(BattAlmPar almDto) throws ParseException, InterruptedException {
        //分页信息
        Integer pageNum = almDto.getPageNum();
        Integer pageSize = almDto.getPageSize();
        User uinf = ActionUtil.getUser();
        int uid = uinf.getId();
        almDto.setUid(uid);
        Date almStartTime = almDto.getAlmStartTime();
        Date almEndTime = almDto.getAlmEndTime();
        PageInfo<Object> pageInfo = subTablePageInfoUtils.getPageInfoByMonthTable(pageNum, pageSize, almStartTime, almEndTime,
                "db_alarm", "tb_battalarm_data_history", almDto);
        List<Object> list = pageInfo.getList();
        /*for (Object data : list) {
            AlarmRes a = (AlarmRes) data;
            List<BattalarmDataHistory> l = a.getAdataHs();
            for (BattalarmDataHistory adataH : l) {
                adataH.setAlmSignalIdName(AlarmDaoFactory.getAlarmName(adataH.getAlmSignalId()));
                adataH.setAlmLevelName(AlarmDaoFactory.getAlarmType(adataH.getAlmLevel()));
            }
        }*/
        return new Response().setII(1, list!=null, pageInfo, "电池告警历史记录查询");
    }
    //设备告警历史记录查询
    public Response getDevAlmHis(DevAlmPar almDto) throws ParseException, InterruptedException {
        Integer pageNum = almDto.getPageNum();
        Integer pageSize = almDto.getPageSize();
        Date almStartTime = almDto.getAlmStartTime();
        Date almEndTime = almDto.getAlmEndTime();
        User uinf = ActionUtil.getUser();
        int uid = uinf.getId();
        almDto.setUid(uid);
        PageInfo<Object> pageInfo = subTablePageInfoUtils.getPageInfoByMonthTable(pageNum, pageSize, almStartTime, almEndTime,
                "db_alarm", "tb_devalarm_data_history", almDto);
        return new Response().setII(1, pageInfo.getList()!=null, pageInfo, "返回结果");
    }
    //电源告警历史记录查询
    public Response getPwrAlmHis(PwrAlmPar almDto) throws ParseException {
        Integer pageNum = almDto.getPageNum();
        Integer pageSize = almDto.getPageSize();
        Date almStartTime = almDto.getAlmStartTime();
        Date almEndTime = almDto.getAlmEndTime();
        //recordId = 1 普通电源
        //param.setRecordId(1L);
        User uinf = ActionUtil.getUser();
        int uid = uinf.getId();
        almDto.setUid(uid);
        PageInfo<Object> pageInfo = subTablePageInfoUtils.getPageInfo(pageNum, pageSize, almStartTime, almEndTime,
                "db_pwrdev_alarm", "tb_pwrdev_alarm_history", almDto);
        List<Object> list = pageInfo.getList();
        /*for (Object temp : list) {
            PwrdevAlarmHistory p = (PwrdevAlarmHistory) temp;
            p.setAlarmName(AlarmDaoFactory.getAllAlarmName(p.getAlmType()));
        }*/
        return new Response<>().setII(1, pageInfo, null, "电源告警历史记录查询");
    }
}
src/main/java/com/whyc/service/SubTablePageInfoService.java
@@ -1,290 +1,440 @@
//package com.whyc.service;
//
//import com.whyc.dto.DevA200AlarmDto;
//import com.whyc.mapper.CallBack;
//import com.whyc.pojo.db_alarm.DevLithiumAlarmDataYear;
//import com.whyc.pojo.db_lithium_testdata.BattLithiumTestData;
//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.util.ArrayList;
//import java.util.LinkedList;
//import java.util.List;
//
//@Service
//public class SubTablePageInfoService {
//    @Autowired
//    private MybatisSqlExecuteService sqlExecuteService;
//    //获取设备某次记录详细的单体放电过程
//    public List<BattLithiumTestData> getTdataById(Integer devId, Integer testRecordCount) {
//        String sql="select  * from db_batt_testdata.tb_batttestdata_" +devId
//                +" where need_test=1 and test_record_count="+testRecordCount+" ";
//        sql+="  ORDER BY record_num asc ";
//        List list = sqlExecuteService.executeQuery_call(sql, new CallBack() {
//            @Override
//            public List getResults(ResultSet rs) throws SQLException {
//                List<BattLithiumTestData> list=new ArrayList<>();
//                while (rs.next()){
//                    BattLithiumTestData tdata=new BattLithiumTestData();
//                    tdata.setNum(rs.getInt("num"));
//                    tdata.setDevId(rs.getInt("dev_id"));
//                    tdata.setBattIdx(rs.getInt("batt_idx"));
//                    tdata.setTestRecordCount(rs.getInt("test_record_count"));
//                    tdata.setTestType(rs.getInt("test_type"));
//                    tdata.setRecordNum(rs.getInt("record_num"));
//                    tdata.setTestStarttime(rs.getTimestamp("test_starttime"));
//                    tdata.setRecordTime(rs.getTimestamp("record_time"));
//                    tdata.setTestTimelong(rs.getInt("test_timelong"));
//                    tdata.setGroupVol(rs.getDouble("group_vol"));
//                    tdata.setTestCurr(rs.getDouble("test_curr"));
//                    tdata.setTestCap(rs.getDouble("test_cap"));
//                    tdata.setMonNum(rs.getInt("mon_num"));
//                    tdata.setMonVol(rs.getDouble("mon_vol"));
//                    tdata.setMonTmp(rs.getDouble("mon_tmp"));
//                    tdata.setMonCurr(rs.getDouble("mon_curr"));
//                    tdata.setMonCap(rs.getDouble("mon_cap"));
//                    tdata.setMonWh(rs.getDouble("mon_wh"));
//                    tdata.setMonState(rs.getString("mon_state"));
//                    tdata.setMonFault(rs.getString("mon_fault"));
//                    tdata.setNeedTest(rs.getInt("need_test"));
//                    list.add(tdata);
//                }
//                return list;
//            }
//        });
//        return list;
//    }
//
//    //获取设备某次记录详细的单体放电过程
//    public List<BattLithiumTestData> getTdataByIdWithListA200(Integer devId, Integer testRecordCount) {
//        String sql="select  * from db_lithium_testdata.tb_batttestdata_" +devId
//                +" where need_test=1 and test_record_count="+testRecordCount+" ";
//        sql+="  ORDER BY record_num asc ";
//        List list = sqlExecuteService.executeQuery_call(sql, new CallBack() {
//            @Override
//            public List getResults(ResultSet rs) throws SQLException {
//                List list=new ArrayList<>();
//                List<Float> monVols=null;
//                List<Integer> monNums=null;
//                BattLithiumTestData tdata=null;
//                int num=0;
//                try {
//                    while (rs.next()){
//                        int monNum=rs.getInt("mon_num");
//                        float monvol=rs.getFloat("mon_vol");
//                        int recordNum=rs.getInt("record_num");
//                        if(num!=recordNum){
//                            if(num!=0){
//                                tdata.setMonVols(monVols);
//                                tdata.setMonNums(monNums);
//                                list.add(tdata);
//                            }
//                            tdata=new BattLithiumTestData();
//                            monVols=new ArrayList<>();
//                            monNums=new ArrayList<>();
//                            tdata.setDevId(rs.getInt("dev_id"));
//                            tdata.setBattIdx(rs.getInt("batt_idx"));
//                            tdata.setTestRecordCount(rs.getInt("test_record_count"));
//                            tdata.setTestType(rs.getInt("test_type"));
//                            tdata.setRecordNum(recordNum);
//                            tdata.setTestStarttime(rs.getTimestamp("test_starttime"));
//                            tdata.setRecordTime(rs.getTimestamp("record_time"));
//                            tdata.setTestTimelong(rs.getInt("test_timelong"));
//                            tdata.setGroupVol(rs.getDouble("group_vol"));
//                            tdata.setTestCurr(rs.getDouble("test_curr"));
//                            tdata.setTestCap(rs.getDouble("test_cap"));
//                            tdata.setNeedTest(rs.getInt("need_test"));
//                            tdata.setMaxTemp(rs.getFloat("max_temp"));
//                            tdata.setMinTemp(rs.getFloat("min_temp"));
//                            num=recordNum;
//                        }
//                        monVols.add(monvol);
//                        monNums.add(monNum);
//                    }
//                    tdata.setMonVols(monVols);
//                    tdata.setMonNums(monNums);
//                    list.add(tdata);
//                } catch (SQLException e) {
//                    e.printStackTrace();
//                }
//                return list;
//            }
//        });
//        return list;
//    }
//    //查询DevAlm历史告警数量
//    public int getCountForDevAlm(DevA200AlarmDto dto) {
//        String sql="select  count(distinct num) as number from db_alarm." +dto.getTableName()
//                +" where 1=1 ";
//
//        if(dto.getStartTime()!=null){
//            sql+=" and alm_starttime  >='"+ ThreadLocalUtil.format(dto.getStartTime(),1)+"' ";
//        }
//        if(dto.getEndTime()!=null){
//            sql+=" and alm_endtime  <='"+ThreadLocalUtil.format(dto.getEndTime(),1)+"' ";
//        }
//        if(dto.getDevType()!=null){
//           sql+=" and  FLOOR(dev_id/100000000)="+dto.getDevType();
//        }
//        if(dto.getDevId()!=null){
//            sql+=" and  dev_id="+dto.getDevId();
//        }
//        if(dto.getAlmId()!=null){
//            sql+=" and alm_id="+dto.getAlmId();
//        }
//        sql+=" and dev_id in (" +
//                "            SELECT distinct dev_id from db_user.tb_battgroup_baojigroup,db_user.tb_battgroup_usr" +
//                "            where tb_battgroup_baojigroup.baoji_group_id=tb_battgroup_usr.baoji_group_id" +
//                "           and uid="+dto.getUid()+
//                ")";
//        sql+="  order by alm_starttime desc ";
//        List list = sqlExecuteService.executeQuery_call(sql, new CallBack() {
//            @Override
//            public List getResults(ResultSet rs) throws SQLException {
//                LinkedList<Object> temp = new LinkedList<>();
//                try {
//                    while (rs.next())
//                        temp.add(rs.getInt("number"));
//                } catch (SQLException e) {
//                    e.printStackTrace();
//                }
//                return temp;
//            }
//        });
//        int num =0;
//        if(list!=null){
//            num= (int) list.get(0);
//        }
//        return num;
//    }
//    //查询devalm历史告警
//    public List getListDevAlm(DevA200AlarmDto dto){
//        String sql="select  * from db_alarm." +dto.getTableName()
//                +" where 1=1 ";
//
//        if(dto.getStartTime()!=null){
//            sql+=" and alm_starttime  >='"+ ThreadLocalUtil.format(dto.getStartTime(),1)+"' ";
//        }
//        if(dto.getEndTime()!=null){
//            sql+=" and alm_endtime  <='"+ThreadLocalUtil.format(dto.getEndTime(),1)+"' ";
//        }
//        if(dto.getDevType()!=null){
//            sql+=" and  FLOOR(dev_id/100000000)="+dto.getDevType();
//        }
//        if(dto.getDevId()!=null){
//            sql+=" and  dev_id="+dto.getDevId();
//        }
//        if(dto.getAlmId()!=null){
//            sql+=" and alm_id="+dto.getAlmId();
//        }
//        sql+=" and dev_id in (" +
//                "            SELECT distinct dev_id from db_user.tb_battgroup_baojigroup,db_user.tb_battgroup_usr" +
//                "           where tb_battgroup_baojigroup.baoji_group_id=tb_battgroup_usr.baoji_group_id" +
//                "           and uid="+dto.getUid()+
//                ")";
//        sql+="  ORDER BY alm_starttime desc  limit "+dto.getLimitStart()+","+dto.getLimitEnd()+" ";
//        List list = sqlExecuteService.executeQuery_call(sql, new CallBack() {
//            @Override
//            public List getResults(ResultSet rs) throws SQLException {
//                List<DevLithiumAlarmDataYear> list=new ArrayList<>();
//                while (rs.next()){
//                    DevLithiumAlarmDataYear dataYear=new DevLithiumAlarmDataYear();
//                    dataYear.setNum(rs.getInt("num"));
//                    dataYear.setDevId(rs.getInt("dev_id"));
//                    dataYear.setAlmId(rs.getInt("alm_id"));
//                    dataYear.setAlmSignalId(rs.getInt("alm_signal_id"));
//                    dataYear.setAlmStarttime(rs.getTimestamp("alm_starttime"));
//                    dataYear.setAlmValue(rs.getFloat("alm_value"));
//                    dataYear.setAlmIsConfirmed(rs.getInt("alm_is_confirmed"));
//                    dataYear.setConfirmedUid(rs.getInt("confirmed_uid"));
//                    dataYear.setConfirmedTime(rs.getTimestamp("confirmed_time"));
//                    dataYear.setAlmEndtime(rs.getTimestamp("alm_endtime"));
//                    dataYear.setAlmClearedType(rs.getInt("alm_cleared_type"));
//                    list.add(dataYear);
//                }
//                return list;
//            }
//        });
//        return list;
//    }
//
//
//    public List<BattLithiumTestData> getTdataByIdWithListActm(Integer devId, Integer testRecordCount) {
//        String sql="select  * from db_batt_testdata.tb_batttestdata_" +devId
//                +" where need_test=1 and test_record_count="+testRecordCount+" ";
//        sql+="  ORDER BY record_num asc ";
//        List list = sqlExecuteService.executeQuery_call(sql, new CallBack() {
//            @Override
//            public List getResults(ResultSet rs) throws SQLException {
//                List list=new ArrayList<>();
//                List<Float> monVols=null;
//                List<Float> monCurrs=null;
//                List<Float> monCaps=null;
//                List<Float> monWhs=null;
//                List<Integer> monNums=null;
//                BattLithiumTestData tdata=null;
//                int num=0;
//                try {
//                    while (rs.next()){
//                        int monNum=rs.getInt("mon_num");
//                        float monvol=rs.getFloat("mon_vol");
//                        float monCurr=rs.getFloat("mon_curr");
//                        float monCap=rs.getFloat("mon_cap");
//                        float monWh=rs.getFloat("mon_wh");
//                        int recordNum=rs.getInt("record_num");
//
//                        if(num!=recordNum){
//                            if(num!=0){
//                                tdata.setMonVols(monVols);
//                                tdata.setMonNums(monNums);
//                                tdata.setMonCurrs(monCurrs);
//                                tdata.setMonCaps(monCaps);
//                                tdata.setMonWhs(monWhs);
//                                list.add(tdata);
//                            }
//                            tdata=new BattLithiumTestData();
//                            monVols=new ArrayList<>();
//                            monNums=new ArrayList<>();
//                            monCurrs=new ArrayList<>();
//                            monCaps=new ArrayList<>();
//                            monWhs=new ArrayList<>();
//                            tdata.setDevId(rs.getInt("dev_id"));
//                            tdata.setBattIdx(rs.getInt("batt_idx"));
//                            tdata.setTestRecordCount(rs.getInt("test_record_count"));
//                            tdata.setTestType(rs.getInt("test_type"));
//                            tdata.setRecordNum(recordNum);
//                            tdata.setTestStarttime(rs.getTimestamp("test_starttime"));
//                            tdata.setRecordTime(rs.getTimestamp("record_time"));
//                            tdata.setTestTimelong(rs.getInt("test_timelong"));
//                            tdata.setGroupVol(rs.getDouble("group_vol"));
//                            tdata.setTestCurr(rs.getDouble("test_curr"));
//                            tdata.setTestCap(rs.getDouble("test_cap"));
//                            tdata.setNeedTest(rs.getInt("need_test"));
//                            tdata.setMonTmp(rs.getDouble("mon_tmp"));
//                            num=recordNum;
//                        }
//                        monVols.add(monvol);
//                        monNums.add(monNum);
//                        monCurrs.add(monCurr);
//                        monCaps.add(monCap);
//                        monWhs.add(monWh);
//                    }
//
//                    tdata.setMonVols(monVols);
//                    tdata.setMonNums(monNums);
//                    tdata.setMonCurrs(monCurrs);
//                    tdata.setMonCaps(monCaps);
//                    tdata.setMonWhs(monWhs);
//                    list.add(tdata);
//                } catch (SQLException e) {
//                    e.printStackTrace();
//                }
//                return list;
//            }
//        });
//        return list;
//    }
//}
package com.whyc.service;
import com.whyc.dto.AlmHis.BattAlarmRes;
import com.whyc.dto.AlmHis.BattAlmPar;
import com.whyc.dto.AlmHis.DevAlmPar;
import com.whyc.dto.AlmHis.PwrAlmPar;
import com.whyc.mapper.CallBack;
import com.whyc.pojo.db_alarm.BattalarmDataHistory;
import com.whyc.pojo.db_alarm.DevalarmDataHistory;
import com.whyc.pojo.db_pwrdev_alarm.PwrdevAlarmHistory;
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.util.*;
@Service
public class SubTablePageInfoService {
    @Autowired
    private MybatisSqlExecuteService sqlExecuteService;
    //获取电池组历史告警数量
    public int getBattAlmHisCount(BattAlmPar param){
        String sql="select count(distinct history.num) as number " +
                "        from db_alarm."+param.getRecordYear()+" history,db_station.tb_station_inf,db_station.tb_batt_inf " +
                "        where  history.battgroup_id=tb_battinf.battgroup_id " +
                 "       and tb_batt_inf.station_id=tb_station_inf.station_id " +
                "        and alm_start_time>='"+ThreadLocalUtil.format(param.getAlmStartTime(),1)+"' and alm_start_time <='"+ThreadLocalUtil.format(param.getAlmEndTime(),1)+"'  " ;
        if(param.getProvice()!=null){
            sql+=" and tb_station_inf.province='"+param.getProvice()+"' ";
        }
        if(param.getCity()!=null){
            sql+=" and tb_station_inf.city='"+param.getCity()+"' ";
        }
        if(param.getCountry()!=null){
            sql+=" and tb_station_inf.country='"+param.getCountry()+"' ";
        }
        if(param.getStationName()!=null){
            sql+=" and tb_station_inf.station_name like '%"+param.getStationName()+"%' ";
        }
        if(param.getAlmLevel()!=null){
            sql+=" and history.alm_level="+param.getAlmLevel()+" ";
        }
        List<Integer> almIds=param.getAlmIds();
        if(almIds!=null&&almIds.size()>0){
            sql+=" and history.alm_id in ( ";
            for (int i=0;i<almIds.size();i++) {
                sql+=almIds.get(i);
                if(i!=(almIds.size()-1)){
                    sql+=",";
                }
            }
            sql+=")";
        }
        if(param.getUid()>100){
            sql+=" and tb_batt_inf.station_id  in(" +
            "            select distinct station_id from db_user.tb_baojigroup_power,db_user.tb_baojigroup_usr " +
            "            where   tb_baojigroup_power.baoji_group_id=tb_baojigroup_usr.baoji_group_id " +
            "            and tb_baojigroup_usr.uid="+param.getUid()+
            "            )";
        }
        List list = sqlExecuteService.executeQuery_call(sql, new CallBack() {
            @Override
            public List getResults(ResultSet rs) throws SQLException {
                LinkedList<Object> temp = new LinkedList<>();
                try {
                    while (rs.next())
                        temp.add(rs.getInt("number"));
                } catch (SQLException e) {
                    e.printStackTrace();
                }
                return temp;
            }
        });
        int num =0;
        if(list!=null){
            num= (int) list.get(0);
        }
        return num;
    }
    //获取电池组历史告警集合
    public List<BattAlarmRes> getBattAlmHisList(BattAlmPar param){
        String sql="select history.battgroup_id,history.num,alm_signal_id,history.mon_num,alm_value,alm_level,alm_is_confirmed,alm_confirmed_time,alm_start_time,alm_end_time,alm_severity  " +
                "        ,tb_station_inf.station_name,tb_station_inf.provice,tb_station_inf.city,tb_station_inf.country,tb_batt_inf.battgroup_name  " +
                "        from db_alarm."+param.getRecordYear()+" history,db_station.tb_station_inf,db_station.tb_batt_inf " +
                "        where  history.battgroup_id=tb_battinf.battgroup_id " +
                "       and tb_batt_inf.station_id=tb_station_inf.station_id " +
                "        and alm_start_time>='"+ThreadLocalUtil.format(param.getAlmStartTime(),1)+"' and alm_start_time <='"+ThreadLocalUtil.format(param.getAlmEndTime(),1)+"'  " ;
        if(param.getProvice()!=null){
            sql+=" and tb_station_inf.province='"+param.getProvice()+"' ";
        }
        if(param.getCity()!=null){
            sql+=" and tb_station_inf.city='"+param.getCity()+"' ";
        }
        if(param.getCountry()!=null){
            sql+=" and tb_station_inf.country='"+param.getCountry()+"' ";
        }
        if(param.getStationName()!=null){
            sql+=" and tb_station_inf.station_name like '%"+param.getStationName()+"%' ";
        }
        if(param.getAlmLevel()!=null){
            sql+=" and history.alm_level="+param.getAlmLevel()+" ";
        }
        List<Integer> almIds=param.getAlmIds();
        if(almIds!=null&&almIds.size()>0){
            sql+=" and history.alm_id in ( ";
            for (int i=0;i<almIds.size();i++) {
                sql+=almIds.get(i);
                if(i!=(almIds.size()-1)){
                    sql+=",";
                }
            }
            sql+=")";
        }
        if(param.getUid()>100){
            sql+=" and tb_batt_inf.station_id  in(" +
                    "            select distinct station_id from db_user.tb_baojigroup_power,db_user.tb_baojigroup_usr " +
                    "            where   tb_baojigroup_power.baoji_group_id=tb_baojigroup_usr.baoji_group_id " +
                    "            and tb_baojigroup_usr.uid="+param.getUid()+
                    "            )";
        }
        sql+="   order by history.alm_start_time desc,history.battgroup_id asc,history.mon_num asc limit "+param.getLimitStart()+","+param.getLimitEnd()+" ";
        List<BattAlarmRes> list = sqlExecuteService.executeQuery_call(sql, new CallBack() {
            @Override
            public List getResults(ResultSet rs) throws SQLException {
                List<BattAlarmRes> list=new ArrayList<>();
                int id=0;
                int i=0;
                List dataList=new ArrayList();
                BattAlarmRes ph=new BattAlarmRes();
                while (rs.next()){
                    int battGroupId=rs.getInt("battgroup_id");
                    if(battGroupId!=id){
                        ph.setAdataHs(dataList);
                        dataList=new ArrayList();
                    }
                    BattalarmDataHistory data=new BattalarmDataHistory();
                    data.setNum(rs.getLong("num"));
                    data.setBattgroupId(rs.getInt("battgroup_id"));
                    data.setAlmSignalId(rs.getInt("alm_signal_id"));
                    data.setMonNum(rs.getInt("mon_num"));
                    data.setAlmValue(rs.getFloat("alm_value"));
                    data.setAlmLevel(rs.getInt("alm_level"));
                    data.setAlmIsConfirmed(rs.getInt("alm_is_confirmed"));
                    data.setAlmConfirmedTime(rs.getTimestamp("alm_confirmed_time"));
                    data.setAlmStartTime(rs.getTimestamp("alm_start_time"));
                    data.setAlmEndTime(rs.getTimestamp("alm_end_time"));
                    data.setAlmSeverity(rs.getInt("alm_severity"));
                    dataList.add(data);
                    if(battGroupId!=id){
                        if(i!=0){
                            list.add(ph);
                        }
                        id=battGroupId;
                        ph=new BattAlarmRes();
                        ph.setBattgroupId(battGroupId);
                        ph.setStationName(rs.getString("station_name"));
                        ph.setProvice(rs.getString("provice"));
                        ph.setCity(rs.getString("city"));
                        ph.setCountry(rs.getString("country"));
                        ph.setBattGroupName(rs.getString("battgroup_name"));
                    }
                    if(rs.isLast()){
                        ph.setAdataHs(dataList);
                        list.add(ph);
                    }
                    i++;
                }
                return list;
            }
        });
        return list;
    }
    //获取设备历史告警数量
    public int getDevAlmHisCount(DevAlmPar param){
        String sql="SELECT count(distinct history.num) as number FROM db_alarm."+param.getRecordYear()+" history,db_station.tb_batt_inf,db_station.tb_station_inf " +
                " where  history.dev_id=tb_batt_inf.dev_id "+
                " and tb_batt_inf.station_id=tb_station_inf.station_id "+
                " and alm_start_time>='"+ThreadLocalUtil.format(param.getAlmStartTime(),1)+"' and alm_start_time <='"+ThreadLocalUtil.format(param.getAlmEndTime(),1)+"'  " ;
        if(param.getProvice()!=null){
            sql+=" and tb_station_inf.province='"+param.getProvice()+"' ";
        }
        if(param.getCity()!=null){
            sql+=" and tb_station_inf.city='"+param.getCity()+"' ";
        }
        if(param.getCountry()!=null){
            sql+=" and tb_station_inf.country='"+param.getCountry()+"' ";
        }
        if(param.getStationName()!=null){
            sql+=" and tb_station_inf.station_name like '%"+param.getStationName()+"%' ";
        }
        if(param.getAlmLevel()!=null){
            sql+=" and history.alm_level="+param.getAlmLevel()+" ";
        }
        List<Integer> almIds=param.getAlmIds();
        if(almIds!=null&&almIds.size()>0){
            sql+=" and history.alm_id in ( ";
            for (int i=0;i<almIds.size();i++) {
                sql+=almIds.get(i);
                if(i!=(almIds.size()-1)){
                    sql+=",";
                }
            }
            sql+=")";
        }
        if(param.getUid()>100){
            sql+=" and tb_batt_inf.station_id  in(" +
                    "            select distinct station_id from db_user.tb_baojigroup_power,db_user.tb_baojigroup_usr " +
                    "            where   tb_baojigroup_power.baoji_group_id=tb_baojigroup_usr.baoji_group_id " +
                    "            and tb_baojigroup_usr.uid="+param.getUid()+
                    "            )";
        }
        List list = sqlExecuteService.executeQuery_call(sql, new CallBack() {
            @Override
            public List getResults(ResultSet rs) throws SQLException {
                LinkedList<Object> temp = new LinkedList<>();
                try {
                    while (rs.next())
                        temp.add(rs.getInt("number"));
                } catch (SQLException e) {
                    e.printStackTrace();
                }
                return temp;
            }
        });
        int num =0;
        if(list!=null){
            num= (int) list.get(0);
        }
        return num;
    }
    //获取设备历史告警集合
    public List getDevAlmHisList(DevAlmPar param){
        String sql="SELECT  history.num,dev_id,dev_ip,alm_level,alm_start_time,alm_end_time,alm_is_confirmed,alm_confirmed_time,alm_cleared_type,alm_severity, " +
                "   tb_station_inf.station_name,tb_station_inf.provice,tb_station_inf.city,tb_station_inf.country,tb_batt_inf.dev_name  " +
                "   FROM db_alarm."+param.getRecordYear()+" history,db_station.tb_batt_inf,db_station.tb_station_inf " +
                " where  history.dev_id=tb_batt_inf.dev_id "+
                " and tb_batt_inf.station_id=tb_station_inf.station_id "+
                " and alm_start_time>='"+ThreadLocalUtil.format(param.getAlmStartTime(),1)+"' and alm_start_time <='"+ThreadLocalUtil.format(param.getAlmEndTime(),1)+"'  " ;
        if(param.getProvice()!=null){
            sql+=" and tb_station_inf.province='"+param.getProvice()+"' ";
        }
        if(param.getCity()!=null){
            sql+=" and tb_station_inf.city='"+param.getCity()+"' ";
        }
        if(param.getCountry()!=null){
            sql+=" and tb_station_inf.country='"+param.getCountry()+"' ";
        }
        if(param.getStationName()!=null){
            sql+=" and tb_station_inf.station_name like '%"+param.getStationName()+"%' ";
        }
        if(param.getAlmLevel()!=null){
            sql+=" and history.alm_level="+param.getAlmLevel()+" ";
        }
        List<Integer> almIds=param.getAlmIds();
        if(almIds!=null&&almIds.size()>0){
            sql+=" and history.alm_id in ( ";
            for (int i=0;i<almIds.size();i++) {
                sql+=almIds.get(i);
                if(i!=(almIds.size()-1)){
                    sql+=",";
                }
            }
            sql+=")";
        }
        if(param.getUid()>100){
            sql+=" and tb_batt_inf.station_id  in(" +
                    "            select distinct station_id from db_user.tb_baojigroup_power,db_user.tb_baojigroup_usr " +
                    "            where   tb_baojigroup_power.baoji_group_id=tb_baojigroup_usr.baoji_group_id " +
                    "            and tb_baojigroup_usr.uid="+param.getUid()+
                    "            )";
        }
        sql+="   order by history.alm_start_time desc,history.dev_id asc limit "+param.getLimitStart()+","+param.getLimitEnd()+" ";
        List list = sqlExecuteService.executeQuery_call(sql, new CallBack() {
            @Override
            public List getResults(ResultSet rs) throws SQLException {
                List<DevalarmDataHistory> list=new ArrayList<>();
                while (rs.next()){
                    DevalarmDataHistory ph=new DevalarmDataHistory();
                    ph.setNum(rs.getLong("num"));
                    ph.setDevId(rs.getInt("dev_id"));
                    ph.setDevIp(rs.getString("dev_ip"));
                    ph.setAlmLevel(rs.getInt("alm_level"));
                    ph.setAlmStartTime(rs.getTimestamp("alm_start_time"));
                    ph.setAlmEndTime(rs.getTimestamp("alm_end_time"));
                    ph.setAlmIsConfirmed(rs.getInt("alm_is_confirmed"));
                    ph.setAlmConfirmedTime(rs.getTimestamp("alm_confirmed_time"));
                    ph.setAlmClearedType(rs.getInt("alm_cleared_type"));
                    ph.setDevName(rs.getString("dev_name"));
                    ph.setStationName(rs.getString("station_name"));
                    ph.setProvice(rs.getString("provice"));
                    ph.setCity(rs.getString("city"));
                    ph.setCountry(rs.getString("country"));
                    list.add(ph);
                }
                return list;
            }
        });
        return list;
    }
    //电源历史告警数
    public int getPwrAlmHisCount(PwrAlmPar param){
        String sql="select  count(distinct alarm.num) as number from db_pwrdev_alarm."+param.getRecordYear()+" alarm" +
                ",db_station.tb_power_inf,db_station.tb_station_inf " +
                "  where alarm.power_id = tb_power_inf.power_id " +
                "  and  tb_power_inf.station_id=tb_station_inf.station_id "+
                " and alm_start_time>='"+ThreadLocalUtil.format(param.getAlmStartTime(),1)+"' and alm_start_time <='"+ThreadLocalUtil.format(param.getAlmEndTime(),1)+"'  " ;
        if(param.getProvice()!=null){
            sql+=" and tb_station_inf.province='"+param.getProvice()+"' ";
        }
        if(param.getCity()!=null){
            sql+=" and tb_station_inf.city='"+param.getCity()+"' ";
        }
        if(param.getCountry()!=null){
            sql+=" and tb_station_inf.country='"+param.getCountry()+"' ";
        }
        if(param.getStationName()!=null){
            sql+=" and tb_station_inf.station_name like '%"+param.getStationName()+"%' ";
        }
        if(param.getAlmLevel()!=null){
            sql+=" and history.alm_level="+param.getAlmLevel()+" ";
        }
        List<Integer> almIds=param.getAlmIds();
        if(almIds!=null&&almIds.size()>0){
            sql+=" and history.alm_id in ( ";
            for (int i=0;i<almIds.size();i++) {
                sql+=almIds.get(i);
                if(i!=(almIds.size()-1)){
                    sql+=",";
                }
            }
            sql+=")";
        }
        if(param.getUid()>100){
            sql+=" and tb_power_inf.power_id  in(" +
                    "            select distinct power_id from db_user.tb_baojigroup_power,db_user.tb_baojigroup_usr " +
                    "            where   tb_baojigroup_power.baoji_group_id=tb_baojigroup_usr.baoji_group_id " +
                    "            and tb_baojigroup_usr.uid="+param.getUid()+
                    "            )";
        }
        List list = sqlExecuteService.executeQuery_call(sql, new CallBack() {
            @Override
            public List getResults(ResultSet rs) throws SQLException {
                LinkedList<Object> temp = new LinkedList<>();
                try {
                    while (rs.next())
                        temp.add(rs.getInt("number"));
                } catch (SQLException e) {
                    e.printStackTrace();
                }
                return temp;
            }
        });
        int num =0;
        if(list!=null){
            num= (int) list.get(0);
        }
        return num;
    }
    //电源历史告警集合
    public List<PwrdevAlarmHistory> getPwrAlmHisList(PwrAlmPar param){
        String sql="select  alarm.*," +
                "  tb_station_inf.station_name,tb_station_inf.provice,tb_station_inf.city,tb_station_inf.country,tb_power_inf.power_name  " +
                " from db_pwrdev_alarm."+param.getRecordYear()+" alarm" +
                ",db_station.tb_power_inf,db_station.tb_station_inf " +
                "  where alarm.power_id = tb_power_inf.power_id " +
                "  and  tb_power_inf.station_id=tb_station_inf.station_id "+
                " and alm_start_time>='"+ThreadLocalUtil.format(param.getAlmStartTime(),1)+"' and alm_start_time <='"+ThreadLocalUtil.format(param.getAlmEndTime(),1)+"'  " ;
        if(param.getProvice()!=null){
            sql+=" and tb_station_inf.province='"+param.getProvice()+"' ";
        }
        if(param.getCity()!=null){
            sql+=" and tb_station_inf.city='"+param.getCity()+"' ";
        }
        if(param.getCountry()!=null){
            sql+=" and tb_station_inf.country='"+param.getCountry()+"' ";
        }
        if(param.getStationName()!=null){
            sql+=" and tb_station_inf.station_name like '%"+param.getStationName()+"%' ";
        }
        if(param.getAlmLevel()!=null){
            sql+=" and history.alm_level="+param.getAlmLevel()+" ";
        }
        List<Integer> almIds=param.getAlmIds();
        if(almIds!=null&&almIds.size()>0){
            sql+=" and history.alm_id in ( ";
            for (int i=0;i<almIds.size();i++) {
                sql+=almIds.get(i);
                if(i!=(almIds.size()-1)){
                    sql+=",";
                }
            }
            sql+=")";
        }
        if(param.getUid()>100){
            sql+=" and tb_power_inf.power_id  in(" +
                    "            select distinct power_id from db_user.tb_baojigroup_power,db_user.tb_baojigroup_usr " +
                    "            where   tb_baojigroup_power.baoji_group_id=tb_baojigroup_usr.baoji_group_id " +
                    "            and tb_baojigroup_usr.uid="+param.getUid()+
                    "            )";
        }
        sql+="order by alarm.alm_start_time desc limit "+param.getLimitStart()+","+param.getLimitEnd()+" ";
        List<PwrdevAlarmHistory> list = sqlExecuteService.executeQuery_call(sql, new CallBack() {
            @Override
            public List getResults(ResultSet rs) throws SQLException {
                List<PwrdevAlarmHistory> list=new ArrayList<>();
                while (rs.next()){
                    PwrdevAlarmHistory ph=new PwrdevAlarmHistory();
                    ph.setNum(rs.getLong("num"));
                    ph.setPowerId(rs.getInt("power_id"));
                    ph.setPowerName(rs.getString("power_name"));
                    ph.setAlmLevel(rs.getInt("alm_level"));
                    ph.setAlmStartTime(rs.getTimestamp("alm_start_time"));
                    ph.setAlmEndTime(rs.getTimestamp("alm_end_time"));
                    ph.setAlmValue(rs.getFloat("alm_value"));
                    ph.setAlmIsConfirmed(rs.getInt("alm_is_confirmed"));
                    ph.setAlmConfirmedTime(rs.getTimestamp("alm_confirmed_time"));
                    ph.setAlmClearedType(rs.getInt("alm_cleared_type"));
                    ph.setUsrId(rs.getInt("usr_Id"));
                    ph.setAlmTrigger(rs.getInt("alm_trigger"));
                    ph.setAlmSeverity(rs.getInt("alm_severity"));
                    ph.setStationName(rs.getString("station_name"));
                    ph.setProvice(rs.getString("provice"));
                    ph.setCity(rs.getString("city"));
                    ph.setCountry(rs.getString("country"));
                    list.add(ph);
                }
                return list;
            }
        });
        return  list;
    }
}
src/main/java/com/whyc/util/SubTablePageInfoUtil.java
File was deleted
src/main/java/com/whyc/util/SubTablePageInfoUtils.java
New file
@@ -0,0 +1,322 @@
package com.whyc.util;
import com.github.pagehelper.PageInfo;
import com.whyc.dto.AlmHis.BattAlarmRes;
import com.whyc.dto.AlmHis.BattAlmPar;
import com.whyc.dto.AlmHis.DevAlmPar;
import com.whyc.dto.AlmHis.PwrAlmPar;
import com.whyc.factory.ThreadPoolExecutorFactory;
import com.whyc.mapper.CommonMapper;
import com.whyc.pojo.db_alarm.BattalarmDataHistory;
import com.whyc.pojo.db_alarm.DevalarmDataHistory;
import com.whyc.pojo.db_pwrdev_alarm.PwrdevAlarmHistory;
import com.whyc.service.SubTablePageInfoService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.text.ParseException;
import java.util.*;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
/**
 * 数据量极大的表,按照年份分表,分页查询时获取数据
 */
@Component
public class SubTablePageInfoUtils {
    @Resource
    private CommonMapper commonMapper;
    @Autowired
    private SubTablePageInfoService subService;
    /**按年份表分页查询*/
   public PageInfo<Object> getPageInfo(int pageNum,int pageSize,
                                Date startTime,Date endTime,
                                String dbName,String tablePrefix,
                                Object pojo) throws ParseException {
        Map<String, List<Date>> queryTimeForSubTables = DateUtil.getQueryTimeForSubTablesDesc(startTime, endTime);
        //查询分表是否存在,存在则查询结果
        Map<String,Integer> queryCountMap = new LinkedHashMap<>();
        Set<String> tableYearKeySet = queryTimeForSubTables.keySet();
        for (String tableYear : tableYearKeySet) {
            List<Date> queryTime = queryTimeForSubTables.get(tableYear);
            String tableName;
            if(!tableYear.equals("default")){
                //数值
                tableName = tablePrefix+"_"+tableYear;
                String existTableName = commonMapper.existTable(dbName, tableName);
                if(existTableName == null){
                    continue;
                }
            }else{
                tableName = tablePrefix;
            }
            //====== 根据不同类型类型对象对应调整 ======
             if(pojo instanceof PwrAlmPar) {
                PwrAlmPar param = (PwrAlmPar) pojo;
                param.setAlmStartTime(queryTime.get(0));
                param.setAlmEndTime(queryTime.get(1));
                param.setRecordYear(tableName);
                int currentCount = subService.getPwrAlmHisCount(param);
                queryCountMap.put(tableYear, currentCount);
            }
        }
        //分页信息
        //确认总页数,总记录数
        PageInfo<Object> pageInfo = new PageInfo<>();
        int total = 0;
        Set<String> queryKeySet = queryCountMap.keySet();
        for (String queryKey : queryKeySet) {
            int size = queryCountMap.get(queryKey);
            total+=size;
        }
        int pages = (int) Math.ceil(Float.parseFloat(String.valueOf(total))/pageSize);
        pageInfo.setTotal(total);
        pageInfo.setPages(pages);
        pageInfo.setPageNum(pageNum);
        pageInfo.setPageSize(pageSize);
        //根据当前页所需记录,查询当前页记录
        int startNum = (pageNum-1)*pageSize+1;
        int endNum = pageNum*pageSize;
        //最后一个算法:上面不应该先查询所有记录,应该取count. 这后面定位到哪个表或哪几张表后,采取limit获取当前页记录数;
        //格式:{表名,[limit 2,20]}
        Map<String,List<Integer>> tableAndLimitMap = MathUtil.getQueryTableAndLimit(startNum,endNum,pageSize,queryCountMap);
        Set<String> keySet = tableAndLimitMap.keySet();
        List<Object> dataList = new LinkedList<>();
        for (String key : keySet) {
            List<Date> queryTime = queryTimeForSubTables.get(key);
            //====== 根据不同类型类型对象对应调整 ======
            String recordYear = key.equals("default") ? tablePrefix : tablePrefix + "_" + key;
           if (pojo instanceof PwrAlmPar) {
                PwrAlmPar data = (PwrAlmPar) pojo;
                data.setAlmStartTime(queryTime.get(0));
                data.setAlmEndTime(queryTime.get(1));
                List<Integer> limitList = tableAndLimitMap.get(key);
                data.setLimitStart(limitList.get(0));
                data.setLimitEnd(limitList.get(1));
                data.setRecordYear(recordYear);
                List<PwrdevAlarmHistory> list= subService.getPwrAlmHisList(data);
                dataList.addAll(list);
            }
        }
        pageInfo.setList(dataList);
        return pageInfo;
    }
    /**按月分表,分页查询*/
    public PageInfo<Object> getPageInfoByMonthTable(int pageNum,int pageSize,
                                        Date startTime,Date endTime,
                                        String dbName,String tablePrefix,
                                        Object pojo) throws ParseException, InterruptedException {
        Map<String, List<Date>> queryTimeForSubTables = DateUtil.getQueryTimeForSubTablesByMonthDesc(startTime, endTime);
        //查询分表是否存在,存在则查询结果
        Map<String,Integer> queryCountMap = new LinkedHashMap<>();
        Set<String> tableYearKeySet = queryTimeForSubTables.keySet();
        //优化1-查询所有的符合月份规则的表和主表
        List<String> tableNameListDB = getTableList(dbName, tablePrefix, tablePrefix + "(_[0-9]{4}_[0-9]{2})?");
        List<String> tableYearListInDB = new LinkedList<>(); //查询时间段内的年月分表集合且在数据库中存在
        //过滤掉时间段内数据库中不存在的年月分表
        for (String tableYear : tableYearKeySet) {
            String tableName;
            if(!tableYear.equals("default")){
                //数值
                tableName = tablePrefix+"_"+tableYear;
                //String existTableName = commonMapper.existTable(dbName, tableName);
                if(!tableNameListDB.contains(tableName)){ //优化1-数据库中不存在,去除多次查表,一次查出
                    continue;
                }
            }
            tableYearListInDB.add(tableYear);
        }
        //查询年月分表的记录数
        //优化2:多线程读取
        ThreadPoolExecutor pool = ThreadPoolExecutorFactory.getPoolExecutor();
        CountDownLatch latch = new CountDownLatch(tableYearListInDB.size());
        for (String tableYear : tableYearListInDB) {
            List<Date> queryTime = queryTimeForSubTables.get(tableYear);
            String tableName;
            if(!tableYear.equals("default")){
                //数值
                tableName = tablePrefix+"_"+tableYear;
            }else{
                tableName = tablePrefix;
            }
            pool.execute(()-> {
                //====== 根据不同类型类型对象对应调整 ======
                if (pojo instanceof BattAlmPar) { //电池告警历史
                    BattAlmPar param = new BattAlmPar();
                    BeanUtils.copyProperties(pojo,param);
                    param.setAlmStartTime(queryTime.get(0));
                    param.setAlmEndTime(queryTime.get(1));
                    param.setRecordYear(tableName);
                    int currentCount = subService.getBattAlmHisCount(param);
                    queryCountMap.put(tableYear, currentCount);
                }
                else if (pojo instanceof DevAlmPar) {
                    DevAlmPar param = new DevAlmPar();
                    BeanUtils.copyProperties(pojo,param);
                    param.setAlmStartTime(queryTime.get(0));
                    param.setAlmEndTime(queryTime.get(1));
                    param.setRecordYear(tableName);
                    int currentCount = subService.getDevAlmHisCount(param);
                    queryCountMap.put(tableYear, currentCount);
                }
                latch.countDown();
            });
        }
        latch.await();
        //因为多线程后无序,需要重排序
        List<String> keySetDesc = queryCountMap.keySet().stream().sorted(Comparator.reverseOrder()).collect(Collectors.toList());
        Map<String,Integer> queryCountMapDesc = new LinkedHashMap<>();
        for (String key : keySetDesc) {
            Integer count = queryCountMap.get(key);
            queryCountMapDesc.put(key,count);
        }
        //分页信息
        //确认总页数,总记录数
        PageInfo<Object> pageInfo = new PageInfo<>();
        int total = 0;
        Set<String> queryKeySet = queryCountMap.keySet();
        for (String queryKey : queryKeySet) {
            int size = queryCountMap.get(queryKey);
            total+=size;
        }
        int pages = (int) Math.ceil(Float.parseFloat(String.valueOf(total))/pageSize);
        pageInfo.setTotal(total);
        pageInfo.setPages(pages);
        pageInfo.setPageNum(pageNum);
        pageInfo.setPageSize(pageSize);
        //根据当前页所需记录,查询当前页记录
        int startNum = (pageNum-1)*pageSize+1;
        int endNum = pageNum*pageSize;
        //最后一个算法:上面不应该先查询所有记录,应该取count. 这后面定位到哪个表或哪几张表后,采取limit获取当前页记录数;
        //格式:{表名,[limit 2,20]}
        Map<String,List<Integer>> tableAndLimitMap = MathUtil.getQueryTableAndLimit(startNum,endNum,pageSize,queryCountMapDesc);
        Set<String> keySet = tableAndLimitMap.keySet();
        List<Object> dataList = new LinkedList<>();
        for (String key : keySet) {
            List<Date> queryTime = queryTimeForSubTables.get(key);
            //====== 根据不同类型类型对象对应调整 ======
            String recordYear = key.equals("default") ? tablePrefix : tablePrefix + "_" + key;
            if (pojo instanceof BattAlmPar) {
                BattAlmPar data = (BattAlmPar) pojo;
                data.setAlmStartTime(queryTime.get(0));
                data.setAlmEndTime(queryTime.get(1));
                List<Integer> limitList = tableAndLimitMap.get(key);
                data.setLimitStart(limitList.get(0));
                data.setLimitEnd(limitList.get(1));
                data.setRecordYear(recordYear);
                List<BattAlarmRes> list = subService.getBattAlmHisList(data);
                dataList.addAll(list);
            }
            else if (pojo instanceof DevAlmPar) {
                DevAlmPar data = (DevAlmPar) pojo;
                data.setAlmStartTime(queryTime.get(0));
                data.setAlmEndTime(queryTime.get(1));
                List<Integer> limitList = tableAndLimitMap.get(key);
                data.setLimitStart(limitList.get(0));
                data.setLimitEnd(limitList.get(1));
                data.setRecordYear(recordYear);
                List<DevalarmDataHistory> list =  subService.getDevAlmHisList(data);
                dataList.addAll(list);
            }
        }
        pageInfo.setList(dataList);
        return pageInfo;
    }
    /**查询是否包含特定规则的表,存在,则返回表名*/
    public List<String> getTableList(String dbName,String tableLike,String regex){
        List<String> resultTableList = new LinkedList<>();
        List<String> tableList = commonMapper.getTableListLike(dbName,tableLike);
        for (String tableName : tableList) {
            boolean matches = Pattern.matches(regex, tableName);
            if(matches){
                resultTableList.add(tableName);
            }
        }
        return resultTableList;
    }
   /* *//**所有记录分为四级查询个数*//*
    public List<Integer> getLevelList(int uId,String dbName,String tableLike,String regex,List<Integer> almTypes ){
        List<Integer> result = new LinkedList<>();
        List<String> tableList = getTableList(dbName, tableLike, regex);
        List<Integer> levelList = new LinkedList();
        for (String tableName : tableList) {
            List<BattalarmDataHistory> levelInfoSubList;
            List<Integer> levelSubList;
            if(tableLike.equals("tb_battalarm_data_history")) {
                //levelInfoSubList = battAlarmDataHistoryMapper.getLevelSubList(uId, tableName);
                levelInfoSubList = subService.getLevelSubList_batt(uId, tableName);
            }
            else if(tableLike.equals("tb_devalarm_data_history")){
                //levelInfoSubList = devAlarmDataHistoryMapper.getLevelSubList(uId, tableName);
                levelInfoSubList = subService.getLevelSubList_dev(uId, tableName);
            }
            else{
                //levelInfoSubList = powerAlarmHistoryMapper.getLevelSubList(uId, tableName,almTypes);
                levelInfoSubList = subService.getLevelSubList_pwr(uId, tableName,almTypes);
            }
            levelSubList = levelInfoSubList.stream().map(BattalarmDataHistory::getAlmLevel).collect(Collectors.toList());
            levelList.addAll(levelSubList);
        }
        //分为四级查询个数
        Map<Integer, List<Integer>> levelMap = levelList.stream().collect(Collectors.groupingBy(Integer::intValue));
        Set<Integer> levelSet = levelMap.keySet();
        List<Integer> listOfLevelSet = new LinkedList();
        //补齐1,2,3,4四级
        listOfLevelSet.add(1);
        listOfLevelSet.add(2);
        listOfLevelSet.add(3);
        listOfLevelSet.add(4);
        if(!levelSet.contains(1)){
            levelMap.put(1,new LinkedList<>());
        }
        if(!levelSet.contains(2)){
            levelMap.put(2,new LinkedList<>());
        }
        if(!levelSet.contains(3)){
            levelMap.put(3,new LinkedList<>());
        }
        if(!levelSet.contains(4)){
            levelMap.put(4,new LinkedList<>());
        }
        //待测试
        for (Integer level : listOfLevelSet) {
            result.add(levelMap.get(level).size());
        }
        return result;
    }
*/
    public static void main(String[] args) {
        //String regex = "tb_battalarm_data_history_?[0-9]*";
        String regex = "tb_battalarm_data_history(_[0-9]{4}_[0-9]{2})?";
        //String table = "tb_battalarm_data_history";
        String table = "tb_battalarm_data_history_0222_04";
        System.out.println(Pattern.matches(regex,table));
    }
}
src/main/resources/mapper/CommonMapper.xml
@@ -6,7 +6,7 @@
    <select id="getMaxValue" resultType="java.lang.Object">
        select max(${field}) from ${schema}.${table}
    </select>
    <select id="existTable" resultType="java.lang.Boolean">
    <select id="existTable" resultType="java.lang.String">
        select
            table_name
        from `INFORMATION_SCHEMA`.`TABLES`