¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <div class="merge-questionnaire-container"> |
| | | <div class="merge-header"> |
| | | <h3>åå¹¶ç¼è¾é®å· (å
± {{ services.length }} 个æªå®ææå¡)</h3> |
| | | <el-tag |
| | | v-for="service in services" |
| | | :key="service.id" |
| | | type="info" |
| | | style="margin-right: 10px" |
| | | > |
| | | {{ service.taskName }} ({{ service.sendname }}) |
| | | </el-tag> |
| | | </div> |
| | | |
| | | <div class="merge-content"> |
| | | <div class="question-list"> |
| | | <div |
| | | v-for="(question, index) in mergedQuestions" |
| | | :key="question.uniqueKey" |
| | | class="question-item" |
| | | > |
| | | <!-- é¢ç®å±ç¤º - ä¸ç¶ç»ä»¶ä¿æä¸è´ --> |
| | | <div |
| | | :class=" |
| | | question.isabnormal ? 'scriptTopic-isabnormal' : 'scriptTopic-dev' |
| | | " |
| | | > |
| | | <div class="dev-text"> |
| | | {{ index + 1 }}ã[{{ |
| | | getQuestionType(question.scriptType) |
| | | }}]<span> {{ question.scriptContent }}</span> |
| | | </div> |
| | | |
| | | <!-- åé --> |
| | | <div class="dev-xx" v-if="question.scriptType == 1"> |
| | | <el-radio-group |
| | | v-model="question.mergedResult" |
| | | @change=" |
| | | handleOptionChange( |
| | | $event, |
| | | index, |
| | | question.svyLibTemplateTargetoptions, |
| | | question |
| | | ) |
| | | " |
| | | >11 |
| | | <el-radio |
| | | v-for="( |
| | | option, optIndex |
| | | ) in question.svyLibTemplateTargetoptions" |
| | | :key="optIndex" |
| | | :label="option.optioncontent" |
| | | :class="option.isabnormal ? 'red-star' : ''" |
| | | > |
| | | {{ option.optioncontent }} |
| | | </el-radio> |
| | | </el-radio-group> |
| | | </div> |
| | | |
| | | <!-- å¤é --> |
| | | <div class="dev-xx" v-if="question.scriptType == 2"> |
| | | <el-checkbox-group |
| | | v-model="question.mergedResult" |
| | | @change="updateScore($event, index, question.options, question)" |
| | | > |
| | | <el-checkbox |
| | | v-for="(option, optIndex) in question.options" |
| | | :key="optIndex" |
| | | :label="option.optioncontent" |
| | | :class="option.isabnormal ? 'red-star' : ''" |
| | | > |
| | | {{ option.optioncontent }} |
| | | </el-checkbox> |
| | | </el-checkbox-group> |
| | | </div> |
| | | |
| | | <!-- 填空 --> |
| | | <div class="dev-xx" v-if="question.scriptType == 4"> |
| | | <el-input |
| | | type="textarea" |
| | | :rows="2" |
| | | placeholder="请è¾å
¥çæ¡" |
| | | v-model="question.mergedResult" |
| | | clearable |
| | | /> |
| | | </div> |
| | | |
| | | <!-- éå è¾å
¥æ¡ --> |
| | | <div v-if="question.showAppendInput" class="append-input-container"> |
| | | <el-input |
| | | type="textarea" |
| | | :rows="2" |
| | | placeholder="请è¾å
¥å
·ä½ä¿¡æ¯" |
| | | v-model="question.answerps" |
| | | clearable |
| | | /> |
| | | </div> |
| | | |
| | | <!-- æç¤ºä¿¡æ¯ --> |
| | | <div v-show="question.prompt"> |
| | | <el-alert :title="question.prompt" type="warning" /> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | |
| | | <div class="merge-footer"> |
| | | <el-button @click="handleCancel">åæ¶</el-button> |
| | | <el-button type="primary" @click="handleSave" :loading="isSaving" |
| | | >ä¿åå°ææé®å·</el-button |
| | | > |
| | | </div> |
| | | </div> |
| | | </template> |
| | | |
| | | <script> |
| | | import { |
| | | getsearchrResults, |
| | | serviceSubtaskDetailedit, |
| | | serviceSubtaskDetailadd, |
| | | Editsingletaskson, |
| | | getTaskservelist, |
| | | alterpatient, |
| | | } from "@/api/AiCentre/index"; |
| | | |
| | | export default { |
| | | props: { |
| | | selectedServices: { |
| | | type: Array, |
| | | required: true, |
| | | }, |
| | | patid: { |
| | | type: [String, Number], |
| | | required: true, |
| | | }, |
| | | }, |
| | | data() { |
| | | return { |
| | | services: [], |
| | | mergedQuestions: [], // åå¹¶åçé®é¢æ°æ® |
| | | isSaving: false, |
| | | }; |
| | | }, |
| | | created() { |
| | | this.loadServicesData(); |
| | | }, |
| | | methods: { |
| | | getQuestionType(type) { |
| | | const types = { 1: "åé", 2: "å¤é", 4: "é®ç" }; |
| | | return types[type] || "æªç¥"; |
| | | }, |
| | | |
| | | async loadServicesData() { |
| | | this.services = this.selectedServices; |
| | | |
| | | const loading = this.$loading({ |
| | | lock: true, |
| | | text: "æ£å¨å è½½æªå®æé®å·æ°æ®...", |
| | | spinner: "el-icon-loading", |
| | | background: "rgba(0, 0, 0, 0.7)", |
| | | }); |
| | | |
| | | try { |
| | | // åªå è½½æªå®æçæå¡é®å·æ°æ® |
| | | const requests = this.services.map((service) => |
| | | getsearchrResults({ |
| | | taskid: service.taskid, |
| | | patid: this.patid, |
| | | subId: service.id, |
| | | isFinish: false, // ç¡®ä¿åªè·åæªå®æçé®å· |
| | | }) |
| | | ); |
| | | |
| | | const responses = await Promise.all(requests); |
| | | |
| | | // åå¹¶ææé®é¢ï¼å»é |
| | | const allQuestions = []; |
| | | const questionMap = {}; |
| | | |
| | | responses.forEach((response, index) => { |
| | | if (response.code == 200 && response.data.scriptResult) { |
| | | response.data.scriptResult.forEach((q) => { |
| | | const key = `${q.scriptContent}_${q.scriptType}`; |
| | | if (!questionMap[key]) { |
| | | questionMap[key] = { |
| | | ...q, |
| | | uniqueKey: key, |
| | | mergedResult: q.scriptType == 2 ? [] : null, |
| | | originalServices: [], // è®°å½åå§æå¡ID |
| | | }; |
| | | allQuestions.push(questionMap[key]); |
| | | } |
| | | questionMap[key].originalServices.push(this.services[index].id); |
| | | }); |
| | | } |
| | | }); |
| | | |
| | | // åå§ååå¹¶ç»æ |
| | | this.mergedQuestions = allQuestions.map((q) => ({ |
| | | ...q, |
| | | mergedResult: q.scriptType == 2 ? [] : q.scriptResult || null, |
| | | })); |
| | | console.log(this.mergedQuestions); |
| | | } catch (error) { |
| | | this.$message.error("å è½½é®å·æ°æ®å¤±è´¥: " + error.message); |
| | | } finally { |
| | | loading.close(); |
| | | } |
| | | }, |
| | | |
| | | // å¤çé项åå (ä¸ç¶ç»ä»¶ä¿æä¸è´) |
| | | handleOptionChange(selectedOption, questionIndex, options, question) { |
| | | const selectedOptionObj = options.find( |
| | | (item) => item.optioncontent == selectedOption |
| | | ); |
| | | |
| | | // 设置å¼å¸¸ç¶æ |
| | | question.isabnormal = !!selectedOptionObj?.isabnormal; |
| | | |
| | | // å¤çéå è¾å
¥æ¡æ¾ç¤º |
| | | question.showAppendInput = selectedOptionObj?.appendflag == 1; |
| | | if (!question.showAppendInput) { |
| | | question.answerps = ""; |
| | | } |
| | | |
| | | this.$forceUpdate(); |
| | | }, |
| | | |
| | | // æ´æ°å¤éåæ° (ä¸ç¶ç»ä»¶ä¿æä¸è´) |
| | | updateScore(selectedValues, questionIndex, options, question) { |
| | | const abnormalOptions = options.filter((opt) => opt.isabnormal); |
| | | question.isabnormal = abnormalOptions.some((opt) => |
| | | selectedValues.includes(opt.optioncontent) |
| | | ); |
| | | this.$forceUpdate(); |
| | | }, |
| | | |
| | | handleCancel() { |
| | | this.$emit("cancel"); |
| | | }, |
| | | |
| | | async handleSave() { |
| | | this.isSaving = true; |
| | | |
| | | try { |
| | | const saveResults = []; |
| | | const updateServicePromises = []; |
| | | |
| | | // 1. ä¿åææé®å·é®é¢ |
| | | for (const service of this.services) { |
| | | const serviceId = service.id; |
| | | const questionsToSave = this.mergedQuestions |
| | | .filter((q) => q.originalServices.includes(serviceId)) |
| | | .map((question) => ({ |
| | | scriptid: question.id, |
| | | scriptResultId: question.scriptResultId, |
| | | scriptType: question.scriptType, |
| | | questiontext: question.scriptContent, |
| | | asrtext: |
| | | question.scriptType == 2 |
| | | ? question.mergedResult.join("&") |
| | | : question.mergedResult, |
| | | answerps: question.answerps || null, |
| | | isabnormal: question.isabnormal || false, |
| | | })); |
| | | |
| | | // ä¿åé®é¢æ°æ® |
| | | for (const question of questionsToSave) { |
| | | const saveData = { |
| | | taskid: service.taskid, |
| | | patid: this.patid, |
| | | subId: serviceId, |
| | | ...question, |
| | | }; |
| | | |
| | | if (saveData.isabnormal) { |
| | | saveData.excep = 1; |
| | | } |
| | | |
| | | try { |
| | | const response = question.scriptResultId |
| | | ? await serviceSubtaskDetailedit(saveData) |
| | | : await serviceSubtaskDetailadd(saveData); |
| | | |
| | | saveResults.push({ |
| | | serviceId, |
| | | success: response.code === 200, |
| | | message: |
| | | response.message || |
| | | (response.code === 200 ? "ä¿åæå" : "ä¿å失败"), |
| | | }); |
| | | } catch (error) { |
| | | saveResults.push({ |
| | | serviceId, |
| | | success: false, |
| | | message: error.message || "ä¿å失败", |
| | | }); |
| | | } |
| | | } |
| | | |
| | | // 2. æ´æ°æå¡ç¶æä¸ºå·²å®æ (sendstate = 6) |
| | | updateServicePromises.push(this.updateServiceStatus(serviceId)); |
| | | } |
| | | |
| | | // çå¾
æææå¡ç¶ææ´æ°å®æ |
| | | const updateResults = await Promise.all(updateServicePromises); |
| | | updateResults.forEach((result) => { |
| | | if (!result.success) { |
| | | saveResults.push({ |
| | | serviceId: result.serviceId, |
| | | success: false, |
| | | message: result.message || "æå¡ç¶ææ´æ°å¤±è´¥", |
| | | }); |
| | | } |
| | | }); |
| | | |
| | | // ç»è®¡ç»æ |
| | | const successCount = saveResults.filter((r) => r.success).length; |
| | | const totalCount = saveResults.length; |
| | | |
| | | // éç¥ç¶ç»ä»¶ |
| | | this.$emit("save", { |
| | | successCount, |
| | | totalCount, |
| | | results: saveResults, |
| | | }); |
| | | |
| | | if (successCount === totalCount) { |
| | | this.$message.success("ææé®å·åæå¡ç¶ææ´æ°æå"); |
| | | } else { |
| | | this.$message.warning( |
| | | `æåä¿å ${successCount} 项ï¼å¤±è´¥ ${totalCount - successCount} 项` |
| | | ); |
| | | } |
| | | } catch (error) { |
| | | this.$message.error("ä¿åè¿ç¨ä¸åçé误: " + error.message); |
| | | } finally { |
| | | this.isSaving = false; |
| | | } |
| | | }, |
| | | // æ°å¢æ¹æ³ï¼æ´æ°æå¡ç¶æ |
| | | async updateServiceStatus(serviceId) { |
| | | try { |
| | | // è·åæå¡å½åæ°æ® |
| | | const res = await getTaskservelist({ |
| | | patid: this.patid, |
| | | subId: serviceId, |
| | | }); |
| | | |
| | | if (res.code === 200) { |
| | | const serviceData = res.rows[0].serviceSubtaskList.find( |
| | | (item) => item.id === serviceId |
| | | ); |
| | | |
| | | if (serviceData) { |
| | | // æ´æ°æå¡ç¶æä¸ºå·²å®æ (sendstate = 6) |
| | | const updateRes = await Editsingletaskson({ |
| | | ...serviceData, |
| | | sendstate: 6, // è®¾ç½®ä¸ºå·²å®æç¶æ |
| | | remark: "éè¿åå¹¶ç¼è¾å®æ", // å¯éï¼æ·»å 夿³¨ |
| | | }); |
| | | |
| | | return { |
| | | serviceId, |
| | | success: updateRes.code === 200, |
| | | message: updateRes.message || "æå¡ç¶ææ´æ°æå", |
| | | }; |
| | | } |
| | | } |
| | | return { |
| | | serviceId, |
| | | success: false, |
| | | message: "è·åæå¡æ°æ®å¤±è´¥", |
| | | }; |
| | | } catch (error) { |
| | | return { |
| | | serviceId, |
| | | success: false, |
| | | message: error.message || "æ´æ°æå¡ç¶æå¤±è´¥", |
| | | }; |
| | | } |
| | | }, |
| | | }, |
| | | }; |
| | | </script> |
| | | |
| | | <style scoped> |
| | | .merge-questionnaire-container { |
| | | display: flex; |
| | | flex-direction: column; |
| | | height: 100%; |
| | | padding: 20px; |
| | | } |
| | | |
| | | .merge-header { |
| | | margin-bottom: 20px; |
| | | } |
| | | |
| | | .merge-content { |
| | | flex: 1; |
| | | overflow-y: auto; |
| | | } |
| | | |
| | | .question-list { |
| | | padding: 10px; |
| | | } |
| | | |
| | | /* ä¸ç¶ç»ä»¶ä¸è´çé¢ç®æ ·å¼ */ |
| | | .scriptTopic-dev { |
| | | margin-bottom: 20px; |
| | | padding: 15px; |
| | | border: 1px solid #ebeef5; |
| | | border-radius: 4px; |
| | | } |
| | | |
| | | .scriptTopic-isabnormal { |
| | | margin-bottom: 20px; |
| | | padding: 15px; |
| | | border: 1px solid #f56c6c; |
| | | border-radius: 4px; |
| | | background-color: #fff6f6; |
| | | } |
| | | |
| | | .dev-text { |
| | | font-size: 16px; |
| | | margin-bottom: 15px; |
| | | color: #333; |
| | | } |
| | | |
| | | .dev-xx { |
| | | margin-left: 20px; |
| | | } |
| | | |
| | | .append-input-container { |
| | | margin-top: 15px; |
| | | } |
| | | |
| | | .red-star { |
| | | color: #f56c6c; |
| | | } |
| | | |
| | | .merge-footer { |
| | | margin-top: 20px; |
| | | text-align: right; |
| | | padding-top: 15px; |
| | | border-top: 1px solid #ebeef5; |
| | | } |
| | | </style> |