whyclj
2019-11-02 7b0d9dc2adc6da45cb5593456c58d83a21de0cfe
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
package com.dev.fbs9009;
 
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
 
import com.base.Com;
import com.battdata_rt.BattData_RT;
import com.battdata_rt.BattData_RT_Array;
import com.config.AppConfig;
import com.config.AppParam;
import com.sql.MysqlConnPool;
 
public class MyModBusRecordDataThread2 extends Thread{
    private MysqlConnPool mysql_pool; 
    private BattData_RT_Array DataArray;
    private AppParam app_Param;                                            //Èí¼þÉèÖõIJÎÊý
    private List<RecordDataThread> recordThreads;                        //µ±Ç°ÕýÔÚÔËÐеļǼÀúÊ·Êý¾ÝµÄÏß³Ì
    private long timeout = 60*60;                                        //³¬Ê±Ê±³¤(1Сʱ)
 
    public MyModBusRecordDataThread2(MysqlConnPool gB_MysqlConnPool, BattData_RT_Array gB_DataArray,
            AppParam gB_App_Param) {
        this.mysql_pool = gB_MysqlConnPool;
        this.app_Param = gB_App_Param;
        this.DataArray = gB_DataArray;
        
        this.recordThreads = new ArrayList<RecordDataThread>();
    }
    
    
    @Override
    public void run() {
        MyModBusSocketThread_SQL.createTb_ld9testdata_inf(mysql_pool);        //´´½¨ÀúÊ·Êý¾ÝµÄinf±í
        System.out.println("MyModBusRecordDataThread Start at "+Com.getDateTimeFormat(new Date(), Com.DTF_YMDhms));
        while(true){
            try {
                //ʶ±ðµ±Ç°ËùÓеÄÉ豸ÖÐÊÇ·ñ´æÔÚÕýÔÚºËÈݲâÊÔµÄÉ豸
                for(int i=0;i<this.DataArray.getItemCount();i++){
                    MyModBusData ld9ModBusData = this.DataArray.getItem(i).myModBusData;
                    for(int j = 0;ld9ModBusData != null && j< ld9ModBusData.getDev_count();j++) {
                        int test_monnum = 0;
                        if((ld9ModBusData.getLd_sys()[j] != null) 
                                && (ld9ModBusData.getLd_sys()[j] != null) 
                                && (test_monnum = ld9ModBusData.getLd_sys()[j].getNowTestMonNum())>0 
                                && (ld9ModBusData.getLd_batt_states()[j].isDischarge())
                                && (test_monnum == ld9ModBusData.getLd_batt_states()[j].getNowTestMonnum())                //Åжϵ±Ç°ÕýÔڷŵçµÄµ¥ÌåÊÇͬһ½Úʱ²Å¿ªÊ¼¼Ç¼Êý¾Ý£¨½â¾öÊý¾ÝÑÓ³Ùbug£©
                                ){        
                            
                            test_monnum = 9*j+test_monnum;                        //µ±Ç°²âÊÔµÄµç³Ø×éµ¥Ìå±àºÅ
                            if(!isExistInDischage(recordThreads,this.DataArray.getItem(i),test_monnum) && !isTimeOut(ld9ModBusData.getThreadRunTime(), timeout)){
                                System.err.println(ld9ModBusData.getBattgroupid()+"ÕýÔÚ½øÐкËÈݲâÊÔ...." + test_monnum);
                                
                                RecordDataThread thread = new RecordDataThread(mysql_pool,DataArray.getItem(i), app_Param,j);
                                recordThreads.add(thread);
                                thread.start();
                            }
                        }
                    }
                }
                sleep(500);
                
                if(recordThreads.size() > 0) {
                    //ÒÆ³ýÒѾ­¼Ç¼Íê³ÉµÄ·Åµç¼Ç¼Ïß³Ì
                    for(Iterator<RecordDataThread> it = recordThreads.iterator();it.hasNext();) {
                        RecordDataThread thread = it.next();
                        if(thread.thread_over) {
                            it.remove();
                        }
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    
    /*
     *     ÅжÏÊÇ·ñÒѾ­ÔڼǼµ±Ç°ÕýÔڷŵçµÄµç³Ø×éÐÅÏ¢
     */
    public boolean isExistInDischage(List<RecordDataThread> recordThread,BattData_RT rtdata,int test_monnum){
        boolean flag = false;
        for(int i=0;i<recordThread.size();i++){
            if(recordThread.get(i).getBattData().BattGroupId == rtdata.BattGroupId 
                    && recordThread.get(i).thread_isRuning 
                    && recordThread.get(i).test_monnum == test_monnum
            ){
                flag = true;            //µ±Ç°µç³Ø×éµÄ·ÅµçÊý¾ÝÕýÔڼǼ
                break;
            }
        }
        return flag;
    }
    
    /**
     *     ÅжÏÖ¸¶¨Ê±¼ä¾àÀ뵱ǰʱ¼äÊÇ·ñ³¬Ê±
     * @param time            ÐèÒªÅжϵÄʱ¼ä
     * @param timeout2        ³¬Ê±Ê±³¤(Ãë)
     * @return
     */
    public boolean isTimeOut(Date time,long timeout2){
        Date now = new Date();
        long timelong = Math.abs((now.getTime() - time.getTime())/1000);
        if(timelong > timeout2){
            return true;
        }else{
            return false;
        }
    }
    
    //¼Ç¼ÀúÊ·Êý¾ÝÏß³Ì
    class RecordDataThread extends Thread{
        private boolean thread_isRuning = true;
        private boolean thread_over = false;
        public int test_monnum;                            //±»²âµç³Ø×éµ¥Ìå±àºÅ(1-9*n)
        public int dev_index;
        private BattData_RT battData;
        private MysqlConnPool mysql_pool;
        private AppParam app_Param;
        
        public RecordDataThread(MysqlConnPool gB_MysqlConnPool, BattData_RT battData,    AppParam gB_App_Param,int dev_index){
            this.mysql_pool = gB_MysqlConnPool;
            this.battData = battData;
            this.app_Param = gB_App_Param;
            this.dev_index = dev_index;
        }
        
        @Override
        public void run() {
            long SaveDataTimeInterval = app_Param.getSaveDataTimeInterval(AppParam.AppParam_Discharge);                //»ñÈ¡±£´æÊý¾ÝµÄʱ¼ä¼ä¸ô
            long minTestTime = app_Param.getTestTimeLongMinimum(AppParam.AppParam_Discharge);                        //»ñÈ¡±£´æÊý¾ÝµÄ×îÉÙʱ³¤
            
            //´´½¨µ±Ç°µç³Ø×éµÄ²âÊԼǼ±í¸ñ     _id±í
            MyModBusSocketThread_SQL.createTb_ld9testdata(mysql_pool,battData.BattGroupId);
            //´´½¨µ±Ç°µç³Ø×éµÄ²âÊԼǼ±í¸ñ   stop_id±í
            MyModBusSocketThread_SQL.createTb_ld9testdatastop(mysql_pool,battData.BattGroupId);
            
            MyModBusData myModBusData = battData.myModBusData;
            
            
            Date lasttime = new Date();
            LD_sys_state sys_state = myModBusData.getLd_sys()[dev_index];
            LD_batt_states batt_state = myModBusData.getLd_batt_states()[dev_index];
            
            sys_state.setTest_starttime(lasttime);
            sys_state.setNewRecord(true);
            
            //int maxTestRecordCount = MyModBusSocketThread_SQL.searchMaxTestReCord(mysql_pool,battData.BattGroupId);            //ÉèÖõ±Ç°²âÊԵIJâÊÔ±ÊÊý
            LD_sys_state last_sys_state = MyModBusSocketThread_SQL.searchMaxTestRecordByBattGroupId(mysql_pool, battData.BattGroupId);
            int test_record_count = 0;
            sys_state.setTest_mon_num(sys_state.getNowTestMonNum());
            this.test_monnum = 9*dev_index + sys_state.getNowTestMonNum();
            if(last_sys_state != null){
                //int mon_num = MyModBusSocketThread_SQL.searchMaxMonNum(mysql_pool,battData.BattGroupId,maxTestRecordCount);
                //boolean isExist = MyModBusSocketThread_SQL.searchMonHasDischarge(mysql_pool,battData.BattGroupId,last_sys_state.getTest_record_count(),this.test_monnum);
                
                boolean isMaxMon = MyModBusSocketThread_SQL.searchDeviceHasDischarge(mysql_pool,this,last_sys_state.getTest_record_count());            //¼ì²éµ±Ç°µç³Ø×é×îºóÒ»´Î²âÊÔµ±Ç°É豸ÊÇ·ñ´æÔÚµ±Ç°µ¥ÌåºóÃæµ¥ÌåµÄ·ÅµçÊý¾Ý
                if(isMaxMon) {
                    test_record_count = last_sys_state.getTest_record_count() + 1;
                }else {
                    if(Math.abs((double)(new Date().getTime() - last_sys_state.getRecord_historytime().getTime()))/1000 > 24*60*60) {
                        test_record_count = last_sys_state.getTest_record_count() + 1;
                    }else {
                        test_record_count = last_sys_state.getTest_record_count();
                    }
                }
            }else{
                test_record_count = 1;
            }
            
            sys_state.setTest_record_count(test_record_count);
            sys_state.setRecord_num(1);                                //ÉèÖ÷ŵç¼Ç¼±ÊÊý
            
            while(thread_isRuning){                
                try {
                    if(isTimeOut(myModBusData.getThreadRunTime(), timeout) || sys_state.getRecord_num() > app_Param.getTestDataRecordCountMax(AppParam.AppParam_Discharge)){
                        //µ±Í¨Ñ¶³¬Ê±1Сʱ»òÕ߼ǼÊý¾Ý±ÊÊý³¬¹ýÖ¸¶¨±ÊÊýʱֹͣ¼Ç¼Êý¾Ý
                        myModBusData.getLd_batt_states()[dev_index].getLd_batts()[test_monnum-1].setStop_reason(0);            //ÉèÖ÷ŵçÍ£Ö¹Ô­Òò
                        thread_isRuning = false;
                    }
                    if(sys_state.isNewRecord()) {
                        sys_state.setRecord_num(1);;
                    }
                    Date nowDate = new Date();
                    long TimeInter = getTimeLong(lasttime,nowDate);
                    if(TimeInter >= SaveDataTimeInterval || sys_state.isNewRecord() || !batt_state.isDischarge()) {
                        lasttime = nowDate;
                        long testTimeLong = Math.abs(getTimeLong(sys_state.getTest_starttime(),nowDate));
                        sys_state.setTest_timelong(testTimeLong);
                        
                        //if(sys_state.getNowTestMonNum()>0){                                    //µ±Ç°ÕýÔڷŵç
                        if(batt_state.isDischarge()){                                    //µ±Ç°ÕýÔڷŵç
                            int now_test_monnum = batt_state.getNowTestMonnum()+dev_index*9;                //»ñÈ¡µ±Ç°µç³Ø×éÖзŵçµÄµ¥Ìå±àºÅ
                            
                            //±»²âµÄµç³Ø×éµ¥Ìå±àºÅ¸Ä±ä
                            if(now_test_monnum != test_monnum){                                //·ÅµçµÄµ¥Ìå·¢Éú±ä»¯Ê±
                                System.out.println(this.test_monnum+"---->"+now_test_monnum +"--->"+test_monnum+"·ÅµçµÄµ¥ÌåºÅ±ä»¯,½áÊø¼Ç¼");
                                thread_isRuning = false;
                            }
                            
                            sys_state.setRecord_historytime(lasttime);
                            MyModBusSocketThread_SQL.insertOrUpdate(mysql_pool,battData,dev_index);                //¸üвâÊÔµÄinf±íÖеÄÊý¾Ý
                            MyModBusSocketThread_SQL.insertOrUpdateMonData(mysql_pool,battData,dev_index);        //¸üвâÊÔ_ID±íÖеÄÊý¾Ý
                            MyModBusSocketThread_SQL.insertOrUpdateMonStopData(mysql_pool,battData,dev_index);    //¸üвâÊÔStop±íÖеÄÊý¾Ý
                            //System.out.println("¼Ç¼һ±ÈÊý¾Ý"+battData.record_num);
                            sys_state.setRecord_num(sys_state.getRecord_num()+1);;
                        }else {
                            System.out.println("·Åµç½áÊø");
                            thread_isRuning = false;
                        }
                        
                        if(!thread_isRuning) {
                            System.out.println("battgroupid:"+battData.BattGroupId+"\ttest_monnum"+test_monnum+"·Åµç½áÊø,²¢¼Ç¼×îºóÒ»±ÈÊý¾ÝµÄÍ£Ö¹Ô­Òò"+myModBusData.getLd_batt_states()[dev_index].getLd_batts()[sys_state.getTest_mon_num()-1].getStop_reason());            //¼ÌÐø¼Ç¼±¾´ÎµÄ×îºóÒ»±ÊÊý¾Ý
                            MyModBusSocketThread_SQL.updateStopReason(mysql_pool,battData,dev_index);
                            break;
                        }
                    }
                    sys_state.setNewRecord(false);
                    sleep(1000);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            thread_over = true;
        }
        
        /**
         * »ñÈ¡Á½¸öʱ¼äÖ®¼äµÄʱ¼ä¼ä¸ô(Ãë)
         * @param start
         * @param end
         * @return
         */
        public long getTimeLong(Date start,Date end){
            return Math.abs((end.getTime()-start.getTime())/1000);
        }
 
        public boolean isThread_isRuning() {
            return thread_isRuning;
        }
 
        public void setThread_isRuning(boolean thread_isRuning) {
            this.thread_isRuning = thread_isRuning;
        }
 
        public BattData_RT getBattData() {
            return battData;
        }
 
        public void setBattData(BattData_RT battData) {
            this.battData = battData;
        }
 
        public boolean isThread_over() {
            return thread_over;
        }
 
        public void setThread_over(boolean thread_over) {
            this.thread_over = thread_over;
        }
    }
    
}