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 = []; foundlist.push(foundItems); 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); } }); } } // for (let qindex = 0; qindex < questionList.length; qindex++) { // const qitem = questionList[qindex]; // let query = { // storeInfo: activeBook.storeRefcode, // path: "*", // cmsPath: activeBook.rootCmsItemId, // cmsType: "*", // productId: activeBook.bookId, // queryType: "*", // itemIds: qitem + "", // itemFields: { // Embedded_QuestionBank_Stem: [], // Embedded_QuestionBank_AnalysisCon: [], // Embedded_QuestionBank_Answer: [], // Embedded_QuestionBank_Option: [], // Embedded_QuestionBank_QuestionType: [], // Embedded_QuestionBank_StemStyle: [], // Embedded_QuestionBank_OptionStyle: [], // Embedded_QuestionBank_KnowledgePoint: [], // Embedded_QuestionBank_Difficulty: [], // }, // }; // const res = await MG.store.getProductDetail(query); // console.log(res.datas.cmsDatas[0].datas, "材料题"); // if (!res.datas) return false; // res.datas.cmsDatas[0].datas.forEach((item, index) => { // let oldObj = {}; // if (oldList) { // oldObj = oldList.find((item) => item.id == qitem); // } // 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: null, // 是否正确 // isComplete: false, // isCollect: collectList.indexOf(qitem) > -1 ? true : false, // isUnfold: "", // }; // console.log(item, "材料题"); // // 多选和填空答案肯为数组,要转换JSON格式 // if ( // questionObj.questionType == "completion" || // questionObj.questionType == "multipleChoice" // ) { // try { // questionObj.answer = JSON.parse(questionObj.answer); // } catch (error) { // questionObj.answer = item.Embedded_QuestionBank_Answer; // } // } // // 填空题改造 // if (questionObj.questionType == "completion") { // let index = 0; // for (let i = 0; i < questionObj.stem.length; i++) { // const item = questionObj.stem[i]; // if (item == "input") { // questionObj.stem[i] = { // num: index, // data: "input", // }; // questionObj.userAnswer[index] = ""; // index++; // } // } // } // // 获取图片 // if ( // questionObj.stemStyle == "Image" || // questionObj.stemStyle == "TxtAndImage" // ) { // 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); // }); // } // // 题干富文本处理 // if (questionObj.stemStyle == "RichText") { // // questionObj.option.txt = '' // questionObj.stem.stemTxt = questionObj.stem.stemTxt // .replace( // /\ { // if (item.txt) // item.txt = item.txt // .replace(/\ 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: null, // 是否正确 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) => { // 子题目通常不需要 oldList 和 collectList,但为了逻辑统一,可以传入 // 如果子题目也需要独立的作答状态和收藏状态,则需要调整 oldList 和 collectList 的结构 // 这里假设它们不需要,或者由父级材料题统一管理 return handleQuestion(childItem, childIndex + 1, null, []); }); } // 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;