""" 功能:导出包含客观题在内的所有题目作答 版本: v1.0 时间:2020/10/15 """ import cloudservice import config import os import json import logger import htmlhandler import csv import cloudinfservice 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='utf-8', 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='utf-8', newline='') as f: # writer = csv.writer(f) # writer.writerow(['准考证号', '卷型']) # for row in mediaimportlist: # writer.writerow(row) with open(student_savepath, 'w', encoding='utf-8', 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: # 取试卷题目 logger.info("examRecordId %s handle start" % (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"]+"-"+examRecordForMarking["paperType"], 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: logger.info("开始处理" + str(course["code"])) solvelist.append(course["code"]) handlePaperStruct(course["code"],examRecordForMarking["paperType"],examRecordForMarking["basePaperId"],course["name"]) if os.path.exists(savepath): logger.info("已有%s记录不再次进行处理" % str(examRecordForMarking["examRecordDataId"])) continue questiondetail=cloudinfservice.queryStudentAnswer(examRecordForMarking["examRecordDataId"]) questionbeanlist=handleStudentPaperDetail(examRecordForMarking["examRecordDataId"],questiondetail,course["code"],examRecordForMarking["paperType"]) #取每个人试卷的内容 #subjectdetail = cloudservice.querySubjectInfo(examRecordForMarking["examRecordDataId"]) #questionbeanlist=handleStudentPaperDetail(examRecordForMarking["examRecordDataId"],subjectdetail,examRecordForMarking["paperType"], course["code"]) # 存储到本地 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["examQuestionEntities"] question_unit_number = 1 lastquestionId = None for querySubjectiveAnswerBean in querySubjectiveAnswerBeanList: questionId = querySubjectiveAnswerBean["questionId"] main_number = querySubjectiveAnswerBean["mainNumber"] sub_number = querySubjectiveAnswerBean["order"] studentanswer = querySubjectiveAnswerBean["studentAnswer"] correctAnswer=querySubjectiveAnswerBean["correctAnswer"] questionScore=querySubjectiveAnswerBean["questionScore"] 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 #如果是客观题处理客观题作答 objectiveflag=False 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"] sub_ques_option=questionUnit["questionOptionList"] # if questionUnit["questionType"] == "FILL_UP" or questionUnit["questionType"] == "ESSAY": if current_subjective_number == question_unit_number: if questionUnit["questionType"] == "TRUE_OR_FALSE": print(studentanswer, correctAnswer) objectiveflag = True studentanswer_new = "%s %d分" % ( "正确" if studentanswer == "true" else "错误", questionScore if studentanswer == correctAnswer else 0) correctAnswer_new = "正确" if correctAnswer == "true" else "错误" if questionUnit["questionType"] == "MULTIPLE_CHOICE": print(studentanswer, correctAnswer) objectiveflag = True studentanswer_new = "%s %d分" % ( convertAnswer(studentanswer), questionScore if studentanswer == correctAnswer else 0) correctAnswer_new = convertAnswer(correctAnswer) if questionUnit["questionType"] == "SINGLE_CHOICE": print(studentanswer, correctAnswer) objectiveflag = True print(questionUnit["questionType"]) studentanswer_new = "%s %d分" % ( convertAnswer(studentanswer), questionScore if studentanswer == correctAnswer else 0) correctAnswer_new = convertAnswer(correctAnswer) 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 if sub_ques_option: sub_ques_option_lst = [] option_order=0 for sub_ques_option_detail in sub_ques_option: sub_ques_option_lst.append(htmlhandler.splitQuestionBody("
"+chr(65 + option_order)+"."+"
"+sub_ques_option_detail["body"])) option_order=option_order+1 questionBean["body"]["sections"]=questionBean["body"]["sections"]+sub_ques_option_lst if objectiveflag==False: questionBean["studentAnswer"]["sections"] =htmlhandler.splitQuesitonStudentAnswer(examRecordid,studentanswer, questionUnit["answerType"], questionUnit["questionType"]) questionBean["answer"]["sections"] = htmlhandler.splitQuesitonAnswer(questionUnit["rightAnswer"][0]) else: questionBean["studentAnswer"]["sections"]=[{"blocks":[{ "type": "text", "value": studentanswer_new, "playTime": None, "param": None}]}] questionBean["answer"]["sections"]=[{"blocks":[{ "type": "text", "value": correctAnswer_new, "playTime": None, "param": None}]}] questionBeanList.append(questionBean) current_subjective_number = current_subjective_number + 1 return questionBeanList def convertAnswer(data): studentAnswer="" start=65 if data: for i in data: studentAnswer=studentAnswer+","+chr(start+int(i)) return studentAnswer[1:] else: return "" 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+"-"+groupCode) questionbean.append(courseName) questionbean.append(questionGroup["groupName"]) 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()