Browse Source

update 部署

su-lmstack 3 years ago
parent
commit
432720e39a

+ 114 - 0
LIB/FRONTEND/SignalMonitor/create_table.py

@@ -0,0 +1,114 @@
+'''
+定义表的结构,并在数据库中创建对应的数据表
+'''
+__author__ = 'lmstack'
+
+from sqlalchemy.ext.declarative import declarative_base
+from sqlalchemy import Column, String, create_engine, Integer, DateTime, BigInteger, FLOAT, TIMESTAMP, func
+from urllib import parse
+Base = declarative_base()
+
+
+class BmsLastDataDay(Base):
+    __tablename__ = "signal_monitor_bms_last_day"
+    __table_args__ = ({'comment': '电池信号监控---每天最后一条bms数据'})  # 添加索引和表注释
+
+    id = Column(Integer, primary_key=True, autoincrement=True, comment="主键")
+    add_time = Column(TIMESTAMP(True), server_default=func.now()) # 创建时间
+    update_time = Column(TIMESTAMP(True), nullable=False, server_default=func.now(), onupdate=func.now()) # 更新时间
+    sn = Column(String(64), comment="sn")
+    current = Column(FLOAT, comment="电流")
+    time_stamp = Column(DateTime, comment="时间戳")
+    pack_state = Column(Integer, comment="电池状态")
+    line_state = Column(Integer, comment="信号状态")
+
+
+    # def __init__(self, sn, current, time_stamp, pack_state, line_state):
+    #     self.sn = sn
+    #     self.current = current
+    #     self.time_stamp = time_stamp
+    #     self.pack_state = pack_state
+    #     self.line_state = line_state
+
+class GpsLastDataDay(Base):
+    __tablename__ = "signal_monitor_gps_last_day"
+    __table_args__ = ({'comment': '电池信号监控---每天最后一条gps数据'})  # 添加索引和表注释
+
+    id = Column(Integer, primary_key=True, autoincrement=True, comment="主键")
+    add_time = Column(TIMESTAMP(True), server_default=func.now()) # 创建时间
+    update_time = Column(TIMESTAMP(True), nullable=False, server_default=func.now(), onupdate=func.now()) # 更新时间
+    sn = Column(String(64), comment="sn")
+    time_stamp = Column(DateTime, comment="时间戳")
+    pack_state = Column(Integer, comment="电池状态")
+    line_state = Column(Integer, comment="信号状态")
+    latitude = Column(FLOAT, comment="纬度")
+    longitude = Column(FLOAT, comment="经度")
+
+
+    # def __init__(self, sn, time_stamp, pack_state, line_state, ):
+    #     self.sn = sn
+    #     self.time_stamp = time_stamp
+    #     self.pack_state = pack_state
+    #     self.line_state = line_state
+
+class GpsSignalMonitor(Base):
+    __tablename__ = "signal_monitor_gps"
+    __table_args__ = ({'comment': 'gps信号监控'})  # 添加索引和表注释
+
+    id = Column(Integer, primary_key=True, autoincrement=True, comment="主键")
+    add_time = Column(TIMESTAMP(True), server_default=func.now()) # 创建时间
+    update_time = Column(TIMESTAMP(True), nullable=False, server_default=func.now(), onupdate=func.now()) # 更新时间
+    sn = Column(String(64), comment="sn")
+    start_time = Column(DateTime, comment="开始时间")
+    end_time = Column(DateTime, comment="结束时间")
+    offline_time = Column(Integer, comment="离线时间")
+    pack_state = Column(Integer, comment="电池状态")
+    line_state = Column(Integer, comment="信号状态")
+    latitude = Column(FLOAT, comment="纬度")
+    longitude = Column(FLOAT, comment="经度")
+
+
+    # def __init__(self, sn, start_time, end_time, off_line_time, pack_state, line_state):
+    #     self.sn = sn
+    #     self.start_time = start_time
+    #     self.end_time = end_time
+    #     self.off_line_time = off_line_time
+    #     self.pack_state = pack_state
+    #     self.line_state = line_state
+
+class BmsSignalMonitor(Base):
+    __tablename__ = "signal_monitor_bms"
+    __table_args__ = ({'comment': 'bms信号监控'})  # 添加索引和表注释
+
+    id = Column(Integer, primary_key=True, autoincrement=True, comment="主键")
+    add_time = Column(TIMESTAMP(True), server_default=func.now()) # 创建时间
+    update_time = Column(TIMESTAMP(True), nullable=False, server_default=func.now(), onupdate=func.now()) # 更新时间
+    sn = Column(String(64), comment="sn")
+    start_time = Column(DateTime, comment="开始时间")
+    end_time = Column(DateTime, comment="结束时间")
+    offline_time = Column(Integer, comment="离线时间")
+    pack_state = Column(Integer, comment="电池状态")
+    line_state = Column(Integer, comment="信号状态")
+
+
+    # def __init__(self, sn, start_time, end_time, off_line_time, pack_state, line_state):
+    #     self.sn = sn
+    #     self.start_time = start_time
+    #     self.end_time = end_time
+    #     self.off_line_time = off_line_time
+    #     self.pack_state = pack_state
+    #     self.line_state = line_state
+
+# 执行该文件,创建表格到对应的数据库中
+if __name__ == "__main__":
+    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
+        ))
+    Base.metadata.create_all(db_engine)

+ 104 - 0
LIB/FRONTEND/SignalMonitor/deploy.py

@@ -0,0 +1,104 @@
+#coding=utf-8
+import os
+import datetime
+import pandas as pd
+from LIB.BACKEND import DBManager, Log
+from LIB.MIDDLE import SignalMonitor
+from sqlalchemy import create_engine
+from sqlalchemy.orm import sessionmaker
+import time, datetime
+import traceback
+
+from urllib import parse
+
+dbManager = DBManager.DBManager()
+if __name__ == "__main__":
+    # 数据库配置
+    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
+        ))
+    print("mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8".format(
+            user, password, host, port, database
+        ))
+    DbSession = sessionmaker(bind=db_engine)
+    
+    # 日志配置
+    log = Log.Mylog(log_name='signal_monitor', log_level = 'info')
+    log.set_file_hl(file_name='info.log', log_level='info')
+    log.set_file_hl(file_name='error.log', log_level='error')
+    logger = log.get_logger()
+
+    logger.info("pid is + {}".format(os.getpid()))
+
+    # 读取sn列表
+    df_sn = pd.read_csv('sn_list.csv')
+    df_sn = df_sn.reset_index(drop=True)
+    df_sn['StartTime'] = pd.to_datetime(df_sn['StartTime'])
+    df_sn['EndTime'] = pd.to_datetime(df_sn['EndTime'])
+    df_sn['ExitTime'] = pd.to_datetime(df_sn['ExitTime'])
+    signalMonitor = SignalMonitor.SignalMonitor()
+    cal_period = 24    # 计算间隔,单位h
+    for i in range(102, len(df_sn['sn'])):    # 遍历SN号
+        sn = [df_sn.loc[i,'sn']]
+        if not (sn[0][0:2] == 'PK' or sn[0][0:2] == 'MG' or sn[0][0:2] == 'UD'):
+            continue
+        st = df_sn.loc[i, 'StartTime']
+        if df_sn.loc[i, 'Service'] == 0:
+            if pd.isnull(df_sn.loc[i, 'EndTime']) and pd.isnull(df_sn.loc[i, 'ExitTime']):
+                continue
+            elif pd.isnull(df_sn.loc[i, 'ExitTime']):
+                et = df_sn.loc[i, 'EndTime']
+            else:
+                et = df_sn.loc[i, 'ExitTime']
+        elif pd.isnull(df_sn.loc[i, 'EndTime']):
+            otherStyleTime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(time.time()))
+            et = pd.to_datetime(otherStyleTime)
+        else:
+            et = df_sn.loc[i, 'EndTime']
+        df_last_state = pd.DataFrame(
+            columns=['sn', 'current', 'Timestamp', 'PackState', 'LineState'])    # 每日最后BMS数据
+        df_last_state_gps = pd.DataFrame(
+            columns=['sn', 'Timestamp', 'PackState', 'LineState', 'latitude', 'longitude'])    # 每日最后GPS数据
+        df_res = pd.DataFrame(columns=[
+                            'sn', 'PackState', 'LineState', 'StartTime', 'EndTime', 'OfflineTime'])    # 初始化BMS信号统计数据
+        df_res_gps = pd.DataFrame(columns=[
+                                'sn', 'PackState', 'LineState', 'StartTime', 'EndTime', 'OfflineTime', 'latitude', 'longitude'])    # 初
+        while st < et:
+            try:
+                df_res, df_state, df_last_state = signalMonitor.get_bms_offline_stat(
+                    sn, st, et, df_res, df_last_state, cal_period)    # 计算每日BMS信号统计数据
+                df_res_gps, df_last_state_gps = signalMonitor.get_gps_offline_stat(
+                    sn, st, et, df_state, df_res_gps, df_last_state_gps, cal_period)    # 计算每日GPS信号统计数据
+                st = st + datetime.timedelta(hours=cal_period)
+            except Exception as e:
+                st = st + datetime.timedelta(hours=cal_period)
+                logger.error(traceback.format_exc)
+                logger.error(u"{} :{},{} 任务运行错误".format(sn,st,et), exc_info=True)
+
+        # 数据入库
+        df_tosql = df_res_gps.copy()
+        df_tosql.columns = ['sn', 'pack_state', 'line_state', 'start_time', 'end_time', 'offline_time','latitude', 'longitude']
+        df_tosql.to_sql("signal_monitor_gps",con=db_engine, if_exists="append",index=False)
+
+        df_tosql = df_res.copy()
+        df_tosql.columns = ['sn', 'pack_state', 'line_state', 'start_time', 'end_time', 'offline_time']
+        df_tosql.to_sql("signal_monitor_bms",con=db_engine, if_exists="append",index=False)
+
+    # 数据入库
+        df_tosql = df_last_state.copy()
+        df_tosql.columns = ['sn', 'current', 'time_stamp', 'pack_state', 'line_state']
+        df_tosql.to_sql("signal_monitor_bms_last_day",con=db_engine, if_exists="append",index=False)
+
+        df_tosql = df_last_state_gps.copy()
+        df_tosql.columns = ['sn', 'time_stamp', 'pack_state', 'line_state','latitude', 'longitude']
+        df_tosql.to_sql("signal_monitor_gps_last_day",con=db_engine, if_exists="append",index=False)
+
+        logger.info("{} {} Success!".format(sn, str(st)))
+

+ 0 - 0
LIB/FRONTEND/odo/create_table.py


+ 94 - 0
LIB/FRONTEND/odo/deploy.py

@@ -0,0 +1,94 @@
+#coding=utf-8
+# 计算里程
+from math import radians, cos, sin, asin, sqrt
+import pandas as pd
+import numpy as np
+from datetime import datetime
+from datetime import timedelta
+from sqlalchemy import create_engine
+from sqlalchemy.orm import sessionmaker
+from GpsRank import *
+from ProcessDfBms import *
+from ProcessDfGps import *
+from LIB.MIDDLE.odo.CalDist import *
+from LIB.BACKEND import DBManager, Log
+import pdb
+from urllib import parse
+import traceback
+import os
+
+if __name__ == "__main__":
+    # 数据库配置
+    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
+        ))
+    print("mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8".format(
+            user, password, host, port, database
+        ))
+    DbSession = sessionmaker(bind=db_engine)
+    
+    # 日志配置
+    log = Log.Mylog(log_name='signal_monitor', log_level = 'info')
+    log.set_file_hl(file_name='info.log', log_level='info')
+    log.set_file_hl(file_name='error.log', log_level='error')
+    logger = log.get_logger()
+
+    logger.info("pid is + {}".format(os.getpid()))
+
+    
+    asset_table_path='asset_table.xlsx'
+
+    asset_sheet_num=1
+    usecols_list=[4,5]
+
+    asset_table=pd.read_excel(asset_table_path,sheet_name=asset_sheet_num,skiprows=1,usecols=usecols_list)
+    SN_list=asset_table['SN号'].values.tolist()
+
+    asset_table=asset_table.rename(columns={'SN号':'SN','状态':'state'})
+
+    asset_table.set_index(["SN"],inplace=True)
+    col_name=asset_table.columns.tolist()
+    col_name.extend(['range','accum_soc','day_start_soc','day_end_soc','day_start_time','day_end_time'])
+    asset_table=asset_table.reindex(columns=col_name)
+
+    start_hour='00:00:00'#每日查询最早时间
+    end_hour='23:59:00'#每日查询最晚时间
+
+
+    date_index=pd.date_range('2021-07-01','2021-07-31')
+    for date in date_index:
+        '''遍历日期'''
+
+        str_date=str(date)[:10]
+        input_starttime=str_date+' '+start_hour
+        input_endtime=str_date+' '+end_hour
+        test_day=str_date[5:10]#月-日,用于建立sheet
+
+        drive_info_aday=pd.DataFrame()
+        SN_list_short=SN_list#先选择了0:50,50:end
+
+        for SN in SN_list_short:
+            '''遍历SN号'''
+            SN=SN.strip('\t')
+            SN=SN.strip('\n')
+
+            try:
+                range=GetDistInfo(SN,input_starttime,input_endtime)
+                range_df=pd.DataFrame([range])
+                drive_info_aday=pd.concat([drive_info_aday,range_df],axis=0)
+
+            except Exception as e:
+                logger.error(traceback.format_exc)
+                logger.error(u"{} :{},{} 任务运行错误".format(SN,input_starttime,input_endtime), exc_info=True)
+        drive_info_aday['time'] = str_date
+        drive_info_aday.columns = ['sn', 'odo', 'accum_soc', 'start_soc', 'end_soc', 'start_time','end_time', 'min_soc', 'time']
+        drive_info_aday.to_sql("odo_result",con=db_engine, if_exists="append",index=False)
+
+    

+ 70 - 0
LIB/FRONTEND/soh/deploy.py

@@ -0,0 +1,70 @@
+#coding=utf-8
+import os
+import datetime
+import pandas as pd
+from LIB.BACKEND import DBManager, Log
+from LIB.MIDDLE import SignalMonitor
+from sqlalchemy import create_engine
+from sqlalchemy.orm import sessionmaker
+import time, datetime
+import traceback
+from LIB.MIDDLE.soh import NCMSoh_20210716 as NCMSoh
+from LIB.MIDDLE.soh import LFPSoh_20210711 as LFPSoh
+from urllib import parse
+
+dbManager = DBManager.DBManager()
+if __name__ == "__main__":
+    # 数据库配置
+    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
+        ))
+    print("mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8".format(
+            user, password, host, port, database
+        ))
+    DbSession = sessionmaker(bind=db_engine)
+    
+    # 日志配置
+    log = Log.Mylog(log_name='signal_monitor', log_level = 'info')
+    log.set_file_hl(file_name='info.log', log_level='info')
+    log.set_file_hl(file_name='error.log', log_level='error')
+    logger = log.get_logger()
+
+    logger.info("pid is + {}".format(os.getpid()))
+
+    SNdata_6040 = pd.read_excel('骑享资产梳理-20210621.xlsx', sheet_name='6040骑享')
+    SNdata_6060 = pd.read_excel('骑享资产梳理-20210621.xlsx', sheet_name='6060')
+    SNnums_6060=SNdata_6060['SN号']
+    SNnums_6040=SNdata_6040['SN号']
+    now_time=datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
+    now_time=datetime.datetime.strptime(now_time,'%Y-%m-%d %H:%M:%S')
+    start_time=now_time-datetime.timedelta(days=30)
+    end_time=str(now_time)
+    start_time=str(start_time)
+
+    for sn in SNnums_6040.tolist():
+        try:
+            res = NCMSoh.cal_soh(sn, end_time, start_time)
+            if not res.empty:
+                res.columns = ['time', 'sn', 'bms_soh', 'soh', 'soh_err']
+                res.to_sql("soh_result",con=db_engine, if_exists="append",index=False)
+        except:
+            logger.error(traceback.format_exc)
+            logger.error(u"{} :{},{} 任务运行错误".format(sn,start_time,end_time), exc_info=True)
+
+    for sn in SNnums_6060.tolist():
+        try:
+            res = LFPSoh.cal_soh(sn, end_time, start_time)
+            if not res.empty:
+                res.columns = ['time', 'sn', 'bms_soh', 'soh', 'soh_err']
+                res.to_sql("soh_result",con=db_engine, if_exists="append",index=False)
+        except:
+            logger.error(traceback.format_exc)
+            logger.error(u"{} :{},{} 任务运行错误".format(sn,start_time,end_time), exc_info=True)
+