个人使用记录导入功能开发完成
This commit is contained in:
parent
a0c0a83b52
commit
bf37f6d264
|
|
@ -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
|
||||||
|
|
||||||
|
|
@ -30,6 +30,8 @@ db_port = "13306"
|
||||||
db_host = "wwylss.synology.me"
|
db_host = "wwylss.synology.me"
|
||||||
|
|
||||||
currentsemester = "2023"
|
currentsemester = "2023"
|
||||||
|
statsfilename = "小题分_按学号(数学).xlsx"
|
||||||
|
|
||||||
|
|
||||||
def getgrade(currentsemester,gradeindex):
|
def getgrade(currentsemester,gradeindex):
|
||||||
gradelist = {1: "高三", 2:"高二", 3:"高一"}
|
gradelist = {1: "高三", 2:"高二", 3:"高一"}
|
||||||
|
|
|
||||||
|
|
@ -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()
|
||||||
|
|
||||||
|
|
@ -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>
|
||||||
Reference in New Issue