whyclj
2020-09-24 330f322c225b80e4580b6b813ecc8285869273af
添加蓄电池组历史实时数据记录
2个文件已添加
3个文件已修改
257 ■■■■■ 已修改文件
BattMonitor_FBS9600SMore/src/com/battmonitor/base/Com.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
BattMonitor_FBS9600SMore/src/com/battmonitor/sql/Sql_Mysql.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
BattMonitor_FBS9600SMore/src/com/dev_fbs9600s/data/Batt_RealDataRecord_Thread.java 132 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
BattMonitor_FBS9600SMore/src/com/dev_fbs9600s/data/Batt_RealDataRecord_Thread_SQL.java 114 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
BattMonitor_FBS9600SMore/src/main/main_MonitorServer_FBS9600SMore.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
BattMonitor_FBS9600SMore/src/com/battmonitor/base/Com.java
@@ -15,6 +15,7 @@
    final public static String DTF_YMDhm = "yyyy-MM-dd HH:mm";
    final public static String DTF_YMDh = "yyyy-MM-dd HH";
    final public static String DTF_YMD = "yyyy-MM-dd";
    final public static String DTF_Y_M_D = "yyyy_MM_dd";
    final public static String DTFYMD = "yyyyMMdd";
    final public static String DTF_hms = "HH:mm:ss";
    final public static String DTF_YMD_h_m_s = "yyyy-MM-dd+HH_mm_ss";
BattMonitor_FBS9600SMore/src/com/battmonitor/sql/Sql_Mysql.java
@@ -23,6 +23,7 @@
    final public static String DB_RamDB_BATT_RT = "`db_ram_batt_rt`";
    
    final public static String WEB_Site = "`web_site`";
    final public static String DB_Batt_History = "`db_batt_history`";
    //--------------------------------------------------------------------------------------------//
    public final static String TB_HardDevSmsState = "tb_hard_dev_sms_state";
    //--------------------------------------------------------------------------------------------//
@@ -123,6 +124,9 @@
    public final static String UserPermitGroupTable = DB_USER + ".`tb_user_permitgroup`";
    public final static String UserPermitGroupDataTable = DB_USER + ".`tb_user_permitgroup_data`";
    public final static String UserJieJiaRiTable = DB_USER + ".`tb_user_jiejiari`";
    public final static String BattRealDataTable = DB_Batt_History + ".tb_batt_realdata_";        //蓄电池组历史实时记录表
    //--------------------------------------------------------------------------------------------//
    //--------------------------------------------------------------------------------------------//
    public Connection mysql_con = null;
BattMonitor_FBS9600SMore/src/com/dev_fbs9600s/data/Batt_RealDataRecord_Thread.java
New file
@@ -0,0 +1,132 @@
package com.dev_fbs9600s.data;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import com.battmonitor.base.Com;
import com.battmonitor.data.BattData_RT;
import com.battmonitor.data.BattData_RT_Array;
import com.battmonitor.sql.MysqlConnPool;
public class Batt_RealDataRecord_Thread implements Runnable{
    public static final int TESTDATA_RECORD_INTERVAL = 10;                //记录数据间隔
    public static final int MAX_SAVE_DAY_COUNT = 30;
    public MysqlConnPool pool;
    public List<TestData_Record_Thread> threads;
    public BattData_RT_Array battData;
    public Batt_RealDataRecord_Thread(MysqlConnPool pool,BattData_RT_Array battData){
        this.pool = pool;
        this.battData = battData;
        threads = new ArrayList<>();
    }
    @Override
    public void run() {
        System.out.println("Batt_RealDataRecord_Thread Start at "+Com.getDateTimeFormat(new Date(), Com.DTF_YMDhms));
        Date now = null;
        Date last = new Date(0);
        while(true) {
            try {
                now = new Date();
                for(int i=0;i<battData.getItemCount();i++) {
                    boolean isExist = false;
                    BattData_RT batt = battData.getItem(i);
                    for(int k=0;k<threads.size();k++) {
                        if(threads.get(k).batt.BattGroupId == batt.BattGroupId) {
                            isExist = true;
                            break;
                        }
                    }
                    if(!isExist) {
                        TestData_Record_Thread thread = new TestData_Record_Thread(pool, batt);
                        threads.add(thread);
                        new Thread(thread).start();
                    }
                    //构造今天和明天的历史实时数据表
                    Batt_RealDataRecord_Thread_SQL.createBatt_RealDataTable(pool, batt.BattGroupId, now);
                    Batt_RealDataRecord_Thread_SQL.createBatt_RealDataTable(pool, batt.BattGroupId, tomorrow(now));
                }
                Date del_time = getDateBefore(now,MAX_SAVE_DAY_COUNT);
                Batt_RealDataRecord_Thread_SQL.deleteHistoryData(pool, del_time);
                //System.out.println(Com.getDateTimeFormat(del_time, Com.DTF_YMDhms));
                Thread.sleep(3000);
            } catch (Exception e) {
                try {
                    Thread.sleep(5000);
                } catch (InterruptedException e1) {
                    e1.printStackTrace();
                }
                e.printStackTrace();
            }
        }
    }
    class TestData_Record_Thread implements Runnable{
        public MysqlConnPool pool;
        public BattData_RT batt;
        public TestData_Record_Thread(MysqlConnPool pool,BattData_RT batt) {
            this.pool = pool;
            this.batt = batt;
        }
        @Override
        public void run() {
            Date last = new Date(0);        //上一次测试的时间
            Date now = null;                //当前时间
            while(true) {
                try {
                    now = new Date();
                    long timelong = (now.getTime()-last.getTime())/1000;
                    if(timelong >= TESTDATA_RECORD_INTERVAL) {
                        if(batt.getBattState()>0) {
                            //通讯正常
                            Batt_RealDataRecord_Thread_SQL.insertBatt_RealDataTable(pool, batt, now);
                            last = now;
                        }
                    }
                    Thread.sleep(500);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }
    /**
     *     返回明天日期
     * @param today
     * @return
     */
    public Date tomorrow(Date today) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(today);
        calendar.set(Calendar.DATE, calendar.get(Calendar.DATE) + 1);
        return calendar.getTime();
    }
    /**
     * 获取指定时间之前多少天的时间
     * @param d
     * @param day
     * @return
     */
    public static Date getDateBefore(Date d,int day){
        Calendar now =Calendar.getInstance();
        now.setTime(d);
        now.set(Calendar.DATE,now.get(Calendar.DATE)-day);
        return now.getTime();
    }
}
BattMonitor_FBS9600SMore/src/com/dev_fbs9600s/data/Batt_RealDataRecord_Thread_SQL.java
New file
@@ -0,0 +1,114 @@
package com.dev_fbs9600s.data;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Date;
import com.battmonitor.base.Com;
import com.battmonitor.data.BattData_RT;
import com.battmonitor.sql.MysqlConnPool;
import com.battmonitor.sql.Sql_Mysql;
public class Batt_RealDataRecord_Thread_SQL {
    /**
     *     创建电池组历史实时记录表
     * @param pool
     * @param BattGroupId
     * @param time
     */
    public static void createBatt_RealDataTable(MysqlConnPool pool,int BattGroupId,Date time) {
        String sql_str = "CREATE TABLE IF NOT EXISTS "+Sql_Mysql.BattRealDataTable+BattGroupId+"_"+Com.getDateTimeFormat(time, Com.DTF_Y_M_D)+" (" +
                "  num bigint(20) NOT NULL AUTO_INCREMENT," +
                "  BattGroupId int(11) NOT NULL DEFAULT '10001' COMMENT '电池组id'," +
                "  record_time datetime NOT NULL DEFAULT '2000-01-01 00:00:00' COMMENT '记录时间'," +
                "  group_vol float NOT NULL DEFAULT '0' COMMENT '组端电压'," +
                "  online_vol float NOT NULL DEFAULT '0' COMMENT '在线电压'," +
                "  group_curr float NOT NULL DEFAULT '0' COMMENT '组端电流'," +
                "  batt_state int(11) NOT NULL DEFAULT '0' COMMENT '电池状态'," +
                "  note varchar(255) NOT NULL DEFAULT '' COMMENT '备用'," +
                "  PRIMARY KEY (num)," +
                "  KEY index_battgroupid (BattGroupId) USING BTREE," +
                "  KEY index_record_time (record_time) USING BTREE" +
                ") ENGINE=InnoDB DEFAULT CHARSET=utf8;";
        Sql_Mysql sql = new Sql_Mysql(pool.getConn());
        try {
            //System.out.println(sql_str);
            sql.sqlMysqlExecute(sql_str);
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            sql.close_con();
        }
    }
    /**
     *     删除创建时间超时的历史实时记录表
     * @param conn_pool
     * @param deldate
     */
    public static void deleteHistoryData(MysqlConnPool conn_pool,Date deldate) {
        String sql_select_strs = " select TABLE_NAME,UPDATE_TIME,CREATE_TIME " +
                                 " from information_schema.tables " +
                                 " where table_schema='db_batt_history' " +
                                 " AND TABLE_NAME like 'tb_batt_realdata_%' " +
                                 " AND CREATE_TIME <= '"+Com.getDateTimeFormat(deldate, Com.DTF_YMDhms)+"';" ;
        String sql_delete_strs = " DROP TABLE IF EXISTS ";
        Sql_Mysql sql = new Sql_Mysql(conn_pool.getConn());
        ResultSet res = null;
        int count = 0;
        res = sql.sqlMysqlQuery(sql_select_strs);
        try {
            while(res.next()) {
                if(count > 0) {
                    sql_delete_strs += ",";
                }
                sql_delete_strs += "db_batt_history." + res.getString("TABLE_NAME");
                System.out.println("删除:"+res.getString("TABLE_NAME")+"\t at "+Com.getDateTimeFormat(new Date(), Com.DTF_YMDhms));
                count++;
            }
            if(count >0) {
                sql.sqlMysqlExecute(sql_delete_strs);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            if(res != null) {
                try {
                    res.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            sql.close_con();
        }
    }
    /**
     *     插入历史实时数据
     * @param pool
     * @param batt
     * @param time
     */
    public static void insertBatt_RealDataTable(MysqlConnPool pool,BattData_RT batt,Date time) {
        String sql_str ="INSERT INTO "+Sql_Mysql.BattRealDataTable+batt.BattGroupId+"_"+Com.getDateTimeFormat(time, Com.DTF_Y_M_D)+"(BattGroupId,record_time,group_vol,online_vol,group_curr,batt_state) values("
                + ""+batt.BattGroupId
                + ",'"+Com.getDateTimeFormat(time, Com.DTF_Y_M_D)
                + "',"+batt.getGroupVol()
                + "," +batt.getOnlineVol()
                + "," +batt.getTestCurr()
                + "," +batt.getBattState()
                + ")";
        Sql_Mysql sql = new Sql_Mysql(pool.getConn());
        try {
            sql.sqlMysqlExecute(sql_str);
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            sql.close_con();
        }
    }
}
BattMonitor_FBS9600SMore/src/main/main_MonitorServer_FBS9600SMore.java
@@ -11,6 +11,7 @@
import com.config.AppConfig;
import com.dev_fbs9600.data.FBS9600_ServerSocket_Thread;
import com.dev_fbs9600.data.FBS9600_Task_Thread;
import com.dev_fbs9600s.data.Batt_RealDataRecord_Thread;
import com.dev_fbs9600s.data.FBS9600S_ServerSocket_Thread;
import com.dev_fbs9600s.data.FBS9600S_SocketClient_Thread_SQL;
@@ -191,6 +192,11 @@
            */
        }
        {
            Batt_RealDataRecord_Thread record_thread = new Batt_RealDataRecord_Thread(GB_MysqlConnPool, GB_DataArray);
            new Thread(record_thread).start();
        }
        {
            FBS9600S_ServerSocket_Thread task_9600s_server = new FBS9600S_ServerSocket_Thread(GB_MysqlConnPool, GB_DataArray);
            task_9600s_server.start();
        }