123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237 |
- """
- 功能:导出包含客观题在内的所有题目作答
- 版本: 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("<p>"+chr(65 + option_order)+"."+"</p>"+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()
|