¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <div class="questionnaire" :class="'survey-type-' + surveyType"> |
| | | <!-- å è½½ç¶æ --> |
| | | <div v-if="loading" class="loading-state"> |
| | | <div class="loading-spinner"> |
| | | <i class="el-icon-loading"></i> |
| | | <p>é®å·å è½½ä¸...</p> |
| | | </div> |
| | | </div> |
| | | |
| | | <!-- æ æ°æ®ç¶æ --> |
| | | <div v-else-if="isEmptyData" class="empty-state"> |
| | | <div class="empty-content"> |
| | | <i class="el-icon-document" style="font-size: 64px; color: #909399"></i> |
| | | <h3>ææ é®å·æ°æ®</h3> |
| | | <p>å½å没æå¯ç¨çé®å·ï¼è¯·è系管çåæç¨åéè¯</p> |
| | | <el-button |
| | | type="primary" |
| | | @click="loadSurveyData" |
| | | icon="el-icon-refresh" |
| | | > |
| | | éæ°å è½½ |
| | | </el-button> |
| | | </div> |
| | | </div> |
| | | |
| | | <!-- éè¯¯ç¶æ --> |
| | | <div v-else-if="hasError" class="error-state"> |
| | | <div class="error-content"> |
| | | <i class="el-icon-warning" style="font-size: 64px; color: #f56c6c"></i> |
| | | <h3>æ°æ®å 载失败</h3> |
| | | <p>{{ errorMessage }}</p> |
| | | <el-button |
| | | type="primary" |
| | | @click="loadSurveyData" |
| | | icon="el-icon-refresh" |
| | | > |
| | | éæ°å°è¯ |
| | | </el-button> |
| | | </div> |
| | | </div> |
| | | <div class="CONTENT" v-if="!accomplish"> |
| | | <div class="preview-left"> |
| | | <div class="toptitle"> |
| | | <div class="title">{{ surveyTitle }}</div> |
| | | <div style="font-size: 22px; margin-bottom: 20px; line-height: 1.5"> |
| | | {{ surveyDescription }} |
| | | </div> |
| | | </div> |
| | | <div v-if="showDeptSelect" class="dept-select-container"> |
| | | <el-form> |
| | | <el-form> |
| | | <el-form-item label="éæ©ç§å®¤"> |
| | | <el-select |
| | | v-model="selectedDept" |
| | | filterable |
| | | clearable |
| | | placeholder="è¯·éæ©ç§å®¤æè¾å
¥å
³é®è¯æç´¢" |
| | | @change="handleDeptChange" |
| | | popper-class="dept-select-dropdown" |
| | | > |
| | | <el-option |
| | | v-for="dept in filteredDeptList" |
| | | :key="dept.code" |
| | | :label="`${dept.name} (${dept.code})`" |
| | | :value="dept.name" |
| | | > |
| | | <span>{{ dept.name }}</span> |
| | | </el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-form> |
| | | </el-form> |
| | | </div> |
| | | <el-divider></el-divider> |
| | | |
| | | <!-- åéé¢ --> |
| | | <div |
| | | class="topic-dev" |
| | | v-for="(item, index) in questionList" |
| | | :key="item.scriptId" |
| | | > |
| | | <div class="scriptTopic-dev" :key="index" v-if="item.scriptType == 1"> |
| | | <div class="dev-text"> |
| | | {{ index + 1 }}ã<span style="line-height: 1.5" |
| | | >{{ item.scriptContent }} |
| | | <span style="color: #3ba2f7">[åé]</span></span |
| | | > |
| | | </div> |
| | | <div class="dev-xx"> |
| | | <el-radio-group |
| | | class="custom-radio" |
| | | v-model="item.scriptResult" |
| | | @change="handleOptionChange($event, index, item)" |
| | | > |
| | | <el-radio |
| | | border |
| | | v-for="(option, optIndex) in item.svyLibTemplateTargetoptions" |
| | | :class=" |
| | | option.isabnormal && |
| | | item.scriptResult == option.optioncontent |
| | | ? 'red-star' |
| | | : '' |
| | | " |
| | | :key="optIndex" |
| | | :label="option.optioncontent" |
| | | >{{ option.optioncontent }}</el-radio |
| | | > |
| | | </el-radio-group> |
| | | </div> |
| | | <div v-show="item.prompt"> |
| | | <el-alert :title="item.prompt" type="warning"> </el-alert> |
| | | </div> |
| | | </div> |
| | | |
| | | <!-- å¤éé¢ --> |
| | | <div class="scriptTopic-dev" :key="index" v-if="item.scriptType == 2"> |
| | | <div class="dev-text"> |
| | | {{ index + 1 }}ã<span style="line-height: 1.5" |
| | | >{{ item.scriptContent }} |
| | | <span style="color: #3ba2f7">[å¤é]</span></span |
| | | > |
| | | </div> |
| | | <div class="dev-xx"> |
| | | <el-checkbox-group |
| | | class="custom-radio" |
| | | v-model="item.scriptResult" |
| | | > |
| | | <el-checkbox |
| | | border |
| | | @change="$forceUpdate()" |
| | | v-for="(option, optIndex) in item.svyLibTemplateTargetoptions" |
| | | :key="optIndex" |
| | | :label="option.optioncontent" |
| | | > |
| | | {{ option.optioncontent }} |
| | | </el-checkbox> |
| | | </el-checkbox-group> |
| | | </div> |
| | | <div v-show="item.prompt && item.scriptResult[0]"> |
| | | <el-alert :title="item.prompt" type="warning"> </el-alert> |
| | | </div> |
| | | </div> |
| | | |
| | | <!-- å¡«ç©ºé¢ --> |
| | | <div class="scriptTopic-dev" :key="index" v-if="item.scriptType == 4"> |
| | | <div class="dev-text"> |
| | | {{ index + 1 }}ã<span style="line-height: 1.5" |
| | | >{{ item.scriptContent |
| | | }}<span style="color: #3ba2f7">[é®ç]</span></span |
| | | > |
| | | </div> |
| | | <div class="dev-xx"> |
| | | <el-input |
| | | type="textarea" |
| | | :rows="3" |
| | | placeholder="请è¾å
¥" |
| | | v-model="item.scriptResult" |
| | | clearable |
| | | > |
| | | </el-input> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | |
| | | <div class="bottom-fixed"> |
| | | <el-button |
| | | type="primary" |
| | | style="width: 80%; font-size: 20px" |
| | | @click="submitSurvey" |
| | | >æäº¤é®å·</el-button |
| | | > |
| | | </div> |
| | | </div> |
| | | </div> |
| | | |
| | | <div class="CONTENT" v-else> |
| | | <div class="preview-lefts"> |
| | | <div class="completion-message"> |
| | | <div class="thank-you">{{ this.accomplish || "æè°¢æ¨çé
å!" }}</div> |
| | | <div class="feedback-message">{{ completionMessage }}</div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </template> |
| | | |
| | | <script> |
| | | import { |
| | | getScriptByCondition, |
| | | saveMYDQuestionAnswer, |
| | | WLgetDept, |
| | | } from "@/api/AiCentre/index"; |
| | | |
| | | export default { |
| | | data() { |
| | | return { |
| | | surveyType: null, // 'outpatient', 'inpatient' |
| | | surveyTitle: "", |
| | | surveyDescription: "", |
| | | questionList: [], |
| | | deptList: [], |
| | | completionMessage: "", |
| | | accomplish: false, |
| | | showDeptSelect: false, |
| | | selectedDept: null, |
| | | deptSearchText: "", // ä¿çç¨äºæ¬å°è¿æ»¤ |
| | | deptList: [], |
| | | filteredDeptList: [], |
| | | |
| | | // å å¯åçåæ° |
| | | encryptedParams: { |
| | | param1: "", |
| | | param2: "", |
| | | param3: "", |
| | | param4: "", |
| | | param5: "", |
| | | param6: "30001002", |
| | | }, |
| | | isEmptyData: false, // æ°å¢ï¼æ æ°æ®ç¶æ |
| | | hasError: false, // æ°å¢ï¼éè¯¯ç¶æ |
| | | loading: false, // æ°å¢ï¼å è½½ç¶æ |
| | | errorMessage: "", // æ°å¢ï¼éè¯¯ä¿¡æ¯ |
| | | // æµè¯æ°æ® |
| | | testData: { |
| | | 1: { |
| | | title: "é¨è¯æ»¡æåº¦è°æ¥", |
| | | description: |
| | | "亲ç±çæ£è
ï¼æè°¢æ¨éæ©æä»¬çå»çæå¡ã为äºä¸ææåæå¡è´¨éï¼è¯·æ¨è±å åéæ¶é´å¡«åæ¤é®å·ã", |
| | | questions: [ |
| | | { |
| | | scriptId: 1, |
| | | scriptType: 1, |
| | | scriptContent: "æ¨å¯¹é¨è¯å»ççè¯çæ°´å¹³æ¯å¦æ»¡æï¼", |
| | | scriptResult: null, |
| | | svyLibTemplateTargetoptions: [ |
| | | { optioncontent: "é常满æ", value: "5", isabnormal: false }, |
| | | { optioncontent: "满æ", value: "4", isabnormal: false }, |
| | | { optioncontent: "ä¸è¬", value: "3", isabnormal: true }, |
| | | { optioncontent: "䏿»¡æ", value: "2", isabnormal: true }, |
| | | { optioncontent: "é叏䏿»¡æ", value: "1", isabnormal: true }, |
| | | ], |
| | | }, |
| | | { |
| | | scriptId: 2, |
| | | scriptType: 1, |
| | | scriptContent: "æ¨å¯¹é¨è¯æ¤å£«çæå¡æåº¦æ¯å¦æ»¡æï¼", |
| | | scriptResult: null, |
| | | svyLibTemplateTargetoptions: [ |
| | | { optioncontent: "é常满æ", value: "5", isabnormal: false }, |
| | | { optioncontent: "满æ", value: "4", isabnormal: false }, |
| | | { optioncontent: "ä¸è¬", value: "3", isabnormal: true }, |
| | | { optioncontent: "䏿»¡æ", value: "2", isabnormal: true }, |
| | | { optioncontent: "é叏䏿»¡æ", value: "1", isabnormal: true }, |
| | | ], |
| | | }, |
| | | { |
| | | scriptId: 3, |
| | | scriptType: 2, |
| | | scriptContent: "æ¨è®¤ä¸ºé¨è¯åªäºæ¹é¢éè¦æ¹è¿ï¼ï¼å¯å¤éï¼", |
| | | scriptResult: [], |
| | | svyLibTemplateTargetoptions: [ |
| | | { |
| | | optioncontent: "æéçåæ¶é´", |
| | | value: "waiting_time", |
| | | isabnormal: false, |
| | | }, |
| | | { |
| | | optioncontent: "å»çæ²éæ¹å¼", |
| | | value: "communication", |
| | | isabnormal: false, |
| | | }, |
| | | { |
| | | optioncontent: "å°±è¯ç¯å¢", |
| | | value: "environment", |
| | | isabnormal: false, |
| | | }, |
| | | { |
| | | optioncontent: "å»ç设å¤", |
| | | value: "equipment", |
| | | isabnormal: false, |
| | | }, |
| | | { optioncontent: "å
¶ä»", value: "other", isabnormal: false }, |
| | | ], |
| | | }, |
| | | { |
| | | scriptId: 4, |
| | | scriptType: 4, |
| | | scriptContent: "æ¨å¯¹é¨è¯æå¡è¿æä»ä¹å
¶ä»å»ºè®®ï¼", |
| | | scriptResult: null, |
| | | }, |
| | | ], |
| | | completionMessage: |
| | | "æè°¢æ¨å®è´µçæè§ï¼æä»¬å°ä¸ææ¹è¿é¨è¯æå¡è´¨éï¼ä¸ºæ¨æä¾æ´å¥½çå»çæå¡ä½éªã", |
| | | }, |
| | | 2: { |
| | | title: "ä½é¢æ»¡æåº¦è°æ¥", |
| | | description: |
| | | "亲ç±çæ£è
åå®¶å±ï¼æè°¢æ¨éæ©å¨æé¢ä½é¢æ²»çãä¸ºäºæåä½é¢æå¡è´¨éï¼è¯·æ¨å¡«åæ¤é®å·ã", |
| | | questions: [ |
| | | { |
| | | scriptId: 1, |
| | | scriptType: 1, |
| | | scriptContent: "æ¨å¯¹ä½é¢æé´å»ççè¯çæ°´å¹³æ¯å¦æ»¡æï¼", |
| | | scriptResult: null, |
| | | svyLibTemplateTargetoptions: [ |
| | | { optioncontent: "é常满æ", value: "5", isabnormal: false }, |
| | | { optioncontent: "满æ", value: "4", isabnormal: false }, |
| | | { optioncontent: "ä¸è¬", value: "3", isabnormal: true }, |
| | | { optioncontent: "䏿»¡æ", value: "2", isabnormal: true }, |
| | | { optioncontent: "é叏䏿»¡æ", value: "1", isabnormal: true }, |
| | | ], |
| | | }, |
| | | { |
| | | scriptId: 2, |
| | | scriptType: 1, |
| | | scriptContent: "æ¨å¯¹ä½é¢æé´æ¤å£«çæ¤çæå¡æ¯å¦æ»¡æï¼", |
| | | scriptResult: null, |
| | | svyLibTemplateTargetoptions: [ |
| | | { optioncontent: "é常满æ", value: "5", isabnormal: false }, |
| | | { optioncontent: "满æ", value: "4", isabnormal: false }, |
| | | { optioncontent: "ä¸è¬", value: "3", isabnormal: true }, |
| | | { optioncontent: "䏿»¡æ", value: "2", isabnormal: true }, |
| | | { optioncontent: "é叏䏿»¡æ", value: "1", isabnormal: true }, |
| | | ], |
| | | }, |
| | | { |
| | | scriptId: 3, |
| | | scriptType: 1, |
| | | scriptContent: "æ¨å¯¹ä½é¢ç
æ¿çç¯å¢åå«çæ¯å¦æ»¡æï¼", |
| | | scriptResult: null, |
| | | svyLibTemplateTargetoptions: [ |
| | | { optioncontent: "é常满æ", value: "5", isabnormal: false }, |
| | | { optioncontent: "满æ", value: "4", isabnormal: false }, |
| | | { optioncontent: "ä¸è¬", value: "3", isabnormal: true }, |
| | | { optioncontent: "䏿»¡æ", value: "2", isabnormal: true }, |
| | | { optioncontent: "é叏䏿»¡æ", value: "1", isabnormal: true }, |
| | | ], |
| | | }, |
| | | { |
| | | scriptId: 4, |
| | | scriptType: 4, |
| | | scriptContent: "æ¨å¯¹ä½é¢æå¡è¿æä»ä¹å
¶ä»å»ºè®®ï¼", |
| | | scriptResult: null, |
| | | }, |
| | | ], |
| | | completionMessage: |
| | | "æè°¢æ¨å¯¹æä»¬å·¥ä½çæ¯æï¼æä»¬å°æ ¹æ®æ¨çåé¦æç»æ¹è¿ä½é¢æå¡è´¨éï¼ç¥æ¨æ©æ¥åº·å¤ï¼", |
| | | }, |
| | | }, |
| | | }; |
| | | }, |
| | | created() { |
| | | this.initSurveyData(); |
| | | }, |
| | | methods: { |
| | | // åå§åè°æ¥æ°æ® |
| | | initSurveyData() { |
| | | // ä»è·¯ç±åæ°è·åå å¯åçåæ° |
| | | this.encryptedParams.param1 = |
| | | this.$route.query.param1 || |
| | | "WOAq2QZd43E-qg-96SvuIFsn-sdRVxQNH4M82XhpXp_Ux4PFrPaqSFXcKaeA6oxEgNhPisA86LvU9kTAEz4xvQ=="; |
| | | this.encryptedParams.param2 = |
| | | this.$route.query.param2 || |
| | | "XWeBh42RLYlNsMcomgw9UXhUPySkRP5EneWSueSq8F84qwYznU9heXuSx4tUMUtDvRnuJ86moJivy-kWQX12Rg=="; |
| | | this.encryptedParams.param5 = this.$route.query.param3 || "2"; // 1=ä½é¢, 2=é¨è¯, 3=æè¯å»ºè®® |
| | | this.encryptedParams.param6 = this.$route.query.param4 || "30001002"; |
| | | |
| | | this.surveyType = parseInt(this.encryptedParams.param5) || 2; |
| | | |
| | | // å è½½é®å·æ°æ® |
| | | this.loadSurveyData(); |
| | | // è·åç§å®¤å表 |
| | | this.WLgetDept(); |
| | | }, |
| | | WLgetDept() { |
| | | // è°ç¨æ¥å£è·åç§å®¤æ°æ® |
| | | WLgetDept(this.encryptedParams.param6).then((res) => { |
| | | this.deptList = Object.entries(res.data).map(([code, name]) => ({ |
| | | code, |
| | | name, |
| | | })); |
| | | this.filteredDeptList = [...this.deptList]; |
| | | |
| | | if (this.surveyType === 3) { |
| | | this.showDeptSelect = true; |
| | | } |
| | | }); |
| | | }, |
| | | filterDeptList() { |
| | | if (!this.deptSearchText) { |
| | | this.filteredDeptList = [...this.deptList]; |
| | | return; |
| | | } |
| | | |
| | | const searchText = this.deptSearchText.toLowerCase(); |
| | | this.filteredDeptList = this.deptList.filter( |
| | | (dept) => |
| | | dept.name.toLowerCase().includes(searchText) || |
| | | dept.code.toLowerCase().includes(searchText) |
| | | ); |
| | | }, |
| | | // å è½½è°æ¥æ°æ® |
| | | loadSurveyData() { |
| | | this.loading = true; |
| | | this.isEmptyData = false; |
| | | this.hasError = false; |
| | | this.errorMessage = ""; |
| | | // è°ç¨æ¥å£è·åé®å·æ°æ® |
| | | // æ ¹æ®é®å·ç±»å设置ä¸åçåæ° |
| | | let encryptedParams = { |
| | | param1: this.encryptedParams.param1, |
| | | }; |
| | | |
| | | // æ ¹æ®surveyType设置ä¸åçåæ° |
| | | switch (this.surveyType) { |
| | | case 1: // ä½é¢ |
| | | encryptedParams.param2 = this.encryptedParams.param2; |
| | | break; |
| | | case 2: // é¨è¯ |
| | | encryptedParams.param3 = this.encryptedParams.param2; |
| | | break; |
| | | case 3: // æè¯å»ºè®® |
| | | encryptedParams.param4 = this.encryptedParams.param2; |
| | | break; |
| | | default: |
| | | encryptedParams.param3 = this.encryptedParams.param2; |
| | | } |
| | | getScriptByCondition(encryptedParams) |
| | | .then((res) => { |
| | | if (res.code === 200) { |
| | | if (res.data.result) { |
| | | this.accomplish = res.data.result; |
| | | return; |
| | | } |
| | | if ( |
| | | !res.data.svyLibTemplateScriptVOS || |
| | | res.data.svyLibTemplateScriptVOS.length === 0 |
| | | ) { |
| | | this.isEmptyData = true; |
| | | this.$message.warning("ææ é®å·æ°æ®"); |
| | | return; |
| | | } |
| | | // å¤çæ¥å£è¿åçæ°æ® |
| | | this.questionList = res.data.svyLibTemplateScriptVOS.map((item) => { |
| | | return { |
| | | ...item, |
| | | scriptResult: item.scriptType === 2 ? [] : null, |
| | | }; |
| | | }); |
| | | |
| | | // æ ¹æ®surveyType设置æ é¢åæè¿° |
| | | switch (this.surveyType) { |
| | | case 2: // é¨è¯ |
| | | this.surveyTitle = "é¨è¯æ»¡æåº¦è°æ¥"; |
| | | this.surveyDescription = |
| | | "亲ç±çæ£è
ï¼æè°¢æ¨éæ©æä»¬çå»çæå¡ã为äºä¸ææåæå¡è´¨éï¼è¯·æ¨è±å åéæ¶é´å¡«åæ¤é®å·ã"; |
| | | this.completionMessage = |
| | | "æè°¢æ¨å®è´µçæè§ï¼æä»¬å°ä¸ææ¹è¿é¨è¯æå¡è´¨éï¼ä¸ºæ¨æä¾æ´å¥½çå»çæå¡ä½éªã"; |
| | | break; |
| | | case 1: // ä½é¢ |
| | | this.surveyTitle = "ä½é¢æ»¡æåº¦è°æ¥"; |
| | | this.surveyDescription = |
| | | "亲ç±çæ£è
åå®¶å±ï¼æè°¢æ¨éæ©å¨æé¢ä½é¢æ²»çãä¸ºäºæåä½é¢æå¡è´¨éï¼è¯·æ¨å¡«åæ¤é®å·ã"; |
| | | this.completionMessage = |
| | | "æè°¢æ¨å¯¹æä»¬å·¥ä½çæ¯æï¼æä»¬å°æ ¹æ®æ¨çåé¦æç»æ¹è¿ä½é¢æå¡è´¨éï¼ç¥æ¨æ©æ¥åº·å¤ï¼"; |
| | | break; |
| | | case 3: // æè¯å»ºè®® |
| | | this.surveyTitle = "æè¯å»ºè®®åé¦"; |
| | | this.surveyDescription = |
| | | "å°æ¬ç客æ·ï¼æè°¢æ¨æ½åºå®è´µæ¶é´æä¾åé¦ãæ¨çæè§å¯¹æä»¬æ¹è¿æå¡é常éè¦ã"; |
| | | this.completionMessage = |
| | | "æè°¢æ¨çåé¦ï¼æä»¬å·²æ¶å°æ¨çæè¯/建议ï¼å°å°½å¿«å¤ç并䏿¨èç³»ã"; |
| | | break; |
| | | default: |
| | | this.useTestData(1); // é»è®¤ä½¿ç¨é¨è¯æ°æ® |
| | | } |
| | | } else { |
| | | // æ¥å£æ æ°æ®æå¤±è´¥ï¼ä½¿ç¨æµè¯æ°æ® |
| | | // this.useTestData(this.surveyType); |
| | | } |
| | | }) |
| | | .catch(() => { |
| | | console.error("æ°æ®è·å失败:", error); |
| | | this.hasError = true; |
| | | this.errorMessage = |
| | | error.message || "é®å·æ°æ®å 载失败ï¼è¯·æ£æ¥ç½ç»è¿æ¥åéè¯"; |
| | | this.$message.error("æ°æ®å 载失败"); |
| | | // æ¥å£è°ç¨å¤±è´¥ï¼ä½¿ç¨æµè¯æ°æ® |
| | | // this.useTestData(this.surveyType); |
| | | }) |
| | | .finally(() => { |
| | | this.loading = false; |
| | | }); |
| | | }, |
| | | handleDeptChange(value) { |
| | | this.selectedDept = value; |
| | | // å¯ä»¥å¨è¿éæ·»å å
¶ä»å¤çé»è¾ |
| | | }, |
| | | // ä½¿ç¨æµè¯æ°æ® |
| | | useTestData(surveyType) { |
| | | const type = [1, 2, 3].includes(surveyType) ? surveyType : 1; |
| | | const testData = this.testData[type]; |
| | | |
| | | this.surveyTitle = testData.title; |
| | | this.surveyDescription = testData.description; |
| | | this.questionList = testData.questions; |
| | | this.completionMessage = testData.completionMessage; |
| | | }, |
| | | |
| | | // æäº¤è°æ¥é®å·ï¼ç´æ¥æäº¤ï¼ä¸ç»è¿ç¼åï¼ |
| | | async submitSurvey() { |
| | | // éªè¯å¿
填项 |
| | | if (this.hasUnansweredRequiredQuestions()) { |
| | | this.$message.error("è¯·å®æææå¿
å¡«é®é¢ååæäº¤"); |
| | | return; |
| | | } |
| | | |
| | | try { |
| | | const submitData = this.prepareSubmitData(); |
| | | const res = await saveMYDQuestionAnswer(submitData); |
| | | |
| | | if (res.code === 200) { |
| | | this.accomplish = "é®å·å·²æäº¤"; |
| | | this.$message.success("æäº¤æåï¼æè°¢æ¨çåé¦ã"); |
| | | } else { |
| | | this.$message.error(res.msg || "æäº¤å¤±è´¥ï¼è¯·ç¨ååè¯"); |
| | | } |
| | | } catch (error) { |
| | | this.$message.error("ç½ç»éè¯¯ï¼æäº¤å¤±è´¥"); |
| | | console.error("æäº¤å¤±è´¥:", error); |
| | | } |
| | | }, |
| | | |
| | | // æ£æ¥æ¯å¦ææªåççå¿
å¡«é®é¢ |
| | | hasUnansweredRequiredQuestions() { |
| | | return this.questionList.some((question) => { |
| | | return ( |
| | | question.required && |
| | | (question.scriptResult === null || |
| | | question.scriptResult === "" || |
| | | (Array.isArray(question.scriptResult) && |
| | | question.scriptResult.length === 0)) |
| | | ); |
| | | }); |
| | | }, |
| | | |
| | | // åå¤æäº¤æ°æ® |
| | | prepareSubmitData() { |
| | | // å建ç§å®¤éæ©é®é¢å¯¹è±¡ |
| | | const deptQuestion = { |
| | | scriptId: "dept_selection", // èªå®ä¹ID |
| | | scriptType: 4, // 4表示é®çç±»å |
| | | scriptContent: "éæ©çç§å®¤", |
| | | scriptResult: this.selectedDept || "", // åå¨éæ©çç§å®¤åç§° |
| | | required: false, // éå¿
å¡« |
| | | sort: 999, |
| | | nextScriptno: "1", |
| | | }; |
| | | |
| | | return { |
| | | taskId: this.encryptedParams.param1, |
| | | serialnum: this.encryptedParams.param2 || this.encryptedParams.param3, |
| | | mzzy: this.surveyType, |
| | | svyLibTemplateScriptVOS: [ |
| | | deptQuestion, // å°ç§å®¤éæ©ä½ä¸ºç¬¬ä¸ä¸ªé®é¢ |
| | | ...this.questionList.map((item) => { |
| | | return { |
| | | scriptId: item.scriptId, |
| | | scriptType: item.scriptType, |
| | | scriptResult: |
| | | item.scriptType === 2 |
| | | ? (item.scriptResult || []).join("&") |
| | | : item.scriptResult || "", |
| | | nextScriptno: item.nextScriptno, |
| | | score: item.score, |
| | | prompt: item.prompt, |
| | | ...item, |
| | | }; |
| | | }), |
| | | ], |
| | | excep: this.checkAbnormalOptions() ? 1 : 0, |
| | | }; |
| | | }, |
| | | |
| | | // æ£æ¥å¼å¸¸é项 |
| | | checkAbnormalOptions() { |
| | | return this.questionList.some((question) => { |
| | | if (!question.scriptResult) return false; |
| | | |
| | | if (question.scriptType === 1) { |
| | | // åéé¢å¼å¸¸æ£æ¥ |
| | | const selectedOption = question.svyLibTemplateTargetoptions.find( |
| | | (opt) => opt.optioncontent === question.scriptResult |
| | | ); |
| | | return selectedOption?.isabnormal; |
| | | } else if (question.scriptType === 2) { |
| | | // å¤éé¢å¼å¸¸æ£æ¥ |
| | | return question.scriptResult.some((answer) => { |
| | | const option = question.svyLibTemplateTargetoptions.find( |
| | | (opt) => opt.optioncontent === answer |
| | | ); |
| | | return option?.isabnormal; |
| | | }); |
| | | } |
| | | return false; |
| | | }); |
| | | }, |
| | | |
| | | // å¤çåéé项åå |
| | | handleOptionChange(selectedValue, index, question) { |
| | | const selectedOption = question.svyLibTemplateTargetoptions.find( |
| | | (option) => option.optioncontent === selectedValue |
| | | ); |
| | | |
| | | if (selectedOption) { |
| | | this.questionList[index].nextScriptno = selectedOption.nextQuestion; |
| | | this.questionList[index].score = selectedOption.score; |
| | | this.questionList[index].prompt = selectedOption.prompt; |
| | | } |
| | | }, |
| | | }, |
| | | }; |
| | | </script> |
| | | |
| | | <style lang="scss" scoped> |
| | | /* åºç¡æ ·å¼åé */ |
| | | :root { |
| | | --primary-color: #1a73e8; /* é»è®¤èè² */ |
| | | --secondary-color: #34d399; /* é»è®¤ç»¿è² */ |
| | | --alert-color: #ed8936; /* é»è®¤æ©è² */ |
| | | } |
| | | |
| | | /* é¨è¯æ ·å¼åé */ |
| | | .survey-type-1 { |
| | | --primary-color: #1a73e8; /* å»çè */ |
| | | --secondary-color: #34d399; /* å¥åº·ç»¿ */ |
| | | --alert-color: #ed8936; /* è¦ç¤ºæ© */ |
| | | } |
| | | |
| | | /* ä½é¢æ ·å¼åé */ |
| | | .survey-type-2 { |
| | | --primary-color: #5a67d8; /* æ·±èç´« */ |
| | | --secondary-color: #667eea; /* æµ
èç´« */ |
| | | --alert-color: #f56565; /* è¦ç¤ºçº¢ */ |
| | | } |
| | | |
| | | /* æè¯å»ºè®®æ ·å¼åé */ |
| | | .survey-type-3 { |
| | | --primary-color: #e53e3e; /* ç´§æ¥çº¢ */ |
| | | --secondary-color: #f6ad55; /* è¦ç¤ºé» */ |
| | | --alert-color: #f56565; /* è¦ç¤ºçº¢ */ |
| | | } |
| | | |
| | | .questionnaire { |
| | | font-family: "PingFang SC", "Helvetica Neue", Arial, sans-serif; |
| | | min-height: 100vh; |
| | | margin: 0; |
| | | padding: 0; |
| | | color: #333; |
| | | transition: all 0.3s ease; |
| | | |
| | | /* æ ¹æ®surveyTypeåºç¨ä¸åçä¸»é¢ */ |
| | | &.survey-type-1 { |
| | | background-color: #f5f9fc; |
| | | --theme-gradient: linear-gradient(135deg, #1a73e8, #34d399); |
| | | } |
| | | |
| | | &.survey-type-2 { |
| | | background-color: #f8f9ff; |
| | | --theme-gradient: linear-gradient(135deg, #5a67d8, #667eea); |
| | | } |
| | | |
| | | &.survey-type-3 { |
| | | background-color: #fff5f5; |
| | | --theme-gradient: linear-gradient(135deg, #e53e3e, #f6ad55); |
| | | } |
| | | } |
| | | .dept-select-container { |
| | | margin: 20px 0; |
| | | padding: 20px; |
| | | background-color: #f8fafc; |
| | | border-radius: 8px; |
| | | border: 1px solid #e2e8f0; |
| | | } |
| | | |
| | | /* è°æ´ä¸æéé¡¹æ ·å¼ */ |
| | | .el-select-dropdown__item { |
| | | display: flex; |
| | | justify-content: space-between; |
| | | } |
| | | /* ä¸ææ¡æ ·å¼è°æ´ */ |
| | | ::v-deep .dept-select-dropdown { |
| | | max-height: 400px; /* é嶿大é«åº¦ */ |
| | | overflow-y: auto; /* æ·»å æ»å¨æ¡ */ |
| | | |
| | | .el-select-dropdown__item { |
| | | display: flex; |
| | | justify-content: space-between; |
| | | padding: 0 20px; |
| | | height: auto; |
| | | line-height: 36px; |
| | | |
| | | span { |
| | | display: inline-block; |
| | | overflow: hidden; |
| | | text-overflow: ellipsis; |
| | | white-space: nowrap; |
| | | } |
| | | |
| | | /* åç§°é¨å */ |
| | | span:first-child { |
| | | width: 60%; |
| | | text-align: left; |
| | | } |
| | | |
| | | /* ç¼ç é¨å */ |
| | | span:last-child { |
| | | width: 40%; |
| | | text-align: right; |
| | | } |
| | | } |
| | | } |
| | | |
| | | /* ç§»å¨ç«¯éé
*/ |
| | | @media (max-width: 768px) { |
| | | ::v-deep .dept-select-dropdown { |
| | | max-width: 100vw; /* éå¶æå¤§å®½åº¦ä¸ºè§å£å®½åº¦ */ |
| | | width: auto !important; |
| | | left: 10px !important; |
| | | right: 10px !important; |
| | | |
| | | .el-select-dropdown__item { |
| | | span:first-child { |
| | | width: 50%; |
| | | } |
| | | span:last-child { |
| | | width: 50%; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | .CONTENT { |
| | | max-width: 900px; |
| | | margin: 0 auto; |
| | | padding: 20px; |
| | | |
| | | .title { |
| | | color: var(--primary-color); |
| | | font-size: 28px; |
| | | font-weight: 600; |
| | | margin-bottom: 15px; |
| | | text-align: center; |
| | | letter-spacing: 0.5px; |
| | | position: relative; |
| | | |
| | | &::after { |
| | | content: ""; |
| | | position: absolute; |
| | | bottom: -8px; |
| | | left: 50%; |
| | | transform: translateX(-50%); |
| | | width: 60px; |
| | | height: 3px; |
| | | background: var(--theme-gradient); |
| | | border-radius: 3px; |
| | | } |
| | | } |
| | | } |
| | | |
| | | .preview-left { |
| | | margin: 20px 0; |
| | | margin-bottom: 100px; |
| | | background-color: #fff; |
| | | border-radius: 12px; |
| | | padding: 30px; |
| | | border: none; |
| | | box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08); |
| | | transition: all 0.3s ease; |
| | | |
| | | &:hover { |
| | | box-shadow: 0 6px 16px rgba(0, 0, 0, 0.1); |
| | | } |
| | | |
| | | .toptitle { |
| | | margin-bottom: 25px; |
| | | |
| | | div { |
| | | color: #4a5568; |
| | | font-size: 18px; |
| | | line-height: 1.6; |
| | | text-align: center; |
| | | } |
| | | } |
| | | |
| | | .el-divider { |
| | | background-color: #e2e8f0; |
| | | margin: 25px 0; |
| | | } |
| | | |
| | | .topic-dev { |
| | | margin-bottom: 30px; |
| | | font-size: 17px; |
| | | background-color: #f8fafc; |
| | | border-radius: 10px; |
| | | padding: 20px; |
| | | transition: all 0.3s ease; |
| | | position: relative; |
| | | overflow: hidden; |
| | | |
| | | &:hover { |
| | | background-color: #f1f5f9; |
| | | } |
| | | |
| | | /* æ·»å ç±»åæ è¯å°æ ç¾ */ |
| | | &::before { |
| | | content: ""; |
| | | position: absolute; |
| | | top: 0; |
| | | left: 0; |
| | | width: 4px; |
| | | height: 100%; |
| | | background: var(--primary-color); |
| | | } |
| | | |
| | | .dev-text { |
| | | margin-bottom: 18px; |
| | | font-weight: 500; |
| | | color: #2d3748; |
| | | font-size: 18px; |
| | | line-height: 1.6; |
| | | |
| | | span[style*="color: #3ba2f7"] { |
| | | font-size: 14px; |
| | | margin-left: 8px; |
| | | color: var(--primary-color) !important; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | .preview-lefts { |
| | | margin: 20px 0; |
| | | background-color: #fff; |
| | | border-radius: 12px; |
| | | padding: 40px; |
| | | min-height: 400px; |
| | | border: none; |
| | | box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08); |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: center; |
| | | text-align: center; |
| | | |
| | | .completion-message { |
| | | padding: 40px; |
| | | max-width: 600px; |
| | | |
| | | .thank-you { |
| | | font-size: 32px; |
| | | color: var(--primary-color); |
| | | font-weight: 600; |
| | | margin-bottom: 25px; |
| | | position: relative; |
| | | display: inline-block; |
| | | |
| | | &::after { |
| | | content: ""; |
| | | position: absolute; |
| | | bottom: -10px; |
| | | left: 50%; |
| | | transform: translateX(-50%); |
| | | width: 80px; |
| | | height: 3px; |
| | | background: var(--theme-gradient); |
| | | border-radius: 3px; |
| | | } |
| | | } |
| | | |
| | | .feedback-message { |
| | | font-size: 20px; |
| | | line-height: 1.7; |
| | | color: #4a5568; |
| | | margin: 0 auto; |
| | | } |
| | | } |
| | | } |
| | | |
| | | .red-star { |
| | | ::v-deep .el-radio__label, |
| | | ::v-deep .el-checkbox__label { |
| | | position: relative; |
| | | padding-right: 20px; |
| | | |
| | | &::after { |
| | | content: "*"; |
| | | color: #ef4444; |
| | | position: absolute; |
| | | right: 0; |
| | | top: 0; |
| | | font-size: 16px; |
| | | } |
| | | } |
| | | } |
| | | .loading-state { |
| | | display: flex; |
| | | justify-content: center; |
| | | align-items: center; |
| | | min-height: 60vh; |
| | | padding: 40px; |
| | | |
| | | .loading-spinner { |
| | | text-align: center; |
| | | |
| | | .el-icon-loading { |
| | | font-size: 48px; |
| | | color: var(--primary-color); |
| | | margin-bottom: 16px; |
| | | animation: rotating 2s linear infinite; |
| | | } |
| | | |
| | | p { |
| | | color: #666; |
| | | font-size: 16px; |
| | | } |
| | | } |
| | | } |
| | | |
| | | .empty-state, |
| | | .error-state { |
| | | display: flex; |
| | | justify-content: center; |
| | | align-items: center; |
| | | min-height: 60vh; |
| | | padding: 40px; |
| | | |
| | | .empty-content, |
| | | .error-content { |
| | | text-align: center; |
| | | max-width: 400px; |
| | | |
| | | h3 { |
| | | color: #666; |
| | | font-size: 20px; |
| | | margin: 16px 0 12px; |
| | | font-weight: 500; |
| | | } |
| | | |
| | | p { |
| | | color: #999; |
| | | font-size: 14px; |
| | | margin-bottom: 24px; |
| | | line-height: 1.6; |
| | | } |
| | | } |
| | | } |
| | | |
| | | .error-state { |
| | | .error-content { |
| | | h3 { |
| | | color: #f56c6c; |
| | | } |
| | | } |
| | | } |
| | | |
| | | @keyframes rotating { |
| | | from { |
| | | transform: rotate(0deg); |
| | | } |
| | | to { |
| | | transform: rotate(360deg); |
| | | } |
| | | } |
| | | |
| | | /* ååºå¼è°æ´ */ |
| | | @media (max-width: 768px) { |
| | | .loading-state, |
| | | .empty-state, |
| | | .error-state { |
| | | padding: 20px; |
| | | min-height: 50vh; |
| | | |
| | | .el-icon-loading, |
| | | .el-icon-document, |
| | | .el-icon-warning { |
| | | font-size: 40px !important; |
| | | } |
| | | |
| | | h3 { |
| | | font-size: 18px !important; |
| | | } |
| | | |
| | | p { |
| | | font-size: 13px !important; |
| | | } |
| | | } |
| | | } |
| | | ::v-deep { |
| | | .el-checkbox-group { |
| | | display: flex; |
| | | flex-direction: column; |
| | | margin: 15px 0; |
| | | gap: 12px; |
| | | } |
| | | |
| | | .el-radio-group { |
| | | display: flex; |
| | | flex-direction: column; |
| | | margin: 15px 0; |
| | | gap: 12px; |
| | | } |
| | | |
| | | .el-radio.is-bordered, |
| | | .el-checkbox.is-bordered { |
| | | width: 100%; |
| | | margin-right: 0; |
| | | margin-bottom: 10px; |
| | | max-width: 400px; |
| | | padding: 14px 20px 14px 15px; |
| | | border-radius: 8px; |
| | | height: auto; |
| | | min-height: 50px; |
| | | border: 1px solid #e2e8f0; |
| | | transition: all 0.3s ease; |
| | | margin-left: 0 !important; |
| | | margin-top: 0 !important; |
| | | .el-radio-group, |
| | | .el-checkbox-group { |
| | | align-items: center; |
| | | } |
| | | &:hover { |
| | | border-color: var(--primary-color); |
| | | box-shadow: 0 2px 8px rgba(var(--primary-color), 0.15); |
| | | } |
| | | |
| | | &.is-checked { |
| | | border-color: var(--primary-color); |
| | | background-color: rgba(var(--primary-color), 0.05); |
| | | } |
| | | } |
| | | |
| | | .el-radio__label, |
| | | .el-checkbox__label { |
| | | font-size: 16px; |
| | | color: #2d3748; |
| | | } |
| | | |
| | | .el-alert--warning.is-light { |
| | | background-color: #fff8f0; |
| | | color: var(--alert-color); |
| | | margin-top: 15px; |
| | | border-radius: 8px; |
| | | border-left: 4px solid var(--alert-color); |
| | | |
| | | .el-alert__title { |
| | | font-size: 15px; |
| | | line-height: 1.6; |
| | | color: var(--alert-color); |
| | | } |
| | | |
| | | .el-alert__closebtn { |
| | | color: var(--alert-color); |
| | | } |
| | | } |
| | | |
| | | .el-textarea__inner { |
| | | font-size: 16px; |
| | | border-radius: 8px; |
| | | border: 1px solid #e2e8f0; |
| | | padding: 12px 15px; |
| | | transition: all 0.3s ease; |
| | | min-height: 100px; |
| | | |
| | | &:focus { |
| | | border-color: var(--primary-color); |
| | | box-shadow: 0 0 0 2px rgba(var(--primary-color), 0.2); |
| | | } |
| | | |
| | | &::placeholder { |
| | | color: #a0aec0; |
| | | } |
| | | } |
| | | |
| | | .el-radio__input.is-checked .el-radio__inner { |
| | | background-color: var(--primary-color); |
| | | border-color: var(--primary-color); |
| | | } |
| | | |
| | | .el-checkbox__input.is-checked .el-checkbox__inner { |
| | | background-color: var(--primary-color); |
| | | border-color: var(--primary-color); |
| | | } |
| | | |
| | | .el-radio__inner, |
| | | .el-checkbox__inner { |
| | | width: 18px; |
| | | height: 18px; |
| | | } |
| | | } |
| | | |
| | | .bottom-fixed { |
| | | position: fixed; |
| | | bottom: 0; |
| | | left: 0; |
| | | width: 100%; |
| | | text-align: center; |
| | | padding: 10px 0; |
| | | background: var(--theme-gradient); |
| | | box-shadow: 0 -4px 12px rgba(0, 0, 0, 0.1); |
| | | z-index: 1000; |
| | | transition: all 0.3s ease; |
| | | |
| | | .el-button { |
| | | height: 56px; |
| | | font-size: 18px; |
| | | font-weight: 500; |
| | | letter-spacing: 0.5px; |
| | | border-radius: 8px; |
| | | background-color: #fff; |
| | | color: var(--primary-color); |
| | | border: none; |
| | | box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); |
| | | transition: all 0.3s ease; |
| | | width: 80%; |
| | | max-width: 400px; |
| | | position: relative; |
| | | overflow: hidden; |
| | | |
| | | &::before { |
| | | content: ""; |
| | | position: absolute; |
| | | top: 0; |
| | | left: -100%; |
| | | width: 100%; |
| | | height: 100%; |
| | | background: linear-gradient( |
| | | 90deg, |
| | | transparent, |
| | | rgba(255, 255, 255, 0.4), |
| | | transparent |
| | | ); |
| | | transition: all 0.5s ease; |
| | | } |
| | | |
| | | &:hover { |
| | | transform: translateY(-2px); |
| | | box-shadow: 0 6px 16px rgba(0, 0, 0, 0.2); |
| | | |
| | | &::before { |
| | | left: 100%; |
| | | } |
| | | } |
| | | |
| | | &:active { |
| | | transform: translateY(0); |
| | | } |
| | | } |
| | | } |
| | | |
| | | /* ååºå¼è®¾è®¡ */ |
| | | @media (max-width: 768px) { |
| | | .questionnaire { |
| | | .CONTENT { |
| | | padding: 15px; |
| | | } |
| | | |
| | | .preview-left, |
| | | .preview-lefts { |
| | | padding: 20px; |
| | | margin-bottom: 80px; |
| | | } |
| | | |
| | | .title { |
| | | font-size: 24px !important; |
| | | } |
| | | |
| | | .dev-text { |
| | | font-size: 16px !important; |
| | | } |
| | | |
| | | .bottom-fixed .el-button { |
| | | height: 50px; |
| | | font-size: 16px; |
| | | width: 90%; |
| | | } |
| | | } |
| | | } |
| | | </style> |