lmstack 3 år sedan
förälder
incheckning
f29303600d

+ 22 - 19
LIB/FRONTEND/CellStateEstimation/BatSafetyAlarm/deploy.py

@@ -21,7 +21,7 @@ import datacompy
 import logging
 import multiprocessing
 #...................................电池包电芯安全诊断函数......................................................................................................................
-def diag_cal(df_sn, df_diag_ram, df_bms_ram, log_name):
+def diag_cal(df_sn, df_bms_ram, log_name):
     
     # 日志
     logger = logging.getLogger()
@@ -36,8 +36,8 @@ def diag_cal(df_sn, df_diag_ram, df_bms_ram, log_name):
     host2='rm-bp10j10qy42bzy0q77o.mysql.rds.aliyuncs.com'
     port2=3306
     db2='safety_platform'
-    user2='qx_read'
-    password2='Qx@123456'
+    user2='qx_algo_rw'
+    password2='qx@123456'
     
     db_res_engine = create_engine(
         "mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8".format(
@@ -47,6 +47,11 @@ def diag_cal(df_sn, df_diag_ram, df_bms_ram, log_name):
     conn = pymysql.connect(host=host2, port=port2, user=user2, password=password2, database=db2)
     cursor = conn.cursor()
     
+    result=pd.read_sql("select start_time, end_time, product_id, code, level, info, advice from all_fault_info where factory = '{}'".format('骑享'), db_res_engine)
+    result = result[['start_time', 'end_time', 'product_id', 'code', 'level', 'info', 'advice']]
+    df_diag_ram=result[(result['end_time']=='0000-00-00 00:00:00') & (result['code']==119)]
+    df_bms_ram=pd.DataFrame(columns=['time', 'sn', 'packvolt', 'cellvolt', 'celltemp'])
+    
     start=time.time()
     now_time=datetime.datetime.now()
     start_time=now_time-datetime.timedelta(seconds=70)
@@ -91,29 +96,29 @@ def diag_cal(df_sn, df_diag_ram, df_bms_ram, log_name):
                     df_bms_ram=df_bms_ram.drop(index=sn_index)
                     df_bms_ram=df_bms_ram.append(df_bms_res)
 
-                    sn_index=df_diag_ram.loc[df_diag_ram['product_id']==sn].index
-                    df_diag_ram=df_diag_ram.drop(index=sn_index)
-                    df_diag_ram=df_diag_ram.append(df_diag_res)
-                    df_diag_ram.reset_index(inplace=True,drop=True)     #重置索引
+                    # sn_index=df_diag_ram.loc[df_diag_ram['product_id']==sn].index
+                    # df_diag_ram=df_diag_ram.drop(index=sn_index)
+                    # df_diag_ram=df_diag_ram.append(df_diag_res)
+                    # df_diag_ram.reset_index(inplace=True,drop=True)     #重置索引
 
                     #当前热失控故障写入数据库
                     if not df_diag_res.empty:
                         df_diag_res.columns = ['start_time', 'end_time', 'product_id', 'code', 'level', 'info', 'advice']
+                        df_diag_res['add_time'] = datetime.datetime.now()
                         df_diag_res['factory'] = '骑享'
                         df_diag_res.to_sql("all_fault_info",con=db_res_engine, if_exists="append",index=False)
 
                     
                 #当前热失控已超过三天变为历史故障并写入数据库,并删除原有数据库中的当前故障和ram中的当前故障
-                elif (now_time-df_bms_ram_sn.iloc[-1]['time']).total_seconds()>3*24*3600:
-                    df_diag_ram=df_diag_ram.drop(df_diag_ram['sn']==sn)    #删除ram中的当前故障
-                    df_bms_ram_sn.iloc[-1]['end_time']=now_time
+                elif (now_time-datetime.strptime(df_diag_ram_sn.iloc[-1]['start_time'], '%Y-%m-%d %H:%M:%S')).total_seconds()>24*3600:
+                    # df_diag_ram=df_diag_ram.drop(df_diag_ram['sn']==sn)    #删除ram中的当前故障
+                    df_diag_ram_sn.iloc[-1]['end_time']=now_time
                     
                     try:
 
-        
                         cursor.execute('''
-                                    update all_fault_info set end_time={} where product_id='{}' and code={} and factory='骑享'
-                                    '''.format(now_time, sn, 119))
+                                    update all_fault_info set update_time={},end_time={}, Batpos={} where product_id='{}' and code={} and factory='骑享'
+                                    '''.format(datetime.datetime.now(), now_time, 1,sn, 119))
                         conn.commit()
                         conn.close();
                     except:
@@ -131,7 +136,6 @@ def diag_cal(df_sn, df_diag_ram, df_bms_ram, log_name):
 #...................................................主进程...........................................................................................................
 def mainprocess():
     global SNnums
-    global df_diag_ram
     global df_bms_ram
     global log_path
     # 更新sn列表
@@ -155,7 +159,7 @@ def mainprocess():
         sn_list = df_sn[int(len(df_sn)*i/process):int(len(df_sn)*(i+1)/process)]
         sn_list = sn_list.reset_index(drop=True)
         log_name = log_path + '/log_' + str(i)
-        pool.apply_async(diag_cal, (sn_list,df_diag_ram,df_bms_ram,log_name))
+        pool.apply_async(diag_cal, (sn_list,df_bms_ram,log_name))
 
     pool.close()
     pool.join()
@@ -230,11 +234,10 @@ if __name__ == "__main__":
     #............................模块运行前,先读取数据库中所有结束时间为0的数据,需要从数据库中读取................
     # print("select start_time, end_time, product_id, code, level, info, advice, factory from {}".format(tablename))
 
-    result=pd.read_sql("select start_time, end_time, product_id, code, level, info, advice from all_fault_info where factory = '{}'".format('骑享'), db_res_engine)
-    result = result[['start_time', 'end_time', 'product_id', 'code', 'level', 'info', 'advice']]
-    df_diag_ram=result[(result['end_time']=='0000-00-00 00:00:00') & (result['code']==119)]
+    # result=pd.read_sql("select start_time, end_time, product_id, code, level, info, advice from all_fault_info where factory = '{}'".format('骑享'), db_res_engine)
+    # result = result[['start_time', 'end_time', 'product_id', 'code', 'level', 'info', 'advice']]
+    # df_diag_ram=result[(result['end_time']=='0000-00-00 00:00:00') & (result['code']==119)]
     df_bms_ram=pd.DataFrame(columns=['time', 'sn', 'packvolt', 'cellvolt', 'celltemp'])
-
     #定时任务.......................................................................................................................................................................
     scheduler = BlockingScheduler()
     scheduler.add_job(mainprocess, 'interval', seconds=60, id='diag_job')

+ 1 - 2
LIB/FRONTEND/CellStateEstimation/SOH/deploy.py

@@ -23,7 +23,6 @@ if __name__ == "__main__":
     pre_time = now_time + dateutil.relativedelta.relativedelta(months=-1, days=-1)#上个月-1天时间
     end_time=datetime.datetime.strftime(now_time,"%Y-%m-%d 00:00:00")
     start_time=datetime.datetime.strftime(pre_time,"%Y-%m-%d 00:00:00")
-    
     history_run_flag = False # 历史数据运行标志
     # end_time = "2021-09-01 00:00:00"
 
@@ -116,7 +115,7 @@ if __name__ == "__main__":
             
             DBRead=DBDownload.DBDownload(host, port, db, user, password, 1)
             with DBRead as DBRead:
-                df_soh=DBRead.getdata('time_st','time_sp','sn','method','soh','cellsoh', tablename=tablename, sn=sn,timename='',st='',sp=''))
+                df_soh=DBRead.getdata('time_st','time_sp','sn','method','soh','cellsoh', tablename=tablename, sn=sn,timename='',st='',sp='')
                 
             df_data = dbManager.get_data(sn=sn, start_time=start_time, end_time=end_time, data_groups=['bms','accum'])
             df_bms = df_data['bms']

+ 2 - 1
LIB/FRONTEND/CellStateEstimation/SOH/run.bat

@@ -1,3 +1,4 @@
 cd /d D:\deploy\python_platform\data_analyze_platform\LIB\FRONTEND\CellStateEstimation\SOH
 title cal_soh
-D:\env\py_pro\python.exe D:\deploy\python_platform\data_analyze_platform\LIB\FRONTEND\CellStateEstimation\SOH\deploy.py
+D:\env\py_pro\python.exe D:\deploy\python_platform\data_analyze_platform\LIB\FRONTEND\CellStateEstimation\SOH\deploy.py
+pause

+ 3 - 0
LIB/FRONTEND/DrivingRange/deploy_driving_range.py

@@ -102,5 +102,8 @@ if __name__ == "__main__":
     except:
         logger.error(traceback.format_exc)
         logger.error(u"{},{} 任务运行错误\n".format(start_time,end_time), exc_info=True)
+    db_engine.dispose()
+    db_qx.close()
+    
 
 

+ 56 - 31
LIB/FRONTEND/SaftyCenter/DataDiag_Static/deploy.py

@@ -16,6 +16,7 @@ import time, datetime
 from pandas.core.frame import DataFrame
 from apscheduler.schedulers.blocking import BlockingScheduler
 from LIB.MIDDLE.SaftyCenter.DataDiag_Static.DataStatistics import DataSta
+from LIB.MIDDLE.SaftyCenter.DataDiag_Static.SC_CtrlSafty import CtrlSafty
 from LIB.MIDDLE.SaftyCenter.DataDiag_Static.DiagDataMerge import DiagDataMerge
 from LIB.MIDDLE.SaftyCenter.DataDiag_Static.SC_SamplingSafty import SamplingSafty
 from LIB.MIDDLE.SaftyCenter.DataDiag_Static import CBMSBatDiag
@@ -29,15 +30,35 @@ import pymysql
 def diag_cal():
     task_on=1
     global SNnums
-    global df_Diag_Ram
+    # global df_Diag_Ram
     global start
     global df_sn
+    
+    # 算法参数
+    host='rm-bp10j10qy42bzy0q77o.mysql.rds.aliyuncs.com'
+    port=3306
+    db='safety_platform'
+    user='qx_algo_rw'
+    password=parse.quote_plus('qx@123456')
+    db_engine = create_engine(
+        "mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8".format(
+            user, password, host, port, db
+        ))
+
+        
+    #............................模块运行前,先读取数据库中所有结束时间为0的数据,需要从数据库中读取................``
+    # print("select start_time, end_time, product_id, code, level, info, advice, factory from {}".format(tablename))
+    try:
+        df_Diag_Ram=pd.read_sql("select start_time, end_time, product_id, code, level, info, advice, Batpos from all_fault_info where factory = '{}'".format('骑享'), db_engine)
+    finally:
+        db_engine.dispose()
+        
     #读取结果数据库数据........................................................................................................................................................
     host1='rm-bp10j10qy42bzy0q77o.mysql.rds.aliyuncs.com'
     port1=3306
     db1='qx_cas'
-    user1='qx_read'
-    password1='Qx@123456'
+    user1='qx_algo_rw'
+    password1='qx@123456'
     mode=1
     tablename1='cellstateestimation_soh'
     tablename2='cellstateestimation_uniform_socvoltdiff'       
@@ -48,8 +69,8 @@ def diag_cal():
     host2='rm-bp10j10qy42bzy0q7.mysql.rds.aliyuncs.com'
     port2=3306
     db2='qixiang_manage'
-    user2='qx_query'
-    password2='@Qx_query'
+    user2='qx_algo_rw'
+    password2='qx@123456'
     mode=4
     tablename3='py_battery'     
     DBReadOpe=DBDw.DBDownload(host2, port2, db2, user2, password2,mode)
@@ -58,8 +79,8 @@ def diag_cal():
     host3='rm-bp10j10qy42bzy0q77o.mysql.rds.aliyuncs.com'
     port3=3306
     db3='safety_platform'
-    user3='qx_read'
-    password3='Qx@123456'
+    user3='qx_algo_rw'
+    password3='qx@123456'
     db_engine = create_engine(
     "mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8".format(
         user3, parse.quote_plus(password3), host3, port3, db3
@@ -107,18 +128,20 @@ def diag_cal():
             #电池诊断.....................................................................................................................................................................
             CellFltInfo=DataFrame(columns=['start_time', 'end_time', 'product_id', 'code', 'level', 'info','advice'])
             df_Diag_Ram_sn = df_Diag_Ram.loc[df_Diag_Ram['product_id']==sn]#历史故障
-            df_Diag_Ram_sn_else = pd.concat([df_Diag_Ram,df_Diag_Ram_sn,df_Diag_Ram_sn]).drop_duplicates(subset=['product_id','code','start_time','Batpos','info'],keep=False)#sn之外的故障
+            df_Diag_Ram_sn_else = df_Diag_Ram.loc[df_Diag_Ram['product_id']!=sn]#sn之外的故障
             CellFltInfo = df_Diag_Ram_sn.drop('Batpos',axis=1)
             #获取当前故障电池的历史故障信息↑↑↑↑↑↑↑↑↑↑↑.......................................................................................................................................
             if not df_bms.empty:
-                df_Diag_Batdiag_update_xq=SamplingSafty.main(sn,param,df_bms,CellFltInfo)#学琦计算故障   
-                batDiag=CBMSBatDiag.BatDiag(sn,celltype,df_bms, df_soh, df_uniform, CellFltInfo)#鹏飞计算
+                df_Diag_Batdiag_update_xq=SamplingSafty.main(sn,param,df_bms,CellFltInfo)#学琦计算故障 
+                df_Diag_Batdiag_update_xq2=CtrlSafty.main(sn,param,df_bms,df_Diag_Batdiag_update_xq)
+  
+                batDiag=CBMSBatDiag.BatDiag(sn,celltype,df_bms, df_soh, df_uniform, df_Diag_Batdiag_update_xq2)#鹏飞计算
                 df_Diag_Batdiag_update=batDiag.diag()
                 # df_Diag_Batdiag_update=BatDiag.diag() 
             else:
                 df_Diag_Batdiag_update_xq=DataFrame(columns=['start_time','end_time','product_id','code','level','info','advice','Batpos'])
                 df_Diag_Batdiag_update=DataFrame(columns=['start_time','end_time','product_id','code','level','info','advice','Batpos'])
-            df_Diag_Ram,df_Diag_Ram_add,df_Diag_Ram_Update=DiagDataMerge.DetaMerge(df_Diag_Ram_sn,df_Diag_Batdiag_update_xq,df_Diag_Batdiag_update,df_OprtnSta,df_Diag_Ram_sn_else)
+            df_Diag_Ram_add,df_Diag_Ram_Update=DiagDataMerge.DetaMerge(df_Diag_Ram_sn,df_Diag_Batdiag_update,df_OprtnSta,df_Diag_Ram_sn_else)
             # df_Diag_Ram.to_csv('df_Diag_Ram.csv')
             # df_Diag_Ram_add.to_csv('df_Diag_Ram_add.csv')
             # df_Diag_Ram_Update.to_csv('df_Diag_Ram_add.csv')
@@ -126,6 +149,7 @@ def diag_cal():
                 
                 df_Diag_Ram_add.columns = ['start_time', 'end_time', 'product_id', 'code', 'level', 'info','advice', 'Batpos']
                 df_Diag_Ram_add['factory'] = '骑享'
+                df_Diag_Ram_add['add_time'] = datetime.datetime.now()
                 df_Diag_Ram_add.to_sql("all_fault_info",con=db_engine, if_exists="append",index=False)
                 # df_Diag_Ram_add.to_csv(r'D:\Work\Code_write\data_analyze_platform\USER\01Screen_Problem\result_add.csv',index=False,encoding='GB18030')
             if len(df_Diag_Ram_Update) > 0:#更改故障
@@ -134,8 +158,8 @@ def diag_cal():
                     logger.info(df_Diag_Ram_Update)
                     for i in range(0,len(df_Diag_Ram_Update)):
                         sql = '''
-                                    update all_fault_info set end_time='{}', Batpos={} where product_id='{}' and code={} and start_time='{}'
-                                    '''.format(df_Diag_Ram_Update.loc[i,'end_time'], df_Diag_Ram_Update.loc[i, 'Batpos'],
+                                    update all_fault_info set update_time={}, end_time='{}', Batpos={} where product_id='{}' and code={} and start_time='{}'
+                                    '''.format(datetime.datetime.now(), df_Diag_Ram_Update.loc[i,'end_time'], df_Diag_Ram_Update.loc[i, 'Batpos'],
                                                df_Diag_Ram_Update.loc[i,'product_id'], df_Diag_Ram_Update.loc[i,'code'], 
                                                df_Diag_Ram_Update.loc[i,'start_time'])
                         cursor_platform.execute(sql)
@@ -152,6 +176,7 @@ def diag_cal():
             logger.error(traceback.format_exc)
             logger.error(str(e))
             logger.error(u"{} :{},{} 任务运行错误\n".format(sn,start_time,end_time), exc_info=True)
+    
     DBReadOpe.close()
     DBRead.close()   
     cursor_platform.close()
@@ -169,8 +194,8 @@ def DaTa_Sta_Week_Task():
     host='rm-bp10j10qy42bzy0q77o.mysql.rds.aliyuncs.com'
     port=3306
     db='safety_platform'
-    user='qx_read'
-    password='Qx@123456'
+    user='qx_algo_rw'
+    password='qx@123456'
     mode=2
     tablename1='all_fault_info'
     
@@ -188,11 +213,11 @@ def DaTa_Sta_Week_Task():
         #............................获取时间................................      
         end_time=datetime.datetime.now()
         # end_time=datetime.datetime.strptime(end_time,'%Y-%m-%d')
-        start_time=end_time-datetime.timedelta(days=7)
-        start_time=start_time.strftime('%Y-%m-%d')
+        start_time_week=end_time-datetime.timedelta(days=7)
+        start_time_week=start_time_week.strftime('%Y-%m-%d')
         end_time=end_time.strftime('%Y-%m-%d')
-        FltAlarmInfo,Celltype=DataSta.SaftyWarningSta(df_fltinfo,start_time,end_time)
-        FaultLvlCount=DataSta.WeekInfoSta(df_fltinfo,start_time,end_time)
+        FltAlarmInfo,Celltype=DataSta.SaftyWarningSta(df_fltinfo,start_time_week,end_time)
+        FaultLvlCount=DataSta.WeekInfoSta(df_fltinfo,start_time_week,end_time)
         for i in range(1,6):
             if not FaultLvlCount[FaultLvlCount['level']==i]['product_id'].empty:
                 all_period_fault_info.loc[0,'level'+str(i)+'_count']=int(FaultLvlCount[FaultLvlCount['level']==i]['product_id'].values)
@@ -234,8 +259,8 @@ def DaTa_Sta_Minutes_Task():
     host='rm-bp10j10qy42bzy0q77o.mysql.rds.aliyuncs.com'
     port=3306
     db='qx_cas'
-    user='qx_read'
-    password='Qx@123456'
+    user='qx_algo_rw'
+    password='qx@123456'
     mode=3
     tablename2='bat_first_data_time'
     DBRead=DBDw.DBDownload(host, port, db, user, password,mode)
@@ -246,8 +271,8 @@ def DaTa_Sta_Minutes_Task():
     host='rm-bp10j10qy42bzy0q77o.mysql.rds.aliyuncs.com'
     port=3306
     db='safety_platform'
-    user='qx_read'
-    password='Qx@123456'
+    user='qx_algo_rw'
+    password='qx@123456'
     mode=2
     tablename1='all_fault_info'
     db_engine = create_engine(
@@ -258,7 +283,7 @@ def DaTa_Sta_Minutes_Task():
     with DBRead as DBRead:
         df_fltinfo=DBRead.getdata('product_id','level','code','start_time','batpos',tablename=tablename1,factory='骑享',sn='',timename='',st='',sp='')#dbdownload经过了改编
     
-    df_Diag_Ram=pd.read_sql("select start_time, end_time, product_id, code, level, info, advice, Batpos from all_fault_info where factory = '{}' and Batpos=1".format('骑享'), db_engine)
+    # df_Diag_Ram=pd.read_sql("select start_time, end_time, product_id, code, level, info, advice, Batpos from all_fault_info where factory = '{}' and Batpos=1".format('骑享'), db_engine)
 
     #............................获取时间................................
     end_time=datetime.datetime.now()
@@ -270,7 +295,7 @@ def DaTa_Sta_Minutes_Task():
     FltAlarmInfo,Celltype=DataSta.SaftyWarningSta(df_fltinfo,start_time,end_time)
     SatftyCount=DataSta.SftyWrngClsfy(df_fltinfo)
     MaxAccumAh,TotalAccumAh,MaxCycle,MaxRunningHour,TotalRunHour=DataSta.AccumInfo(df_last_accum,df_FirstDataTime,end_time)
-    all_location_info=DataSta.FltBatPosition(df_last_pos,df_Diag_Ram)
+    all_location_info=DataSta.FltBatPosition(df_last_pos,df_fltinfo)
 
     all_statistic_info=DataFrame(columns=['factory','total_alarm','alarm_total_today','alarm_not_close_today','alarm_close_today','alarm_uregent_total_today','alarm_uregent_close_today','alarm_uregent_not_close_today','run_time_total','dischrg_total','odo_total','max_dischrg_one','max_runtime_one','max_cycle_one','max_odo_one','alarm_close_total','alarm_total','cell_type','cell_type_count','cell_safety_risk_count','data_safety_risk_count','status_safety_risk_count','hv_safety_risk_count','system_safety_risk_count','sample_safety_risk_count','controller_safety_risk_count','design_safety_risk_count'])
     all_statistic_info.loc[0,'factory']='骑享'
@@ -362,8 +387,8 @@ if __name__ == "__main__":
     host='rm-bp10j10qy42bzy0q7.mysql.rds.aliyuncs.com'
     port=3306
     db='qixiang_oss'
-    user='qixiang_oss'
-    password='Qixiang2021'
+    user='qx_algo_rw'
+    password='qx@123456'
     conn = pymysql.connect(host=host, port=port, user=user, password=password, database=db)
     cursor = conn.cursor()
     cursor.execute("select sn, imei, add_time from app_device")
@@ -407,8 +432,8 @@ if __name__ == "__main__":
     host='rm-bp10j10qy42bzy0q77o.mysql.rds.aliyuncs.com'
     port=3306
     db='safety_platform'
-    user='qx_read'
-    password=parse.quote_plus('Qx@123456')
+    user='qx_algo_rw'
+    password=parse.quote_plus('qx@123456')
     tablename='all_fault_info'
     db_engine = create_engine(
         "mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8".format(
@@ -429,8 +454,8 @@ if __name__ == "__main__":
     
     task_on=0
     diag_cal()
-    DaTa_Sta_Minutes_Task()
-    DaTa_Sta_Week_Task()
+    # DaTa_Sta_Minutes_Task()
+    # DaTa_Sta_Week_Task()
 
     #定时任务.......................................................................................................................................................................
     scheduler = BlockingScheduler()

+ 143 - 0
LIB/FRONTEND/SaftyCenter/LowSocAlarm/deploy.py

@@ -0,0 +1,143 @@
+
+__author__ = 'lmstack'
+#coding=utf-8
+import os
+import datetime
+import pandas as pd
+from LIB.BACKEND import DBManager, Log
+from sqlalchemy import create_engine
+from sqlalchemy.orm import sessionmaker
+import time, datetime
+import dateutil.relativedelta
+import traceback
+from LIB.MIDDLE.CellStateEstimation.Common import log
+from pandas.core.frame import DataFrame
+
+from LIB.MIDDLE.CellStateEstimation.Common.V1_0_1 import DBDownload
+from urllib import parse
+import pymysql
+import pdb
+from apscheduler.schedulers.blocking import BlockingScheduler
+import datacompy
+from LIB.MIDDLE.SaftyCenter.Common import DBDownload as DBDw
+from LIB.MIDDLE.SaftyCenter.Common import QX_BatteryParam
+from LIB.MIDDLE.SaftyCenter.Low_Soc_Alarm.low_soc_alarm import Low_soc_alarm
+
+if __name__ == "__main__":
+    
+    # 时间设置
+    now_time = datetime.datetime.now()
+    pre_time = now_time + dateutil.relativedelta.relativedelta(days=-1)# 前一日
+    end_time=datetime.datetime.strftime(now_time,"%Y-%m-%d 07:00:00")
+    start_time=datetime.datetime.strftime(pre_time,"%Y-%m-%d 07:00:00")
+    
+    history_run_flag = False # 历史数据运行标志
+    
+
+    # 更新sn列表
+    host='rm-bp10j10qy42bzy0q7.mysql.rds.aliyuncs.com'
+    port=3306
+    db='qixiang_oss'
+    user='qixiang_oss'
+    password='Qixiang2021'
+    conn = pymysql.connect(host=host, port=port, user=user, password=password, database=db)
+    cursor = conn.cursor()
+    cursor.execute("select sn, imei, add_time from app_device")
+    res = cursor.fetchall()
+    df_sn = pd.DataFrame(res, columns=['sn', 'imei', 'add_time'])
+    df_sn = df_sn.reset_index(drop=True)
+    conn.close();
+    
+    # 数据库配置
+    host = 'rm-bp10j10qy42bzy0q77o.mysql.rds.aliyuncs.com'
+    port = 3306
+    user = 'qx_cas'
+    password = parse.quote_plus('Qx@123456')
+    database = 'qx_cas'
+
+    db_engine = create_engine(
+        "mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8".format(
+            user, password, host, port, database
+        ))
+    DbSession = sessionmaker(bind=db_engine)
+    
+    # 运行历史数据配置
+    
+    df_first_data_time = pd.read_sql("select * from bat_first_data_time", db_engine)
+    db_engine.dispose()
+
+    
+    # 日志配置
+    now_str = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()).replace(":","_")
+    log_path = 'log/' + now_str
+    if not os.path.exists(log_path):
+        os.makedirs(log_path)
+    log = Log.Mylog(log_name='saftyCenter_lowSocAlarm', log_level = 'info')
+    log.set_file_hl(file_name='{}/info.log'.format(log_path), log_level='info', size=1024* 1024 * 100)
+    log.set_file_hl(file_name='{}/error.log'.format(log_path), log_level='error', size=1024* 1024 * 100)
+    logger = log.get_logger()
+
+    logger.info("pid is {}".format(os.getpid()))
+    
+    # 算法参数
+    host='rm-bp10j10qy42bzy0q7.mysql.rds.aliyuncs.com'
+    port=3306
+    db='qixiang_manage'
+    user='qx_query'
+    password='@Qx_query'
+    mode=4
+    tablename1='py_battery'     
+
+    DBRead=DBDw.DBDownload(host, port, db, user, password,mode)
+    dbManager = DBManager.DBManager()
+    low_soc_bat_list=DataFrame(columns=['sn','time','level'])
+    with DBRead as DBRead:
+        for i in range(0, len(df_sn)):
+            try:
+                if df_sn.loc[i, 'imei'][5:9] == 'N640':
+                    celltype=1 #6040三元电芯
+                elif df_sn.loc[i, 'imei'][5:9] == 'N440':
+                    celltype=2 #4840三元电芯
+                elif df_sn.loc[i, 'imei'][5:9] == 'L660':
+                    celltype=99 # 6060锂电芯
+                elif df_sn.loc[i, 'imei'][3:5] == 'LX' and df_sn.loc[i, 'imei'][5:9] == 'N750':    
+                    celltype=3 #力信 50ah三元电芯
+                elif df_sn.loc[i, 'imei'][3:5] == 'CL' and df_sn.loc[i, 'imei'][5:9] == 'N750': 
+                    celltype=4 #CATL 50ah三元电芯
+                else:
+                    logger.info("pid-{} celltype-{} SN: {} SKIP!".format(os.getpid(), "未知", sn))
+                    continue
+                sn = df_sn.loc[i, 'sn']
+                param=QX_BatteryParam.BatteryInfo(celltype) 
+                logger.info("pid-{} celltype-{} SN: {} START!".format(os.getpid(), celltype, sn))
+                
+                df_data = dbManager.get_data(sn=sn, start_time=start_time, end_time=end_time, data_groups=['bms'])
+                df_bms = df_data['bms']
+                # 处理运行历史数据
+                if (history_run_flag):
+                    this_sn = df_first_data_time[df_first_data_time['sn']==sn]
+                    if (len(this_sn) == 0):
+                        start_time = pd.to_datetime(str(df_sn.loc[df_sn[df_sn['sn']==sn].index, 'add_time'].values[0])).strftime("%Y-%m-%d 00:00:00")
+                    else:
+                        first_data_time = df_first_data_time.loc[df_first_data_time[df_first_data_time['sn']==sn].index, 'first_data_time'].values[0]
+                        if pd.isnull(first_data_time):
+                            start_time = "2018-01-01 00:00:00"
+                        else:
+                            start_time = pd.to_datetime(str(df_first_data_time.loc[df_first_data_time[df_first_data_time['sn']==sn].index, 'first_data_time'].values[0])).strftime("%Y-%m-%d 00:00:00")
+                
+                
+                df_OprtnSta=DBRead.getdata('qrcode','status', tablename=tablename1, sn=sn, timename='', st='', sp='',factory='')#取最后一条运营状态
+                low_soc_bat_list=Low_soc_alarm.low_soc_alarm(param,df_bms,low_soc_bat_list,sn,df_OprtnSta) 
+    
+
+                logger.info("pid-{} celltype-{} SN: {} DONE!".format(os.getpid(), celltype, sn))
+            except:
+                logger.error(traceback.format_exc)
+                logger.error(u"{} :{},{} 任务运行错误\n".format(sn,start_time,end_time), exc_info=True)
+    try:
+        if not low_soc_bat_list.empty:
+            low_soc_bat_list.to_sql("lowsoc_info",con=db_engine, if_exists="append",index=False)
+            logger.info("入库成功!")
+    finally:
+        db_engine.dispose()
+        

+ 87 - 0
LIB/FRONTEND/SaftyCenter/LowSocAlarm/main.py

@@ -0,0 +1,87 @@
+import datetime
+import pandas as pd
+from LIB.BACKEND import DBManager, Log
+from sqlalchemy import create_engine
+import time, datetime
+from apscheduler.schedulers.blocking import BlockingScheduler
+from LIB.MIDDLE.CellStateEstimation.Common.V1_0_1 import DBDownload as DBDownload
+from LIB.MIDDLE.CellStateEstimation.Common.V1_0_1 import log
+from pandas.core.frame import DataFrame
+import datacompy
+from LIB.MIDDLE.SaftyCenter.Common import QX_BatteryParam
+from LIB.MIDDLE.SaftyCenter.Common import DBDownload as DBDw
+from LIB.MIDDLE.SaftyCenter.Low_Soc_Alarm.low_soc_alarm import Low_soc_alarm
+def Low_Soc_Alarm():
+    end_time=datetime.datetime.now()
+    start_time=end_time-datetime.timedelta(days=1)
+    start_time=start_time.strftime('%Y-%m-%d %H:%M:%S')
+    end_time=end_time.strftime('%Y-%m-%d %H:%M:%S')
+    #-------------------------读取数据-------------------------------------------------------------------
+    excelpath=r'D:\ZLWORK\code\data_analyze_platform\USER\eric\SaftyCenter_CODE_V1\sn-20210903.xlsx'
+    SNdata_6060 = pd.read_excel(excelpath, sheet_name='科易6060')
+    SNdata_6040 = pd.read_excel(excelpath, sheet_name='科易6040')
+    SNdata_4840 = pd.read_excel(excelpath, sheet_name='科易4840')
+    SNdata_L7255 = pd.read_excel(excelpath, sheet_name='格林美-力信7255')
+    SNdata_C7255 = pd.read_excel(excelpath, sheet_name='格林美-CATL7255')
+    SNdata_U7255 = pd.read_excel(excelpath, sheet_name='优旦7255')
+    SNnums_6060=SNdata_6060['SN号'].tolist()
+    SNnums_6040=SNdata_6040['SN号'].tolist()
+    SNnums_4840=SNdata_4840['SN号'].tolist()
+    SNnums_L7255=SNdata_L7255['SN号'].tolist()
+    SNnums_C7255=SNdata_C7255['SN号'].tolist()
+    SNnums_U7255=SNdata_U7255['SN号'].tolist()
+    SNnums=SNnums_L7255 + SNnums_C7255 + SNnums_6040 + SNnums_4840 + SNnums_U7255+ SNnums_6060
+    #SNnums=['MGMCLN750N215I009']
+    #-------------------------执行循环----------------------------------------------------------------------
+    low_soc_bat_list=DataFrame(columns=['sn','time','level'])
+    for sn in SNnums:#SN遍历
+        print(sn)
+        if 'PK500' in sn:
+            celltype=1 #6040三元电芯
+        elif 'PK502' in sn:
+            celltype=2 #4840三元电芯
+        elif 'K504B' in sn:
+            celltype=99    #60ah林磷酸铁锂电芯
+        elif 'MGMLXN750' in sn:
+            celltype=3 #力信50ah三元电芯
+        elif 'MGMCLN750' or 'UD' in sn: 
+            celltype=4 #CATL 50ah三元电芯
+        else:
+            print('SN:{},未找到对应电池类型!!!'.format(sn))
+            continue
+            # sys.exit()
+        param=QX_BatteryParam.BatteryInfo(celltype)   
+        #读取原始数据库数据.....................................................................................
+        dbManager = DBManager.DBManager()
+        df_data = dbManager.get_data(sn=sn, start_time=start_time, end_time=end_time, data_groups=['bms'])
+        df_bms = df_data['bms']
+        #读取电池当前运营状态.....................................................................................................................................................
+        host='rm-bp10j10qy42bzy0q7.mysql.rds.aliyuncs.com'
+        port=3306
+        db='qixiang_manage'
+        user='qx_query'
+        password='@Qx_query'
+        mode=4
+        tablename1='py_battery'     
+        DBRead=DBDw.DBDownload(host, port, db, user, password,mode)
+        with DBRead as DBRead:
+            df_OprtnSta=DBRead.getdata('qrcode','status', tablename=tablename1, sn=sn, timename='', st='', sp='',factory='')#取最后一条运营状态
+        
+        #执行主程序-------------------------------------------------------------------------------------------
+        low_soc_bat_list=Low_soc_alarm.low_soc_alarm(param,df_bms,low_soc_bat_list,sn,df_OprtnSta)
+
+        return low_soc_bat_list
+mylog=log.Mylog('log_diag.txt','error')
+mylog.logcfg()
+scheduler = BlockingScheduler()
+low_soc_bat_list=Low_Soc_Alarm()
+low_soc_bat_list.to_excel('Low_Soc_Alarm.xlsx')
+#------------------------------------定时执行程序-----------------------------------------------------------
+scheduler.add_job(Low_Soc_Alarm, 'interval',days=1, start_date='2021-11-12 00:00:00', id='low_soc_alarm')
+
+try:  
+    scheduler.start()
+except Exception as e:
+    scheduler.shutdown()
+    print(repr(e))
+    mylog.logopt(e)

+ 4 - 0
LIB/FRONTEND/SaftyCenter/LowSocAlarm/run.bat

@@ -0,0 +1,4 @@
+cd /d D:\deploy\python_platform\data_analyze_platform\LIB\FRONTEND\SaftyCenter\LowSocAlarm
+title cal_saftyCenter_LowSocAlarm
+D:\env\py_pro\python.exe D:\deploy\python_platform\data_analyze_platform\LIB\FRONTEND\SaftyCenter\LowSocAlarm\deploy.py
+pause

+ 5 - 3
LIB/FRONTEND/SaftyCenter/status_sta/deploy.py

@@ -112,7 +112,9 @@ if __name__ == "__main__":
             df_result.columns = ['factory', 'time', 'charge_count', 'drive_count', 'stand_count']
             df_result.to_sql("period_status_statistic",con=db_res_engine, if_exists="append",index=False)
             logger.info("数据库写入成功!")
-    finally:
-        db_res_engine.dispose()
-        db_engine.dispose()
+    except:
+        logger.error(traceback.format_exc)
+        logger.error(u"{} :{},{} 任务运行错误\n".format(sn,start_time,end_time), exc_info=True)
+    db_res_engine.dispose()
+    db_engine.dispose()
     

+ 2 - 0
LIB/FRONTEND/other/bat_user_relation/deploy.py

@@ -151,6 +151,8 @@ if __name__ == "__main__":
     except Exception as e:
         logger.error(traceback.format_exc)
         logger.error(u" 任务运行错误", exc_info=True)
+    finally:
+        db_engine.dispose()
 
 
     

+ 1 - 0
LIB/FRONTEND/other/bat_user_relation/main.py

@@ -103,4 +103,5 @@ for name, df_group in df_groups:
     et = df_group.loc[len(df_group)-1, 'return_time'] if not pd.isnull(df_group.loc[len(df_group)-1, 'return_time']) else None
     df_res = df_res.append(pd.DataFrame({'sn':[sn], 'st':[st], 'et':[et], 'user_id':[user_id], 'agent_id':[df_group.loc[len(df_group)-1, 'f_id']]}), ignore_index=True)
 df_res.to_csv('result.csv')
+
     

+ 5 - 2
LIB/FRONTEND/other/oss_to_iotp/deploy.py

@@ -58,8 +58,7 @@ if __name__ == "__main__":
         df_res = pd.DataFrame(res, columns=['sn'])
         df_res = df_res.reset_index(drop=True)
         all_sns = df_res['sn'].tolist()
-        conn.close()
-        
+
         host='rm-bp10j10qy42bzy0q7.mysql.rds.aliyuncs.com'
         port=3306
         db='qixiang_manage'
@@ -82,6 +81,10 @@ if __name__ == "__main__":
     except Exception as e:
         logger.error(traceback.format_exc)
         logger.error(u" 任务运行错误", exc_info=True)
+    finally:
+        cursor.close()
+        conn.close()    
+        db_engine.dispose()