queryExamRecord_new.py 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  1. """
  2. 功能:导出包含客观题在内的所有题目作答
  3. 版本: v1.0
  4. 时间:2020/10/15
  5. """
  6. import cloudservice
  7. import config
  8. import os
  9. import json
  10. import logger
  11. import htmlhandler
  12. import csv
  13. import cloudinfservice
  14. questionlist=[]
  15. solvelist=[]
  16. examstudentlist=[]
  17. mediaimportlist=[]
  18. question_cookie={}
  19. output = config.outputpath + "/" + str(config.examId)
  20. if not os.path.exists(output):
  21. os.makedirs(output)
  22. savepath = output + "/" + "question.csv"
  23. student_savepath=output + "/" + "examstudent.csv"
  24. mediaimport_savepath=output + "/" + "mediaimport.csv"
  25. def main():
  26. result=cloudservice.queryExamMarkingInfo()
  27. if result:
  28. examRecordForMarkingBeanList = result['examRecordForMarkingBeanList']
  29. for examRecordForMarkingBean in examRecordForMarkingBeanList:
  30. handleRecordData(examRecordForMarkingBean["courseId"],1)
  31. with open(savepath, 'w', encoding='utf-8', newline='') as f:
  32. writer = csv.writer(f)
  33. writer.writerow(['科目代码','科目名称','大题名称','main_number','sub_number','分值'])
  34. for row in questionlist:
  35. writer.writerow(row)
  36. # with open(mediaimport_savepath, 'w', encoding='utf-8', newline='') as f:
  37. # writer = csv.writer(f)
  38. # writer.writerow(['准考证号', '卷型'])
  39. # for row in mediaimportlist:
  40. # writer.writerow(row)
  41. with open(student_savepath, 'w', encoding='utf-8', newline='') as f:
  42. writer = csv.writer(f)
  43. writer.writerow(["课程代码", "课程名称", "准考证号", "学号", "姓名"])
  44. for row in examstudentlist:
  45. writer.writerow(row)
  46. def handleRecordData(courseId,next):
  47. result=cloudservice.queryExamValidRecordData(courseId,next);
  48. if result:
  49. examRecordForMarkingBeanList=result["examRecordForMarkingBeanList"]
  50. if len(examRecordForMarkingBeanList) > 0:
  51. for examRecordForMarking in examRecordForMarkingBeanList:
  52. # 取试卷题目
  53. logger.info("examRecordId %s handle start" % (str(examRecordForMarking["examRecordDataId"])))
  54. course = cloudservice.getCourse(examRecordForMarking['courseId'])["courseList"][0]
  55. examstudent = cloudservice.queryExamStudent(examRecordForMarking["examStudentId"])
  56. # mediaimportlist.append(
  57. # [examRecordForMarking["examRecordDataId"], examRecordForMarking["paperType"]])
  58. examstudentlist.append([examstudent["courseCode"]+"-"+examRecordForMarking["paperType"], examstudent["courseName"],
  59. examRecordForMarking["examRecordDataId"], examstudent["identityNumber"],
  60. examstudent["studentName"]])
  61. output = config.outputpath + "/" + str(config.examId) + "/" + str(course["code"]) + "-" + \
  62. examRecordForMarking["paperType"]
  63. if not os.path.exists(output):
  64. os.makedirs(output)
  65. savepath = output + "/" + str(examRecordForMarking["examRecordDataId"]) + ".json"
  66. if course["code"] in solvelist:
  67. logger.info("已包含%s"%(course["code"]))
  68. else:
  69. logger.info("开始处理" + str(course["code"]))
  70. solvelist.append(course["code"])
  71. handlePaperStruct(course["code"],examRecordForMarking["paperType"],examRecordForMarking["basePaperId"],course["name"])
  72. if os.path.exists(savepath):
  73. logger.info("已有%s记录不再次进行处理" % str(examRecordForMarking["examRecordDataId"]))
  74. continue
  75. questiondetail=cloudinfservice.queryStudentAnswer(examRecordForMarking["examRecordDataId"])
  76. questionbeanlist=handleStudentPaperDetail(examRecordForMarking["examRecordDataId"],questiondetail,course["code"],examRecordForMarking["paperType"])
  77. #取每个人试卷的内容
  78. #subjectdetail = cloudservice.querySubjectInfo(examRecordForMarking["examRecordDataId"])
  79. #questionbeanlist=handleStudentPaperDetail(examRecordForMarking["examRecordDataId"],subjectdetail,examRecordForMarking["paperType"], course["code"])
  80. # 存储到本地
  81. with open(savepath, "w", encoding="utf-8") as file:
  82. json_str = json.dumps(questionbeanlist, indent=4, ensure_ascii=False)
  83. file.write(json_str)
  84. logger.info("examRecordId %s handle end" % (str(examRecordForMarking["examRecordDataId"])))
  85. next = result["next"]
  86. handleRecordData(examRecordForMarking['courseId'], next)
  87. def handleStudentPaperDetail(examRecordid,subjectdetail,courseCode,paperType):
  88. questionBeanList = []
  89. querySubjectiveAnswerBeanList = subjectdetail["examQuestionEntities"]
  90. question_unit_number = 1
  91. lastquestionId = None
  92. for querySubjectiveAnswerBean in querySubjectiveAnswerBeanList:
  93. questionId = querySubjectiveAnswerBean["questionId"]
  94. main_number = querySubjectiveAnswerBean["mainNumber"]
  95. sub_number = querySubjectiveAnswerBean["order"]
  96. studentanswer = querySubjectiveAnswerBean["studentAnswer"]
  97. correctAnswer=querySubjectiveAnswerBean["correctAnswer"]
  98. questionScore=querySubjectiveAnswerBean["questionScore"]
  99. mainbodyblocklist = None
  100. if lastquestionId == questionId:
  101. question_unit_number = question_unit_number + 1 # 下一道主观题
  102. else:
  103. lastquestionId = questionId
  104. question_unit_number = 1
  105. if questionId in question_cookie:
  106. questiondata=question_cookie[questionId]
  107. else:
  108. questiondata = cloudservice.getQuestion(questionId, courseCode, paperType)
  109. question_cookie[questionId]=questiondata
  110. #如果是客观题处理客观题作答
  111. objectiveflag=False
  112. if questiondata["defaultQuestion"]["masterVersion"]["body"]:
  113. # 套题处理
  114. mainquestionbody = questiondata["defaultQuestion"]["masterVersion"]["body"]
  115. mainbodyblocklist = htmlhandler.splitQuestionBody(mainquestionbody)
  116. questionUnitList = questiondata["defaultQuestion"]["masterVersion"]["questionUnitList"]
  117. current_subjective_number = 1
  118. for questionUnit in questionUnitList:
  119. sub_ques_body = questionUnit["body"]
  120. sub_ques_option=questionUnit["questionOptionList"]
  121. # if questionUnit["questionType"] == "FILL_UP" or questionUnit["questionType"] == "ESSAY":
  122. if current_subjective_number == question_unit_number:
  123. if questionUnit["questionType"] == "TRUE_OR_FALSE":
  124. print(studentanswer, correctAnswer)
  125. objectiveflag = True
  126. studentanswer_new = "%s %d分" % (
  127. "正确" if studentanswer == "true" else "错误",
  128. questionScore if studentanswer == correctAnswer else 0)
  129. correctAnswer_new = "正确" if correctAnswer == "true" else "错误"
  130. if questionUnit["questionType"] == "MULTIPLE_CHOICE":
  131. print(studentanswer, correctAnswer)
  132. objectiveflag = True
  133. studentanswer_new = "%s %d分" % (
  134. convertAnswer(studentanswer), questionScore if studentanswer == correctAnswer else 0)
  135. correctAnswer_new = convertAnswer(correctAnswer)
  136. if questionUnit["questionType"] == "SINGLE_CHOICE":
  137. print(studentanswer, correctAnswer)
  138. objectiveflag = True
  139. print(questionUnit["questionType"])
  140. studentanswer_new = "%s %d分" % (
  141. convertAnswer(studentanswer), questionScore if studentanswer == correctAnswer else 0)
  142. correctAnswer_new = convertAnswer(correctAnswer)
  143. questionBean = {
  144. "mainNumber": main_number,
  145. "subNumber": sub_number,
  146. "studentAnswer": {
  147. "sections": []
  148. },
  149. "answer": {
  150. "sections": []
  151. },
  152. "body": {
  153. "sections": []
  154. }
  155. }
  156. quesbodyblocklist = htmlhandler.splitQuestionBody(sub_ques_body)
  157. if mainbodyblocklist:
  158. questionBean["body"]["sections"] = mainbodyblocklist + quesbodyblocklist
  159. else:
  160. questionBean["body"]["sections"] = quesbodyblocklist
  161. if sub_ques_option:
  162. sub_ques_option_lst = []
  163. option_order=0
  164. for sub_ques_option_detail in sub_ques_option:
  165. sub_ques_option_lst.append(htmlhandler.splitQuestionBody("<p>"+chr(65 + option_order)+"."+"</p>"+sub_ques_option_detail["body"]))
  166. option_order=option_order+1
  167. questionBean["body"]["sections"]=questionBean["body"]["sections"]+sub_ques_option_lst
  168. if objectiveflag==False:
  169. questionBean["studentAnswer"]["sections"] =htmlhandler.splitQuesitonStudentAnswer(examRecordid,studentanswer,
  170. questionUnit["answerType"],
  171. questionUnit["questionType"])
  172. questionBean["answer"]["sections"] = htmlhandler.splitQuesitonAnswer(questionUnit["rightAnswer"][0])
  173. else:
  174. questionBean["studentAnswer"]["sections"]=[{"blocks":[{ "type": "text",
  175. "value": studentanswer_new,
  176. "playTime": None,
  177. "param": None}]}]
  178. questionBean["answer"]["sections"]=[{"blocks":[{ "type": "text",
  179. "value": correctAnswer_new,
  180. "playTime": None,
  181. "param": None}]}]
  182. questionBeanList.append(questionBean)
  183. current_subjective_number = current_subjective_number + 1
  184. return questionBeanList
  185. def convertAnswer(data):
  186. studentAnswer=""
  187. start=65
  188. if data:
  189. for i in data:
  190. studentAnswer=studentAnswer+","+chr(start+int(i))
  191. return studentAnswer[1:]
  192. else:
  193. return ""
  194. def handlePaperStruct(courseCode,groupCode,paperId,courseName):
  195. result=cloudservice.queryPaperStruct(courseCode,groupCode,paperId,courseName)
  196. if result:
  197. questionGroupList = result["defaultPaper"]["questionGroupList"]
  198. main_number = 1
  199. order = 1
  200. for questionGroup in questionGroupList:
  201. questionWrapperList = questionGroup["questionWrapperList"]
  202. for questionWrapper in questionWrapperList:
  203. questionUnitWrapperList = questionWrapper["questionUnitWrapperList"]
  204. for questionUnitWrapper in questionUnitWrapperList:
  205. questionbean = []
  206. #if questionUnitWrapper["questionType"] == "ESSAY" or questionUnitWrapper["questionType"] == "FILL_UP":
  207. #取客观题作答结构
  208. questionbean.append(courseCode+"-"+groupCode)
  209. questionbean.append(courseName)
  210. questionbean.append(questionGroup["groupName"])
  211. questionbean.append(main_number)
  212. questionbean.append(order)
  213. questionScore = questionUnitWrapper["questionScore"]
  214. questionbean.append(questionScore)
  215. questionlist.append(questionbean)
  216. order = order + 1
  217. main_number = main_number + 1
  218. else:
  219. solvelist.remove(courseCode)
  220. if __name__=="__main__":
  221. main()