123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194 |
- """
- 功能:一次性导出云阅卷需要的所有内容
- 时间:2020/03/17
- author:pengchen
- """
- import csv
- import os
- import cloudservice
- import config
- import htmlhandler
- import logger
- questionlist = []
- solvelist = []
- examstudentlist = []
- mediaimportlist = []
- question_cookie = {}
- output = config.outputpath + "/" + str(config.examId)
- if not os.path.exists(output):
- os.makedirs(output)
- savepath = output + "/" + "question.csv"
- student_savepath = output + "/" + "examstudent.csv"
- mediaimport_savepath = output + "/" + "mediaimport.csv"
- def main():
- result = cloudservice.queryExamMarkingInfo()
- if result:
- examRecordForMarkingBeanList = result['examRecordForMarkingBeanList']
- for examRecordForMarkingBean in examRecordForMarkingBeanList:
- handleRecordData(examRecordForMarkingBean["courseId"], 1)
- with open(savepath, 'w', encoding='gbk', newline='') as f:
- writer = csv.writer(f)
- writer.writerow(['科目代码', '科目名称', '大题名称', 'main_number', 'sub_number', '分值'])
- for row in questionlist:
- writer.writerow(row)
- with open(mediaimport_savepath, 'w', encoding='gbk', newline='') as f:
- writer = csv.writer(f)
- writer.writerow(['准考证号', '卷型'])
- for row in mediaimportlist:
- writer.writerow(row)
- with open(student_savepath, 'w', encoding='gbk', newline='') as f:
- writer = csv.writer(f)
- writer.writerow(["课程代码", "课程名称", "准考证号", "学号", "姓名"])
- for row in examstudentlist:
- writer.writerow(row)
- def handleRecordData(courseId, next):
- result = cloudservice.queryExamValidRecordData(courseId, next);
- if result:
- examRecordForMarkingBeanList = result["examRecordForMarkingBeanList"]
- if len(examRecordForMarkingBeanList) > 0:
- for examRecordForMarking in examRecordForMarkingBeanList:
- # examRecordDataId = str(examRecordForMarking["examRecordDataId"]);
- # if examRecordDataId != "39881554" and examRecordDataId != "39879641":
- # # logger.info("不用处理,跳过!examRecordDataId = %s" % examRecordDataId)
- # continue
- print("开始处理 examRecordDataId = %s" % str(examRecordForMarking["examRecordDataId"]))
- # 取试卷题目
- course = cloudservice.getCourse(examRecordForMarking['courseId'])["courseList"][0]
- examstudent = cloudservice.queryExamStudent(examRecordForMarking["examStudentId"])
- mediaimportlist.append(
- [examRecordForMarking["examRecordDataId"], examRecordForMarking["paperType"]])
- examstudentlist.append([examstudent["courseCode"], examstudent["courseName"],
- examRecordForMarking["examRecordDataId"], examstudent["identityNumber"],
- examstudent["studentName"]])
- output = config.outputpath + "/" + str(config.examId) + "/" + str(course["code"]) + "-" + \
- examRecordForMarking["paperType"]
- if not os.path.exists(output):
- os.makedirs(output)
- savepath = output + "/" + str(examRecordForMarking["examRecordDataId"]) + ".json"
- if course["code"] in solvelist:
- logger.info("已包含课程代码:%s" % (course["code"]))
- else:
- print("开始处理课程代码:" + str(course["code"]))
- solvelist.append(course["code"])
- handlePaperStruct(course["code"], examRecordForMarking["paperType"],
- examRecordForMarking["basePaperId"], course["name"])
- if os.path.exists(savepath):
- logger.info("已处理,跳过!examRecordDataId = %s" % str(examRecordForMarking["examRecordDataId"]))
- continue
- # #取每个人试卷的内容
- # subjectdetail = cloudservice.querySubjectInfo(examRecordForMarking["examRecordDataId"])
- # questionbeanlist=handleStudentPaperDetail(examRecordForMarking["examRecordDataId"],subjectdetail,course["code"],examRecordForMarking["paperType"])
- # # 存储到本地
- # with open(savepath, "w", encoding="utf-8") as file:
- # json_str = json.dumps(questionbeanlist, indent=4, ensure_ascii=False)
- # file.write(json_str)
- # logger.info("examRecordId %s handle end" % (str(examRecordForMarking["examRecordDataId"])))
- next = result["next"]
- handleRecordData(examRecordForMarking['courseId'], next)
- def handleStudentPaperDetail(examRecordid, subjectdetail, courseCode, paperType):
- questionBeanList = []
- querySubjectiveAnswerBeanList = subjectdetail["querySubjectiveAnswerBeanList"]
- question_unit_number = 1
- lastquestionId = None
- for querySubjectiveAnswerBean in querySubjectiveAnswerBeanList:
- questionId = querySubjectiveAnswerBean["questionId"]
- main_number = querySubjectiveAnswerBean["mainNumber"]
- sub_number = querySubjectiveAnswerBean["order"]
- studentanswer = querySubjectiveAnswerBean["studentAnswer"]
- mainbodyblocklist = None
- if lastquestionId == questionId:
- question_unit_number = question_unit_number + 1 # 下一道主观题
- else:
- lastquestionId = questionId
- question_unit_number = 1
- if questionId in question_cookie:
- questiondata = question_cookie[questionId]
- else:
- questiondata = cloudservice.getQuestion(questionId, courseCode, paperType)
- question_cookie[questionId] = questiondata
- if questiondata["defaultQuestion"]["masterVersion"]["body"]:
- # 套题处理
- mainquestionbody = questiondata["defaultQuestion"]["masterVersion"]["body"]
- mainbodyblocklist = htmlhandler.splitQuestionBody(mainquestionbody)
- questionUnitList = questiondata["defaultQuestion"]["masterVersion"]["questionUnitList"]
- current_subjective_number = 1
- for questionUnit in questionUnitList:
- sub_ques_body = questionUnit["body"]
- print(questionUnit["questionType"])
- if questionUnit["questionType"] == "FILL_UP" or questionUnit["questionType"] == "ESSAY":
- if current_subjective_number == question_unit_number:
- questionBean = {
- "mainNumber": main_number,
- "subNumber": sub_number,
- "studentAnswer": {
- "sections": []
- },
- "answer": {
- "sections": []
- },
- "body": {
- "sections": []
- }
- }
- quesbodyblocklist = htmlhandler.splitQuestionBody(sub_ques_body)
- if mainbodyblocklist:
- questionBean["body"]["sections"] = mainbodyblocklist + quesbodyblocklist
- else:
- questionBean["body"]["sections"] = quesbodyblocklist
- questionBean["studentAnswer"]["sections"] = htmlhandler.splitQuesitonStudentAnswer(examRecordid,
- studentanswer,
- questionUnit[
- "answerType"],
- questionUnit[
- "questionType"])
- questionBean["answer"]["sections"] = htmlhandler.splitQuesitonAnswer(questionUnit["rightAnswer"][0])
- questionBeanList.append(questionBean)
- current_subjective_number = current_subjective_number + 1
- return questionBeanList
- def handlePaperStruct(courseCode, groupCode, paperId, courseName):
- result = cloudservice.queryPaperStruct(courseCode, groupCode, paperId, courseName)
- if result:
- questionGroupList = result["defaultPaper"]["questionGroupList"]
- main_number = 1
- order = 1
- for questionGroup in questionGroupList:
- questionWrapperList = questionGroup["questionWrapperList"]
- for questionWrapper in questionWrapperList:
- questionUnitWrapperList = questionWrapper["questionUnitWrapperList"]
- for questionUnitWrapper in questionUnitWrapperList:
- questionbean = []
- if questionUnitWrapper["questionType"] == "ESSAY" or questionUnitWrapper[
- "questionType"] == "FILL_UP":
- questionbean.append(courseCode)
- questionbean.append(courseName)
- questionbean.append("第%d大题" % (main_number))
- questionbean.append(main_number)
- questionbean.append(order)
- questionScore = questionUnitWrapper["questionScore"]
- questionbean.append(questionScore)
- questionlist.append(questionbean)
- order = order + 1
- main_number = main_number + 1
- else:
- solvelist.remove(courseCode)
- if __name__ == "__main__":
- main()
|