个人使用记录导入功能开发完成

This commit is contained in:
weiye.wang 2024-06-21 21:39:28 +08:00
parent a0c0a83b52
commit bf37f6d264
4 changed files with 397 additions and 0 deletions

View File

@ -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

View File

@ -30,6 +30,8 @@ db_port = "13306"
db_host = "wwylss.synology.me"
currentsemester = "2023"
statsfilename = "小题分_按学号数学.xlsx"
def getgrade(currentsemester,gradeindex):
gradelist = {1: "高三", 2:"高二", 3:"高一"}

View File

@ -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()

View File

@ -0,0 +1,140 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>Form</class>
<widget class="QWidget" name="Form">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>760</width>
<height>490</height>
</rect>
</property>
<property name="windowTitle">
<string>个人使用记录导入</string>
</property>
<widget class="QPushButton" name="pushButton_fileselect">
<property name="geometry">
<rect>
<x>20</x>
<y>20</y>
<width>75</width>
<height>24</height>
</rect>
</property>
<property name="text">
<string>选择文件</string>
</property>
</widget>
<widget class="QPushButton" name="pushButton_dirselect">
<property name="geometry">
<rect>
<x>20</x>
<y>60</y>
<width>75</width>
<height>24</height>
</rect>
</property>
<property name="text">
<string>选择文件夹</string>
</property>
</widget>
<widget class="QLineEdit" name="lineEdit_filepath">
<property name="geometry">
<rect>
<x>110</x>
<y>20</y>
<width>631</width>
<height>20</height>
</rect>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
<widget class="QLineEdit" name="lineEdit_dirpath">
<property name="geometry">
<rect>
<x>110</x>
<y>60</y>
<width>631</width>
<height>20</height>
</rect>
</property>
<property name="font">
<font>
<fontweight>ExtraLight</fontweight>
</font>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
<widget class="QTableWidget" name="tableWidget_filelist">
<property name="geometry">
<rect>
<x>20</x>
<y>100</y>
<width>271</width>
<height>371</height>
</rect>
</property>
<column>
<property name="text">
<string>文件列表</string>
</property>
</column>
</widget>
<widget class="QPushButton" name="pushButton_exec">
<property name="geometry">
<rect>
<x>300</x>
<y>180</y>
<width>111</width>
<height>91</height>
</rect>
</property>
<property name="font">
<font>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>收录个人答题情况
至数据库</string>
</property>
</widget>
<widget class="QTableWidget" name="tableWidget_result">
<property name="geometry">
<rect>
<x>420</x>
<y>100</y>
<width>321</width>
<height>371</height>
</rect>
</property>
<column>
<property name="text">
<string>文件名</string>
</property>
</column>
<column>
<property name="text">
<string>已有</string>
</property>
</column>
<column>
<property name="text">
<string>修改</string>
</property>
</column>
<column>
<property name="text">
<string>新增</string>
</property>
</column>
</widget>
</widget>
<resources/>
<connections/>
</ui>