import MG from "@/assets/js/middleGround/WebMiddleGroundApi"; import { tokenKey } from "@/assets/js/config"; import getPublicImage from "@/assets/js/middleGround/tool"; // 获取题目列表 const getQuestionList = async ( page, questionList, activeBook, bookQuestionsList ) => { if (!bookQuestionsList || !Array.isArray(bookQuestionsList) || bookQuestionsList.length === 0) { console.warn("getQuestionList: 传入的 bookQuestionsList 为空或无效,将返回空列表。"); return []; } const token = localStorage.getItem(tokenKey); let collectList = []; if (token) collectList = await getCollectList(activeBook); const oldAnswerData = localStorage.getItem(activeBook.name + "oldAnswerData"); let oldData = null; let oldList = []; if (oldAnswerData) { oldData = JSON.parse(oldAnswerData); } if (oldData && oldData[page]) { oldList = oldData[page]; } let cardList = [ { catalogName: "单选题", infoList: [], }, { catalogName: "判断题", infoList: [], }, { catalogName: "多选题", infoList: [], }, { catalogName: "填空题", infoList: [], }, { catalogName: "简答题", infoList: [], }, { catalogName: "材料题", infoList: [], }, ]; let singleChoiceArr = []; // 单选 let judgeArr = []; // 判断 let shortArr = []; // 简答 let multipleChoiceArr = []; // 多选 let completionArr = []; // 填空 let materialArr = []; // 材料 // 11 for (let bindex = 0; bindex < questionList.length; bindex++) { const qitem = questionList[bindex]; let foundItems = bookQuestionsList.find((citem) => citem.id == qitem); if ( foundItems && foundItems.Embedded_QuestionBank_QuestionType == "material" ) { foundItems.childList = bookQuestionsList.filter( (ditem) => ditem.productLinkInfo[0].LinkPath == foundItems.productLinkPath ); } let foundlist = []; if(foundItems){ foundlist.push(foundItems); }else{ console.error("题目Id错误"+ qitem) return } if (foundlist.length > 0 && foundlist != undefined) { foundlist.forEach((item, index) => { const questionObj = handleQuestion(item, index + 1, oldList, collectList); if (item.Embedded_QuestionBank_QuestionType == "judge") { questionObj.type = "判断题"; judgeArr.push(questionObj); } else if (item.Embedded_QuestionBank_QuestionType == "singleChoice") { questionObj.type = "单选题"; singleChoiceArr.push(questionObj); } else if ( item.Embedded_QuestionBank_QuestionType == "multipleChoice" ) { questionObj.type = "多选题"; multipleChoiceArr.push(questionObj); } else if (item.Embedded_QuestionBank_QuestionType == "completion") { questionObj.type = "填空题"; completionArr.push(questionObj); } else if (item.Embedded_QuestionBank_QuestionType == "shortAnswer") { questionObj.type = "简答题"; shortArr.push(questionObj); } else if (item.Embedded_QuestionBank_QuestionType == "material") { questionObj.type = "材料题"; materialArr.push(questionObj); } }); } } // 22 cardList[0].infoList = singleChoiceArr; cardList[1].infoList = judgeArr; cardList[2].infoList = multipleChoiceArr; cardList[3].infoList = completionArr; cardList[4].infoList = shortArr; cardList[5].infoList = materialArr; for (let index = 0; index < cardList.length; index++) { const item = cardList[index]; for (let cindex = 0; cindex < item.infoList.length; cindex++) { const citem = item.infoList[cindex]; citem.number = cindex + 1; } } return cardList.filter((item) => item.infoList.length > 0); }; // 处理题目逻辑 const handleQuestion = (item, index, oldList, collectList) => { // 注意:这里的 qitem 应该是 item.id,我假设你原来的代码里 qitem 就是当前 item 的 id const qitem = item.id; let oldObj = {}; if (oldList) { oldObj = oldList.find((oldItem) => oldItem.id == qitem); } // 1. 构建 questionObj 的基础结构 const questionObj = { number: index + 1, // 题号 id: item.id, stem: item.Embedded_QuestionBank_QuestionType == "completion" ? JSON.parse(item.Embedded_QuestionBank_Stem) .stemTxt.replaceAll("", ",input,") .split(",") : JSON.parse(item.Embedded_QuestionBank_Stem), // 题干 answer: item.Embedded_QuestionBank_Answer, // 答案 option: item.Embedded_QuestionBank_Option ? JSON.parse(item.Embedded_QuestionBank_Option) : "", // 选择题选项 analysisCon: item.Embedded_QuestionBank_AnalysisCon, // 解析 questionType: item.Embedded_QuestionBank_QuestionType, // 题型 optionStyle: item.Embedded_QuestionBank_OptionStyle, // 选项显示类型 stemStyle: item.Embedded_QuestionBank_StemStyle, // 题干显示类型 difficulty: item.Embedded_QuestionBank_Difficulty ? 4 - item.Embedded_QuestionBank_Difficulty : 0, // 难度等级 userAnswer: oldObj ? oldObj.userAnswer : item.Embedded_QuestionBank_QuestionType == "completion" || item.Embedded_QuestionBank_QuestionType == "multipleChoice" ? [] : "", isSubmit: false, // 查看解析 isRight: oldObj ? oldObj.isRight :null, // 是否正确 isComplete: oldObj ? oldObj.isComplete : false, isCollect: collectList.indexOf(qitem) > -1 ? true : false, isUnfold: "", }; // 2. 处理多选和填空题的答案(JSON格式转换) if ( questionObj.questionType == "completion" || questionObj.questionType == "multipleChoice" ) { try { questionObj.answer = JSON.parse(questionObj.answer); } catch (error) { console.error("解析答案失败:", error, item); questionObj.answer = item.Embedded_QuestionBank_Answer; // 解析失败则保留原样 } } // 3. 填空题改造 if (questionObj.questionType == "completion") { let inputIndex = 0; // 使用更具描述性的变量名 for (let i = 0; i < questionObj.stem.length; i++) { const stemPart = questionObj.stem[i]; // 使用更具描述性的变量名 if (stemPart == "input") { questionObj.stem[i] = { num: inputIndex, data: "input", }; // 确保 userAnswer 是数组且长度足够 if (!Array.isArray(questionObj.userAnswer)) { questionObj.userAnswer = []; } questionObj.userAnswer[inputIndex] = ""; inputIndex++; } } } // 4. 材料题处理 (核心递归点) if (questionObj.questionType == "material" && Array.isArray(item.childList)) { // 遍历子题目列表,并对每一个子项递归调用 processQuestionItem questionObj.childList = item.childList.map((childItem, childIndex) => { return handleQuestion(childItem, childIndex + 1, oldList, collectList); }); } // 5. 获取图片 if ( questionObj.stemStyle == "Image" || questionObj.stemStyle == "TxtAndImage" ) { // 确保 stem 是一个对象且有 stemImage 属性 if (questionObj.stem && typeof questionObj.stem === 'object' && questionObj.stem.stemImage) { questionObj.stem.stemImage = getPublicImage( questionObj.stem.stemImage, 150 ); } } if ( questionObj.optionStyle == "Image" || questionObj.optionStyle == "TxtAndImage" ) { questionObj.option.forEach((optionItem) => { if (optionItem.img) optionItem.img = getPublicImage(optionItem.img, 150); }); } // 6. 题干富文本处理 if (questionObj.stemStyle == "RichText") { // 确保 stem 是一个对象且有 stemTxt 属性 if (questionObj.stem && typeof questionObj.stem === 'object' && questionObj.stem.stemTxt) { questionObj.stem.stemTxt = questionObj.stem.stemTxt .replace( /\ { // 使用更具描述性的变量名 if (optItem.txt) optItem.txt = optItem.txt .replace(/\ { const allCollect = [ { type: "bits", collectList: [], }, { type: "json", collectList: [], }, ]; const res = await MG.identity.getUserKey({ domain: "collectData", keys: [activeBook.bookId], }); try { const collect = JSON.parse(res[0].value); if (collect.length) { allCollect[0].collectList = collect.find( (citem) => citem.type == "bits" ).collectList; allCollect[1].collectList = collect.find( (citem) => citem.type == "json" ).collectList; } } catch (error) { console.log("暂无数据"); } return allCollect.find((item) => item.type == "bits").collectList; }; const getQuestionData = async (chapter, chapterData, activeBook) => { const data = { ...chapterData }; const oldAnswerData = localStorage.getItem("oldAnswerData"); const oldData = oldAnswerData ? JSON.parse(oldAnswerData) : {}; let oldChapterData; if (oldData) { oldChapterData = oldData[chapter]; } for (let key in chapterData) { let oldList = []; if (oldChapterData) { oldList = oldChapterData[key]; } data[key] = await getQuestionList(oldList, chapterData[key], activeBook); } return data; }; export default getQuestionList;