From bf37f6d2648ddbd173cf0e80ba39d304d1e0c23f Mon Sep 17 00:00:00 2001 From: "weiye.wang" Date: Fri, 21 Jun 2024 21:39:28 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=AA=E4=BA=BA=E4=BD=BF=E7=94=A8=E8=AE=B0?= =?UTF-8?q?=E5=BD=95=E5=AF=BC=E5=85=A5=E5=8A=9F=E8=83=BD=E5=BC=80=E5=8F=91?= =?UTF-8?q?=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 工具v4/Ui_个人使用记录导入.py | 92 +++++++++++++++++++ 工具v4/database_tools_2.py | 2 + 工具v4/个人使用记录导入.py | 163 ++++++++++++++++++++++++++++++++++ 工具v4/个人使用记录导入.ui | 140 +++++++++++++++++++++++++++++ 4 files changed, 397 insertions(+) create mode 100644 工具v4/Ui_个人使用记录导入.py create mode 100644 工具v4/个人使用记录导入.py create mode 100644 工具v4/个人使用记录导入.ui diff --git a/工具v4/Ui_个人使用记录导入.py b/工具v4/Ui_个人使用记录导入.py new file mode 100644 index 00000000..63467244 --- /dev/null +++ b/工具v4/Ui_个人使用记录导入.py @@ -0,0 +1,92 @@ +# -*- coding: utf-8 -*- + +################################################################################ +## Form generated from reading UI file '个人使用记录导入.ui' +## +## Created by: Qt User Interface Compiler version 6.6.2 +## +## WARNING! All changes made in this file will be lost when recompiling UI file! +################################################################################ + +from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale, + QMetaObject, QObject, QPoint, QRect, + QSize, QTime, QUrl, Qt) +from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor, + QFont, QFontDatabase, QGradient, QIcon, + QImage, QKeySequence, QLinearGradient, QPainter, + QPalette, QPixmap, QRadialGradient, QTransform) +from PySide6.QtWidgets import (QApplication, QHeaderView, QLineEdit, QPushButton, + QSizePolicy, QTableWidget, QTableWidgetItem, QWidget) + +class Ui_Form(object): + def setupUi(self, Form): + if not Form.objectName(): + Form.setObjectName(u"Form") + Form.resize(760, 490) + self.pushButton_fileselect = QPushButton(Form) + self.pushButton_fileselect.setObjectName(u"pushButton_fileselect") + self.pushButton_fileselect.setGeometry(QRect(20, 20, 75, 24)) + self.pushButton_dirselect = QPushButton(Form) + self.pushButton_dirselect.setObjectName(u"pushButton_dirselect") + self.pushButton_dirselect.setGeometry(QRect(20, 60, 75, 24)) + self.lineEdit_filepath = QLineEdit(Form) + self.lineEdit_filepath.setObjectName(u"lineEdit_filepath") + self.lineEdit_filepath.setGeometry(QRect(110, 20, 631, 20)) + self.lineEdit_filepath.setReadOnly(True) + self.lineEdit_dirpath = QLineEdit(Form) + self.lineEdit_dirpath.setObjectName(u"lineEdit_dirpath") + self.lineEdit_dirpath.setGeometry(QRect(110, 60, 631, 20)) + font = QFont() + font.setWeight(QFont.ExtraLight) + self.lineEdit_dirpath.setFont(font) + self.lineEdit_dirpath.setReadOnly(True) + self.tableWidget_filelist = QTableWidget(Form) + if (self.tableWidget_filelist.columnCount() < 1): + self.tableWidget_filelist.setColumnCount(1) + __qtablewidgetitem = QTableWidgetItem() + self.tableWidget_filelist.setHorizontalHeaderItem(0, __qtablewidgetitem) + self.tableWidget_filelist.setObjectName(u"tableWidget_filelist") + self.tableWidget_filelist.setGeometry(QRect(20, 100, 271, 371)) + self.pushButton_exec = QPushButton(Form) + self.pushButton_exec.setObjectName(u"pushButton_exec") + self.pushButton_exec.setGeometry(QRect(300, 180, 111, 91)) + font1 = QFont() + font1.setBold(True) + self.pushButton_exec.setFont(font1) + self.tableWidget_result = QTableWidget(Form) + if (self.tableWidget_result.columnCount() < 4): + self.tableWidget_result.setColumnCount(4) + __qtablewidgetitem1 = QTableWidgetItem() + self.tableWidget_result.setHorizontalHeaderItem(0, __qtablewidgetitem1) + __qtablewidgetitem2 = QTableWidgetItem() + self.tableWidget_result.setHorizontalHeaderItem(1, __qtablewidgetitem2) + __qtablewidgetitem3 = QTableWidgetItem() + self.tableWidget_result.setHorizontalHeaderItem(2, __qtablewidgetitem3) + __qtablewidgetitem4 = QTableWidgetItem() + self.tableWidget_result.setHorizontalHeaderItem(3, __qtablewidgetitem4) + self.tableWidget_result.setObjectName(u"tableWidget_result") + self.tableWidget_result.setGeometry(QRect(420, 100, 321, 371)) + + self.retranslateUi(Form) + + QMetaObject.connectSlotsByName(Form) + # setupUi + + def retranslateUi(self, Form): + Form.setWindowTitle(QCoreApplication.translate("Form", u"\u4e2a\u4eba\u4f7f\u7528\u8bb0\u5f55\u5bfc\u5165", None)) + self.pushButton_fileselect.setText(QCoreApplication.translate("Form", u"\u9009\u62e9\u6587\u4ef6", None)) + self.pushButton_dirselect.setText(QCoreApplication.translate("Form", u"\u9009\u62e9\u6587\u4ef6\u5939", None)) + ___qtablewidgetitem = self.tableWidget_filelist.horizontalHeaderItem(0) + ___qtablewidgetitem.setText(QCoreApplication.translate("Form", u"\u6587\u4ef6\u5217\u8868", None)); + self.pushButton_exec.setText(QCoreApplication.translate("Form", u"\u6536\u5f55\u4e2a\u4eba\u7b54\u9898\u60c5\u51b5\n" +"\u81f3\u6570\u636e\u5e93", None)) + ___qtablewidgetitem1 = self.tableWidget_result.horizontalHeaderItem(0) + ___qtablewidgetitem1.setText(QCoreApplication.translate("Form", u"\u6587\u4ef6\u540d", None)); + ___qtablewidgetitem2 = self.tableWidget_result.horizontalHeaderItem(1) + ___qtablewidgetitem2.setText(QCoreApplication.translate("Form", u"\u5df2\u6709", None)); + ___qtablewidgetitem3 = self.tableWidget_result.horizontalHeaderItem(2) + ___qtablewidgetitem3.setText(QCoreApplication.translate("Form", u"\u4fee\u6539", None)); + ___qtablewidgetitem4 = self.tableWidget_result.horizontalHeaderItem(3) + ___qtablewidgetitem4.setText(QCoreApplication.translate("Form", u"\u65b0\u589e", None)); + # retranslateUi + diff --git a/工具v4/database_tools_2.py b/工具v4/database_tools_2.py index 57f720ff..e38d6c67 100644 --- a/工具v4/database_tools_2.py +++ b/工具v4/database_tools_2.py @@ -30,6 +30,8 @@ db_port = "13306" db_host = "wwylss.synology.me" currentsemester = "2023" +statsfilename = "小题分_按学号(数学).xlsx" + def getgrade(currentsemester,gradeindex): gradelist = {1: "高三", 2:"高二", 3:"高一"} diff --git a/工具v4/个人使用记录导入.py b/工具v4/个人使用记录导入.py new file mode 100644 index 00000000..2180a250 --- /dev/null +++ b/工具v4/个人使用记录导入.py @@ -0,0 +1,163 @@ +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 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" + 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() + diff --git a/工具v4/个人使用记录导入.ui b/工具v4/个人使用记录导入.ui new file mode 100644 index 00000000..38b02c62 --- /dev/null +++ b/工具v4/个人使用记录导入.ui @@ -0,0 +1,140 @@ + + + Form + + + + 0 + 0 + 760 + 490 + + + + 个人使用记录导入 + + + + + 20 + 20 + 75 + 24 + + + + 选择文件 + + + + + + 20 + 60 + 75 + 24 + + + + 选择文件夹 + + + + + + 110 + 20 + 631 + 20 + + + + true + + + + + + 110 + 60 + 631 + 20 + + + + + ExtraLight + + + + true + + + + + + 20 + 100 + 271 + 371 + + + + + 文件列表 + + + + + + + 300 + 180 + 111 + 91 + + + + + true + + + + 收录个人答题情况 +至数据库 + + + + + + 420 + 100 + 321 + 371 + + + + + 文件名 + + + + + 已有 + + + + + 修改 + + + + + 新增 + + + + + + +