实现根据方案自动从数据库下载检测数据并分析

This commit is contained in:
ranchuan
2023-09-18 18:16:26 +08:00
parent 769dfc3734
commit 125c199756
4 changed files with 228 additions and 63 deletions

View File

@@ -44,4 +44,6 @@
2023.9.15 2023.9.15
新增analysis工具 新增analysis工具
2023.9.17 2023.9.17
实现对检测数据的分析,自动填充上下限,一键导出方案 实现对检测数据的分析,自动填充上下限,一键导出方案
2023.9.18
实现根据方案自动从数据库下载检测数据并分析

View File

@@ -151,13 +151,14 @@ class Analysis(QWidget):
# 连接的绘制的方法 # 连接的绘制的方法
def import_but_clicked(self): def import_but_clicked(self):
# t = threading.Thread(target=self.__anslysis, args=()) self.sch_data=scheme_data.sch_data()
# t.start()
# def __anslysis(self):
self.__import_but.setEnabled(False) self.__import_but.setEnabled(False)
widget=QWidget() widget=QWidget()
widget.setGeometry(QRect(0,0,1200,20000)) widget.setGeometry(QRect(0,0,1200,20000))
self.titles,datas=scheme_data.datas() self.titles,datas=self.sch_data.datas_sql()
if(self.titles==None):
self.__import_but.setEnabled(True)
return
for i in range(len(self.titles)): for i in range(len(self.titles)):
self.addItem(datas[i],self.titles[i],[self.titles[i]]) self.addItem(datas[i],self.titles[i],[self.titles[i]])
widget.setLayout(self.__layout) widget.setLayout(self.__layout)
@@ -168,7 +169,7 @@ class Analysis(QWidget):
max=i[1].item_value(t+":LimitMax") max=i[1].item_value(t+":LimitMax")
min=i[1].item_value(t+":LimitMin") min=i[1].item_value(t+":LimitMin")
ret_limit.append((max,min)) ret_limit.append((max,min))
scheme_data.export_scheme(ret_limit) self.sch_data.export_scheme(ret_limit)
# 运行程序 # 运行程序
if __name__ == '__main__': if __name__ == '__main__':
app = QApplication(sys.argv) app = QApplication(sys.argv)

View File

@@ -5,9 +5,105 @@ import numpy as np
import datetime import datetime
from datetime import datetime, timedelta from datetime import datetime, timedelta
import os import os
import sys
import pymysql as mysql
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
__INFO_NAME="scheme_export_info.txt"
class quest_text(QObject):
def __init__(self,title:str,info:str):
QObject.__init__(self)
# self.app = QApplication(sys.argv)
self.w=QDialog()
self.w.resize(320,80)
self.w.setWindowTitle(title)
self.w.setAttribute(Qt.WidgetAttribute.WA_DeleteOnClose)
self.w.setWindowModality(Qt.WindowModality.ApplicationModal)
self.text=info
self.text_edit = QTextEdit(self.w)
self.text_edit.setObjectName(u"text")
self.text_edit.setGeometry(QRect(10, 10, 300, 30))
self.text_edit.setFrameShape(QFrame.Shape.Box)
self.text_edit.setMidLineWidth(1)
self.text_edit.setVerticalScrollBarPolicy(Qt.ScrollBarPolicy.ScrollBarAsNeeded)
self.text_edit.setPlainText(self.text)
self.text_edit.moveCursor(QTextCursor.MoveOperation.End, QTextCursor.MoveMode.MoveAnchor)
self.ok_but_init()
self.cancel_but_init()
def ok_but_init(self):
self.ok_but=QPushButton(self.w)
self.ok_but.setObjectName(u"ok_but")
self.ok_but.setGeometry(QRect(210, 50, 90, 28))
self.ok_but.clicked.connect(self.ok_but_clicked)
self.ok_but.setText("确认")
self.ok_but.setCheckable(True)
self.ok_but.setChecked(True)
self.ok_state=False
def cancel_but_init(self):
self.cancel_but=QPushButton(self.w)
self.cancel_but.setObjectName(u"cancel_but")
self.cancel_but.setGeometry(QRect(100, 50, 90, 28))
self.cancel_but.clicked.connect(self.cancel_but_clicked)
self.cancel_but.setText("取消")
self.ok_but.setCheckable(True)
self.ok_state=False
def ok_but_clicked(self):
self.text=self.text_edit.toPlainText()
self.ok_state=True
self.w.done(QDialog.DialogCode.Accepted)
self.w.close()
def cancel_but_clicked(self):
self.text=self.text_edit.toPlainText()
self.ok_state=False
self.w.done(QDialog.DialogCode.Accepted)
self.w.close()
def show(self):
self.w.exec()
return self.ok_state,self.text
def _connect_sql():
try:
db=mysql.connect(host='47.108.119.117',user='ymp',passwd='Abc@12345',port=15319)
cur=db.cursor()
cur.execute("use datacenter")
print("connect mysql success.")
return db,cur
except Exception as e:
print("can not connect service.")
return None,None
# 生成一个任务的参数 # 生成一个任务的参数
def __scheme_task_to_retinfo(j:json): def _scheme_task_to_retinfo(j:json):
texts=[] texts=[]
length=len(j["TestStandard"]) length=len(j["TestStandard"])
for i in j["ReturnInfo"]: for i in j["ReturnInfo"]:
@@ -15,7 +111,7 @@ def __scheme_task_to_retinfo(j:json):
return texts return texts
# 生成任务参数序列 # 生成任务参数序列
def __scheme_tasks_to_retinfo(j:json): def _scheme_tasks_to_retinfo(j:json):
# texts=[] # texts=[]
# for i in j["TaskArray"]: # for i in j["TaskArray"]:
# texts+=__scheme_task_to_retinfo(i) # texts+=__scheme_task_to_retinfo(i)
@@ -24,36 +120,66 @@ def __scheme_tasks_to_retinfo(j:json):
return texts return texts
def __json_extract_retinfo(name:str): def _json_extract_retinfo(name:str):
with open(name,"rb") as f: with open(name,"rb") as f:
json_obj=json.loads(f.read()) json_obj=json.loads(f.read())
return __scheme_tasks_to_retinfo(json_obj) return _scheme_tasks_to_retinfo(json_obj),json_obj["PlanID"]
return None return None,None
def __get_date(): def _get_date():
now_time = datetime.utcnow() now_time = datetime.utcnow()
utc_time = now_time + timedelta(hours=8) utc_time = now_time + timedelta(hours=8)
utc_time = utc_time.strftime("%Y%m%d") utc_time = utc_time.strftime("%Y%m%d")
return utc_time return utc_time
# 获取本次生成方案的id号
def __get_scheme_id(): # 保存设置
info_name="scheme_export_info.txt" def _save_info(info):
id=1 info_name=__INFO_NAME
with open(info_name,"w+") as f:
# print("saving info:",date,id,save_name)
f.write(info[0]+'\n')
f.write(str(info[1])+'\n')
f.write(info[2]+'\n')
f.write(info[3]+'\n')
f.write(info[4]+'\n')
def _get_info():
info_name=__INFO_NAME
if os.path.exists(info_name): if os.path.exists(info_name):
info_f=open(info_name,'r') info_f=open(info_name,'r')
lines=info_f.readlines() lines=info_f.readlines()
if(__get_date()==lines[0].strip()): date=lines[0].strip()
id=int(lines[1].strip())+1 id=int(lines[1].strip())
name=lines[2].strip()
date_start=lines[3].strip()
date_end=lines[4].strip()
info_f.close() info_f.close()
with open(info_name,"w+") as f: else:
f.write(__get_date()+'\n') date="20230101"
f.write(str(id)+'\n') id=1
name="方案参数校准"
date_start="2023-01-01"
date_end="2023-01-01"
# print("get info:",date,id,name)
return (date,id,name,date_start,date_end)
# 获取本次生成方案的id号
def _get_scheme_id():
info=_get_info()
date=info[0]
id=info[1]
if(date!=_get_date()):
date=_get_date()
id=1
else:
id+=1
_save_info((date,id,info[2],info[3],info[4]))
return id return id
def __reflush_scheme_id(id): def _reflush_scheme_id(id):
# 日bit0~bit4 月bit5~bit8 年bit9~bit15 # 日bit0~bit4 月bit5~bit8 年bit9~bit15
sid=(id>>0)&0x7f sid=(id>>0)&0x7f
modele=(id>>7)&0x1f modele=(id>>7)&0x1f
@@ -63,7 +189,7 @@ def __reflush_scheme_id(id):
year=((id>>25)&0x7f)+2022 year=((id>>25)&0x7f)+2022
now_time = datetime.utcnow() now_time = datetime.utcnow()
utc_time = now_time + timedelta(hours=8) utc_time = now_time + timedelta(hours=8)
sid=__get_scheme_id() sid=_get_scheme_id()
day=utc_time.day day=utc_time.day
month=utc_time.month month=utc_time.month
year=utc_time.year-2022 year=utc_time.year-2022
@@ -71,9 +197,9 @@ def __reflush_scheme_id(id):
return id,sid return id,sid
def main(): def _main():
save_name="check_data.csv" save_name="check_data.csv"
title=__json_extract_retinfo("代工厂数据采集EJ旧68uF22um08211.json") title,=_json_extract_retinfo("代工厂数据采集EJ旧68uF22um08211.json")
save_f=open(save_name,'+w') save_f=open(save_name,'+w')
save_f.write(','.join(title)+'\n') save_f.write(','.join(title)+'\n')
err_num=0 err_num=0
@@ -88,43 +214,73 @@ def main():
print("检测异常数量为:",err_num) print("检测异常数量为:",err_num)
def datas(): class sch_data(object):
title=__json_extract_retinfo("代工厂数据采集EJ旧68uF22um08211.json") def __init__(self):
data_list=[] self.scheme_name=""
for i in title: def datas_sql(self):
t=[] fileName,fileType = QFileDialog.getOpenFileNames(None, "选取文件", os.getcwd(),
data_list.append(t) "检测方案(*.json)")
with open("EJ09C测试数据.csv",newline="") as f: if(len(fileName)==0):
data=csv.reader(f) print("user cancelled.")
for row in data: return None,None
if(row[3]=='0'): print(fileName,fileType)
s=row[4].split(',') scheme_name=fileName[0]
for i in range(len(s)): info=_get_info()
data_list[i].append(int(s[i])) quest=quest_text("请输入要获取数据的日期",info[3]+','+info[4])
return title,data_list ack,date_interval=quest.show()
if(ack!=True):
print("user cancelled.")
return None,None
date_interval=date_interval.split(',')
date_start=date_interval[0]+" 00:00:00"
date_end=date_interval[1]+" 23:59:59"
_save_info((info[0],info[1],info[2],date_interval[0],date_interval[1]))
self.scheme_name=scheme_name
title,scheme_id=_json_extract_retinfo(scheme_name)
data_list=[]
for i in title:
t=[]
data_list.append(t)
db,cur=_connect_sql()
if(db!=None):
cmd="""SELECT id,create_time,addr,err_code,valuez FROM check_result_detail
where create_time > %s and create_time < %s
and result_id in (select pk from check_result where plan_id =%s) ;"""
cur.execute(cmd,(date_start,date_end,scheme_id))
check_data=cur.fetchall()
print("check_data_len=",len(check_data))
for row in check_data:
if(row[3]==0):
s=row[4].split(',')
for i in range(len(s)):
data_list[i].append(int(s[i]))
return title,data_list
def export_scheme(ret_limit): def export_scheme(self,ret_limit):
name="代工厂数据采集EJ旧68uF22um08211.json" name=self.scheme_name
save_name="代工厂参数标定测试EJ" info=_get_info()
index=0 date=info[0]
with open(name,"r",encoding="utf-8") as f: id=info[1]
json_obj=json.loads(f.read()) save_name=info[2]
for i in json_obj["TaskArray"]: quest=quest_text("请输入要导出的文件名",save_name)
for j in i["TestStandard"]: ack,save_name=quest.show()
j["Max"]=ret_limit[index][0] if(ack!=True):
j["Min"]=ret_limit[index][1] print("user cancelled.")
json_obj["PlanID"],sid=__reflush_scheme_id(json_obj["PlanID"]) return
save_name=save_name+"_"+__get_date()+"{d:02d}".format(d=sid) _save_info((date,id,save_name,info[3],info[4]))
json_obj["PlanBrief"]=save_name index=0
json_str=json.dumps(json_obj, sort_keys=True, indent=4, separators=(',', ': '),ensure_ascii=False) with open(name,"r",encoding="utf-8") as f:
save_f=open(save_name+".json",'+wb') json_obj=json.loads(f.read())
save_f.write(json_str.encode("utf-8")) for i in json_obj["TaskArray"]:
save_f.close() for j in i["TestStandard"]:
j["Max"]=ret_limit[index][0]
j["Min"]=ret_limit[index][1]
json_obj["PlanID"],sid=_reflush_scheme_id(json_obj["PlanID"])
save_name=save_name+"_"+date+"{d:02d}".format(d=sid)
json_obj["PlanBrief"]=save_name
json_str=json.dumps(json_obj, sort_keys=True, indent=4, separators=(',', ': '),ensure_ascii=False)
save_f=open(save_name+".json",'+wb')
save_f.write(json_str.encode("utf-8"))
save_f.close()
if __name__ == "__main__": if __name__ == "__main__":
# main() _main()
x=[1,2,3,4,5,6,7]
avg=np.average(x)
print(type(x),type(avg))
sub=np.abs(x-avg)
print(sub)

6
mysql/connections.ncx Normal file
View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<Connections Ver="1.5">
<Connection ConnectionName="data_service" ProjectUUID="" ConnType="MYSQL" OraConnType="" ServiceProvider="Default" Host="124.70.178.159" Port="3306" Database="" OraServiceNameType="" TNS="" MSSQLAuthenMode="" MSSQLAuthenWindowsDomain="" DatabaseFileName="" UserName="admin" Password="3BFE1EF86FA1343C221914D12EDD2026" SavePassword="true" SettingsSavePath="C:\Users\Andy\Documents\Navicat\MySQL\Servers\data_service" SessionLimit="0" ClientCharacterSet="" ClientEncoding="65001" Keepalive="false" KeepaliveInterval="240" Encoding="65001" MySQLCharacterSet="true" Compression="false" AutoConnect="false" NamedPipe="false" NamedPipeSocket="" OraRole="" OraOSAuthen="false" SQLiteEncrypt="false" SQLiteEncryptPassword="" SQLiteSaveEncryptPassword="false" UseAdvanced="false" SSL="false" SSL_Authen="false" SSL_PGSSLMode="REQUIRE" SSL_ClientKey="" SSL_ClientCert="" SSL_CACert="" SSL_Clpher="" SSL_PGSSLCRL="" SSL_WeakCertValidation="false" SSL_AllowInvalidHostName="false" SSL_PEMClientKeyPassword="" SSH="false" SSH_Host="" SSH_Port="22" SSH_UserName="" SSH_AuthenMethod="PASSWORD" SSH_Password="" SSH_SavePassword="false" SSH_PrivateKey="" SSH_Passphrase="" SSH_SavePassphrase="false" SSH_Compress="false" HTTP="false" HTTP_URL="" HTTP_PA="" HTTP_PA_UserName="" HTTP_PA_Password="" HTTP_PA_SavePassword="" HTTP_EQ="" HTTP_CA="" HTTP_CA_ClientKey="" HTTP_CA_ClientCert="" HTTP_CA_CACert="" HTTP_CA_Passphrase="" HTTP_Proxy="" HTTP_Proxy_Host="" HTTP_Proxy_Port="" HTTP_Proxy_UserName="" HTTP_Proxy_Password="" HTTP_Proxy_SavePassword="" Compatibility="false" Compatibility_OverrideLowerCaseTableNames="false" Compatibility_LowerCaseTableNames="" Compatibility_OverrideSQLMode="false" Compatibility_SQLMode="" Compatibility_OverrideIsSupportNDB="false" Compatibility_IsSupportNDB="false" Compatibility_OverrideDatabaseListingMethod="false" Compatibility_DatabaseListingMethod="" Compatibility_OverrideViewListingMethod="false" Compatibility_ViewListingMethod=""/>
<Connection ConnectionName="生成数据" ProjectUUID="" ConnType="MYSQL" OraConnType="" ServiceProvider="Default" Host="47.108.119.117" Port="15319" Database="" OraServiceNameType="" TNS="" MSSQLAuthenMode="" MSSQLAuthenWindowsDomain="" DatabaseFileName="" UserName="ymp" Password="49EE49F2A92E761E13A35B7946DFABED" SavePassword="true" SettingsSavePath="C:\Users\Andy\Documents\Navicat\MySQL\Servers\生成数据" SessionLimit="0" ClientCharacterSet="" ClientEncoding="65001" Keepalive="false" KeepaliveInterval="240" Encoding="65001" MySQLCharacterSet="true" Compression="false" AutoConnect="false" NamedPipe="false" NamedPipeSocket="" OraRole="" OraOSAuthen="false" SQLiteEncrypt="false" SQLiteEncryptPassword="" SQLiteSaveEncryptPassword="false" UseAdvanced="false" SSL="false" SSL_Authen="false" SSL_PGSSLMode="REQUIRE" SSL_ClientKey="" SSL_ClientCert="" SSL_CACert="" SSL_Clpher="" SSL_PGSSLCRL="" SSL_WeakCertValidation="false" SSL_AllowInvalidHostName="false" SSL_PEMClientKeyPassword="" SSH="false" SSH_Host="" SSH_Port="22" SSH_UserName="" SSH_AuthenMethod="PASSWORD" SSH_Password="" SSH_SavePassword="false" SSH_PrivateKey="" SSH_Passphrase="" SSH_SavePassphrase="false" SSH_Compress="false" HTTP="false" HTTP_URL="" HTTP_PA="" HTTP_PA_UserName="" HTTP_PA_Password="" HTTP_PA_SavePassword="" HTTP_EQ="" HTTP_CA="" HTTP_CA_ClientKey="" HTTP_CA_ClientCert="" HTTP_CA_CACert="" HTTP_CA_Passphrase="" HTTP_Proxy="" HTTP_Proxy_Host="" HTTP_Proxy_Port="" HTTP_Proxy_UserName="" HTTP_Proxy_Password="" HTTP_Proxy_SavePassword="" Compatibility="false" Compatibility_OverrideLowerCaseTableNames="false" Compatibility_LowerCaseTableNames="" Compatibility_OverrideSQLMode="false" Compatibility_SQLMode="" Compatibility_OverrideIsSupportNDB="false" Compatibility_IsSupportNDB="false" Compatibility_OverrideDatabaseListingMethod="false" Compatibility_DatabaseListingMethod="" Compatibility_OverrideViewListingMethod="false" Compatibility_ViewListingMethod=""/>
</Connections>