from PySide6.QtWidgets import QWidget, QApplication, QFileDialog, QTableWidgetItem from PySide6.QtGui import QColor from Ui_个人使用记录导入 import Ui_Form from database_tools_2 import * def getFilename(string): filename = re.findall(r"\d{21}_([\s\S]*?)_高[一二三]_数学",string)[0] return filename def getFiledate(string): date = re.findall(r"\((\d{8})\).zip",string) if len(date) > 0: return date[0] else: return "" class MyWindow_grdr(QWidget,Ui_Form): def __init__(self,database_name): super().__init__() self.setupUi(self) self.database_name = database_name self.bind() def setdbname(self,string): self.database_name = string # print(self.database_name) def bind(self): self.tableWidget_filelist.setColumnWidth(0,270) self.tableWidget_result.setColumnWidth(0,195) for i in range(1,4): self.tableWidget_result.setColumnWidth(i,40) self.pushButton_dirselect.clicked.connect(self.select_dir) self.pushButton_fileselect.clicked.connect(self.select_file) self.pushButton_exec.clicked.connect(self.exec) def select_dir(self): self.lineEdit_filepath.setText("未选择单一文件.") dirpath = QFileDialog.getExistingDirectory(self,"选择文件夹") self.lineEdit_dirpath.setText(dirpath) self.filelist = [os.path.join(dirpath,f) for f in os.listdir(dirpath)] self.tableWidget_filelist.setRowCount(len(self.filelist)) for i in range(len(self.filelist)): self.tableWidget_filelist.setItem(i,0,QTableWidgetItem(f"{getFilename(self.filelist[i])} {getFiledate(self.filelist[i])}")) def select_file(self): self.lineEdit_dirpath.setText("未选择文件夹.") self.tableWidget_filelist.setRowCount(1) pathlist = QFileDialog.getOpenFileName(self,"选择文件",".","zip文件(*.zip);;所有文件(*)") self.lineEdit_filepath.setText(pathlist[0]) self.filelist = [pathlist[0]] for i in range(len(self.filelist)): self.tableWidget_filelist.setItem(i,0,QTableWidgetItem(f"{getFilename(self.filelist[i])} {getFiledate(self.filelist[i])}")) def exec(self): tempdir = "临时文件/zips" self.tableWidget_result.clearContents() self.tableWidget_result.setRowCount(0) mydb = connect(hostname = db_host, port = db_port, username=db_user, pwd=db_pwd, db = self.database_name) mycursor = mydb.cursor() for zf in tqdm.tqdm(self.filelist,desc = "文件处理进度 "): legalflag = True if re.findall(r"\(\d{8}\)",zf) == []: legalflag = False else: #如果文件名中有日期信息 udlist = [] filedate = getFiledate(zf) ud = generateUsagedetail(zipfilepath=zf,tempdir=tempdir,cursor=mycursor,statsfilename=statsfilename,threshold=0.20,date=filedate) if not ud == 1: udlist += ud.copy() else: udlist = [] legalflag = False #以下生成三个种类的使用记录 id_used_list = [] for u in udlist: if not u["ID"] in id_used_list: id_used_list.append(u["ID"]) if len(id_used_list) >= 1: sql = "SELECT ID,date,studentid,studentname,diff,answersheet FROM usagedetail WHERE NOT obsolete AND ID in " id_used_set = "(" for id in id_used_list: id_used_set += ('"'+id+'",') id_used_set = id_used_set[:-1] + ")" mycursor.execute(sql+id_used_set+";") used_info = mycursor.fetchall() else: used_info = [] used_info_short = [(u[0],u[2],u[4],u[5]) for u in used_info] used_info_id_and_as = [(u[0],u[2],u[5]) for u in used_info] repeat_list = [] to_flush_list = [] unused_list = [] for u in tqdm.tqdm(udlist): datum = (u["ID"],u["date"],u["studentid"],u["studentname"],json.dumps(u["diff"]),u["answersheet"]) if datum in used_info: repeat_list.append(datum) else: datum_short = (datum[0],datum[2],datum[4],datum[5]) datum_id_and_ans = (datum[0],datum[2],datum[5]) if datum_short in used_info_short: repeat_list.append(datum) elif datum_id_and_ans in used_info_id_and_as: to_flush_list.append(datum) else: unused_list.append(datum) current_row_count = self.tableWidget_result.rowCount() self.tableWidget_result.insertRow(current_row_count) self.tableWidget_result.setItem(current_row_count,0,QTableWidgetItem(getFilename(zf))) if legalflag: #修改部分批改情况改过的已有记录 for item in tqdm.tqdm(to_flush_list): sql = "UPDATE usagedetail SET diff = %s WHERE ID = %s AND studentid = %s AND answersheet = %s AND NOT obsolete;" val = (item[4],item[0],item[2],item[5]) mycursor.execute(sql,val) sql = "INSERT INTO logs (DATE,TIME,username,action,id,db_content) VALUE (%s,%s,%s,%s,%s,%s);" val = (GetDate(),GetTime(),get_git_username(),"修改个人答题情况",item[0],json.dumps(item,ensure_ascii = False)) mycursor.execute(sql,val) mydb.commit() #导入新使用记录 templist = unused_list.copy() pieceslist = [] while len(templist) > 5000: pieceslist.append((5000,templist[:5000].copy())) templist = templist[5000:] pieceslist.append((len(templist),templist)) if len(unused_list) >= 1: for piece in tqdm.tqdm(pieceslist): inssql = "INSERT INTO usagedetail (ID,date,studentid,studentname,diff,answersheet) VALUES "+",".join(["(%s,%s,%s,%s,%s,%s)"]*piece[0])+";" insval = [] for item in piece[1]: insval += list(item) mycursor.execute(inssql,insval) logsql = "INSERT INTO logs (DATE,TIME,username,action,db_content) VALUE (%s,%s,%s,%s,%s);" log_content = f"答题纸: {set([u[-1] for u in unused_list])} 题目: {set([u[0] for u in unused_list])}, 学生账号: {set([u[2] for u in unused_list])}" logval = (GetDate(),GetTime(),get_git_username(),"新增个人答题情况",log_content) mycursor.execute(logsql,logval) mydb.commit() #正常讲义不染色 self.tableWidget_result.setItem(current_row_count,1,QTableWidgetItem(str(len(repeat_list)))) self.tableWidget_result.setItem(current_row_count,2,QTableWidgetItem(str(len(to_flush_list)))) self.tableWidget_result.setItem(current_row_count,3,QTableWidgetItem(str(len(unused_list)))) # print(len(repeat_list),len(to_flush_list),len(unused_list)) else: #非正常讲义染色 self.tableWidget_result.item(current_row_count,0).setBackground(QColor("red")) for i in range(1,4): self.tableWidget_result.setItem(current_row_count,i,QTableWidgetItem("")) self.tableWidget_result.item(current_row_count,i).setBackground(QColor("red")) mydb.close() if __name__ == '__main__': app = QApplication([]) windows = MyWindow_grdr("tikutest") windows.show() app.exec()