From 61f0c5d3a9308d1eaefd8890a46b3c569707e050 Mon Sep 17 00:00:00 2001
From: WXL (wul) <wl_5969728@163.com>
Date: 星期四, 09 四月 2026 09:24:47 +0800
Subject: [PATCH] 测试完成

---
 src/views/Satisfaction/configurationmyd/components/DetailsAnomaly.vue | 1272 ++++++++++++++++++++++++++++++++++-----------------------
 1 files changed, 766 insertions(+), 506 deletions(-)

diff --git a/src/views/Satisfaction/configurationmyd/components/DetailsAnomaly.vue b/src/views/Satisfaction/configurationmyd/components/DetailsAnomaly.vue
index 57b4dff..d25ddf7 100644
--- a/src/views/Satisfaction/configurationmyd/components/DetailsAnomaly.vue
+++ b/src/views/Satisfaction/configurationmyd/components/DetailsAnomaly.vue
@@ -13,147 +13,286 @@
       <el-row :gutter="20">
         <el-col :span="8">
           <div class="info-item">
-            <span class="label">鎮h�呭鍚嶏細</span>
-            <span class="value">{{ currentRecord.patientName }}</span>
+            <span class="label">闂鍐呭锛�</span>
+            <span class="value">{{ currentRecord.questiontext || '鏃�' }}</span>
           </div>
         </el-col>
         <el-col :span="8">
           <div class="info-item">
-            <span class="label">鎬у埆锛�</span>
-            <span class="value">{{ currentRecord.gender === 1 ? '鐢�' : '濂�' }}</span>
+            <span class="label">鍥炵瓟鍐呭锛�</span>
+            <span class="value">{{ currentRecord.asrtext || '鏃犲洖绛�' }}</span>
           </div>
         </el-col>
         <el-col :span="8">
           <div class="info-item">
-            <span class="label">骞撮緞锛�</span>
-            <span class="value">{{ currentRecord.age }}宀�</span>
-          </div>
-        </el-col>
-        <el-col :span="8">
-          <div class="info-item">
-            <span class="label">鑱旂郴鏂瑰紡锛�</span>
-            <span class="value">{{ currentRecord.phone }}</span>
-          </div>
-        </el-col>
-        <el-col :span="8">
-          <div class="info-item">
-            <span class="label">鍑洪櫌绉戝锛�</span>
-            <span class="value">{{ currentRecord.dischargeDept }}</span>
-          </div>
-        </el-col>
-        <el-col :span="8">
-          <div class="info-item">
-            <span class="label">鍑洪櫌鐥呭尯锛�</span>
-            <span class="value">{{ currentRecord.dischargeWard }}</span>
-          </div>
-        </el-col>
-        <el-col :span="8">
-          <div class="info-item">
-            <span class="label">濉啓鏃堕棿锛�</span>
-            <span class="value">{{ currentRecord.fillTime }}</span>
+            <span class="label">瑙f瀽鍊硷細</span>
+            <span class="value">{{ currentRecord.matchedtext || '鏃�' }}</span>
           </div>
         </el-col>
         <el-col :span="8">
           <div class="info-item">
             <span class="label">璐熻矗绉戝锛�</span>
-            <el-tag type="primary">{{ currentRecord.responsibilityDept }}</el-tag>
+            <el-tag v-if="currentRecord.todeptname" type="primary">{{ currentRecord.todeptname }}</el-tag>
+            <span v-else class="value">鏈垎閰�</span>
           </div>
         </el-col>
         <el-col :span="8">
           <div class="info-item">
             <span class="label">澶勭悊鐘舵�侊細</span>
             <el-tag
-              :type="getStatusTagType(currentRecord.processStatus)"
+              :type="getStatusTagType(currentRecord.handleFlag)"
               effect="dark"
             >
-              {{ getStatusText(currentRecord.processStatus) }}
+              {{ getStatusText(currentRecord.handleFlag) }}
             </el-tag>
+          </div>
+        </el-col>
+        <el-col :span="8">
+          <div class="info-item">
+            <span class="label">妯℃澘绫诲瀷锛�</span>
+            <el-tag :type="currentRecord.templateType === 1 ? 'primary' : 'success'">
+              {{ currentRecord.templateType === 1 ? '璇煶妯℃澘' : '闂嵎妯℃澘' }}
+            </el-tag>
+          </div>
+        </el-col>
+        <el-col :span="8">
+          <div class="info-item">
+            <span class="label">鍒涘缓鏃堕棿锛�</span>
+            <span class="value">{{ formatDateTime(currentRecord.createTime) }}</span>
+          </div>
+        </el-col>
+        <el-col :span="8">
+          <div class="info-item">
+            <span class="label">澶勭悊鏃堕棿锛�</span>
+            <span class="value">{{ currentRecord.handleTime ? formatDateTime(currentRecord.handleTime) : '鏈鐞�' }}</span>
+          </div>
+        </el-col>
+        <el-col :span="8">
+          <div class="info-item">
+            <span class="label">澶勭悊浜猴細</span>
+            <span class="value">{{ currentRecord.handleBy || '鏈鐞�' }}</span>
+          </div>
+        </el-col>
+        <el-col :span="24" v-if="currentRecord.patdesc">
+          <div class="info-item">
+            <span class="label">鎮h�呬俊鎭細</span>
+            <span class="value">{{ currentRecord.patdesc }}</span>
+          </div>
+        </el-col>
+        <el-col :span="8" v-if="currentRecord.handleresult">
+          <div class="info-item">
+            <span class="label">澶勭悊缁撴灉锛�</span>
+            <span class="value">{{ getHandleresultText(currentRecord.handleresult) }}</span>
+          </div>
+        </el-col>
+        <el-col :span="16" v-if="currentRecord.handledesc">
+          <div class="info-item">
+            <span class="label">澶勭悊璇存槑锛�</span>
+            <span class="value">{{ currentRecord.handledesc }}</span>
+          </div>
+        </el-col>
+        <el-col :span="24" v-if="currentRecord.finaloption">
+          <div class="info-item">
+            <span class="label">鏈�缁堟剰瑙侊細</span>
+            <span class="value">{{ currentRecord.finaloption }}</span>
+          </div>
+        </el-col>
+        <el-col :span="8" v-if="currentRecord.recordurl">
+          <div class="info-item">
+            <span class="label">褰曢煶鍦板潃锛�</span>
+            <el-button
+              type="text"
+              size="small"
+              icon="el-icon-headset"
+              @click="handlePlayAudio(currentRecord.recordurl)"
+            >
+              鎾斁褰曢煶
+            </el-button>
+          </div>
+        </el-col>
+        <el-col :span="8" v-if="currentRecord.ccdepts">
+          <div class="info-item">
+            <span class="label">鎶勯�佺瀹わ細</span>
+            <span class="value">{{ currentRecord.ccdepts }}</span>
           </div>
         </el-col>
       </el-row>
     </div>
 
-    <!-- 闂嵎璇︽儏 -->
-    <div class="questionnaire-section">
-      <div class="section-title">闂嵎濉啓璇︽儏</div>
-      <div class="questionnaire-content">
-        <div class="question-item" v-for="(question, index) in questionnaireData" :key="index">
-          <div class="question-header">
-            <span class="question-index">{{ index + 1 }}.</span>
-            <span class="question-text">{{ question.question }}</span>
-            <el-tag
-              size="mini"
-              :type="question.type === 1 ? 'primary' : 'success'"
-              class="question-type"
-            >
-              {{ question.type === 1 ? '鍗曢�夐' : '澶氶�夐' }}
-            </el-tag>
-          </div>
-          <div class="question-options">
-            <el-radio-group
-              v-model="question.answer"
-              v-if="question.type === 1"
-              disabled
-            >
-              <el-radio
-                v-for="option in question.options"
-                :key="option.value"
-                :label="option.value"
-                :class="{ 'unsatisfactory-option': isUnsatisfactoryOption(option.value) }"
+    <!-- 闂嵎/璇煶璇︽儏 -->
+    <div class="content-container" v-if="templateData.length > 0">
+      <el-tabs v-model="activeName" type="border-card">
+        <!-- 闂嵎闅忚璇︽儏 -->
+        <el-tab-pane name="wj" v-if="currentRecord.templateType === 2">
+          <span slot="label"><i class="el-icon-notebook-1"></i> 闂嵎闅忚璇︽儏</span>
+          <div class="CONTENT">
+            <div class="title">{{ currentRecord.questiontext || '闂嵎璇︽儏' }}</div>
+            <div class="preview-left" v-if="!isVoiceTemplate">
+              <div
+                class="topic-dev"
+                v-for="(item, index) in templateData"
+                :key="item.id"
               >
-                {{ option.text }}
-              </el-radio>
-            </el-radio-group>
-            <el-checkbox-group
-              v-model="question.answer"
-              v-else
-              disabled
-            >
-              <el-checkbox
-                v-for="option in question.options"
-                :key="option.value"
-                :label="option.value"
-                :class="{ 'unsatisfactory-option': isUnsatisfactoryOption(option.value) }"
-              >
-                {{ option.text }}
-              </el-checkbox>
-            </el-checkbox-group>
+                <!-- 鍗曢�� -->
+                <div
+                  :class="getTopicClass(item)"
+                  :key="index"
+                  v-if="item.scriptType == 1 && !item.astrict"
+                >
+                  <div class="dev-text">
+                    {{ index + 1 }}銆乕鍗曢�塢<span>{{ item.scriptContent }}</span>
+                  </div>
+                  <div class="dev-xx">
+                    <el-radio-group v-model="item.scriptResult" disabled>
+                      <el-radio
+                        v-for="(option, optionIndex) in item.svyTaskTemplateTargetoptions"
+                        :class="getOptionClass(option)"
+                        :key="optionIndex"
+                        :label="option.optioncontent"
+                      >{{ option.optioncontent }}</el-radio>
+                    </el-radio-group>
+                  </div>
+                  <div
+                    v-if="item.showAppendInput || item.answerps"
+                    class="append-input-container"
+                  >
+                    <el-input
+                      type="textarea"
+                      :rows="2"
+                      placeholder="璇疯緭鍏ュ叿浣撲俊鎭�"
+                      v-model="item.answerps"
+                      readonly
+                    ></el-input>
+                  </div>
+                  <div v-show="item.prompt">
+                    <el-alert :title="item.prompt" type="warning"></el-alert>
+                  </div>
+                </div>
+                <!-- 澶氶�� -->
+                <div
+                  :class="item.isabnormal ? 'scriptTopic-isabnormal' : 'scriptTopic-dev'"
+                  :key="index"
+                  v-if="item.scriptType == 2 && !item.astrict"
+                >
+                  <div class="dev-text">
+                    {{ index + 1 }}銆乕澶氶�塢<span>{{ item.scriptContent }}</span>
+                  </div>
+                  <div class="dev-xx">
+                    <el-checkbox-group v-model="item.scriptResult" disabled>
+                      <el-checkbox
+                        :class="option.isabnormal ? 'red-star' : ''"
+                        v-for="(option, optionIndex) in item.svyTaskTemplateTargetoptions"
+                        :key="optionIndex"
+                        :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 && !item.astrict"
+                >
+                  <div class="dev-text">
+                    {{ index + 1 }}銆乕闂瓟]<span>{{ item.scriptContent }}</span>
+                    <span v-if="item.valueType == 3">(鍙兘杈撳叆鏁板瓧)</span>
+                  </div>
+                  <div class="dev-xx" v-if="item.valueType == 3">
+                    <el-input
+                      type="text"
+                      placeholder="璇疯緭鍏ョ瓟妗�"
+                      v-model="item.scriptResult"
+                      readonly
+                    ></el-input>
+                  </div>
+                  <div class="dev-xx" v-else>
+                    <el-input
+                      type="textarea"
+                      :rows="2"
+                      placeholder="璇疯緭鍏ョ瓟妗�"
+                      v-model="item.scriptResult"
+                      readonly
+                    ></el-input>
+                  </div>
+                </div>
+              </div>
+            </div>
           </div>
-          <div v-if="question.additional" class="additional-remark">
-            <div class="remark-label">琛ュ厖璇存槑锛�</div>
-            <div class="remark-content">{{ question.additional }}</div>
+        </el-tab-pane>
+
+        <!-- 璇煶闅忚璇︽儏 -->
+        <el-tab-pane name="yy" v-if="currentRecord.templateType === 1">
+          <span slot="label"><i class="el-icon-headset"></i> 璇煶闅忚璇︽儏</span>
+          <div class="borderdiv">
+            <div class="title">{{ taskName }}</div>
+            <div class="voice-audio" v-if="voiceAudioUrl">
+              瀹屾暣璇煶锛�
+              <audio-player
+                :audio-source="voiceAudioUrl"
+              ></audio-player>
+            </div>
+            <div class="preview-left" v-if="voiceData.length > 0">
+              <div v-for="(item, index) in voiceData" :key="index">
+                <div class="leftside">
+                  <i class="el-icon-phone-outline"></i>
+                  <span>{{ item.questiontext || '闂鍐呭' }}</span>
+                </div>
+                <div class="offside">
+                  <i class="el-icon-user"></i>
+                  <div class="offside-value">
+                    <el-input
+                      type="textarea"
+                      :autosize="{ minRows: 1 }"
+                      v-model="item.asrtext"
+                      readonly
+                    ></el-input>
+                    <div v-if="item.questionvoice">
+                      <audio-player
+                        :audio-source="item.questionvoice"
+                      ></audio-player>
+                    </div>
+                  </div>
+                </div>
+              </div>
+            </div>
           </div>
-        </div>
-      </div>
+        </el-tab-pane>
+      </el-tabs>
     </div>
 
     <!-- 澶勭悊璁板綍 -->
-    <div class="process-section">
+    <div class="process-section" v-if="processRecords.length > 0">
       <div class="section-title">澶勭悊璁板綍</div>
-      <div class="process-timeline" v-if="processRecords.length > 0">
+      <div class="process-timeline">
         <el-timeline>
           <el-timeline-item
             v-for="(record, index) in processRecords"
             :key="index"
-            :timestamp="record.time"
+            :timestamp="formatDateTime(record.handleTime || record.createTime)"
             placement="top"
           >
             <el-card>
               <div class="process-item">
                 <div class="process-header">
-                  <span class="process-user">{{ record.user }}</span>
+                  <span class="process-user">{{ record.handleBy || '绯荤粺' }}</span>
                   <el-tag
                     size="small"
-                    :type="getStatusTagType(record.status)"
+                    :type="getStatusTagType(record.handleFlag)"
                   >
-                    {{ getStatusText(record.status) }}
+                    {{ getStatusText(record.handleFlag) }}
                   </el-tag>
                 </div>
                 <div class="process-content">
-                  <div v-if="record.reportDepts && record.reportDepts.length > 0" class="process-depts">
-                    <span class="label">鎶ュ绉戝锛�</span>
+                  <div v-if="record.ccdepts" class="process-depts">
+                    <span class="label">鎶勯�佺瀹わ細</span>
                     <el-tag
-                      v-for="dept in record.reportDepts"
+                      v-for="dept in getDeptArray(record.ccdepts)"
                       :key="dept"
                       size="small"
                       type="info"
@@ -162,31 +301,23 @@
                       {{ dept }}
                     </el-tag>
                   </div>
-                  <div v-if="record.remark" class="process-remark">
-                    <span class="label">澶勭悊澶囨敞锛�</span>
-                    <span class="content">{{ record.remark }}</span>
+                  <div v-if="record.handleresult" class="process-remark">
+                    <span class="label">澶勭悊缁撴灉锛�</span>
+                    <span class="content">{{ getHandleresultText(record.handleresult) }}</span>
                   </div>
-                  <div v-if="record.attachments && record.attachments.length > 0" class="process-attachments">
-                    <span class="label">闄勪欢锛�</span>
-                    <el-button
-                      v-for="file in record.attachments"
-                      :key="file.id"
-                      type="text"
-                      size="small"
-                      icon="el-icon-document"
-                      @click="handlePreviewFile(file)"
-                    >
-                      {{ file.name }}
-                    </el-button>
+                  <div v-if="record.handledesc" class="process-remark">
+                    <span class="label">澶勭悊璇存槑锛�</span>
+                    <span class="content">{{ record.handledesc }}</span>
+                  </div>
+                  <div v-if="record.finaloption" class="process-remark">
+                    <span class="label">鏈�缁堟剰瑙侊細</span>
+                    <span class="content">{{ record.finaloption }}</span>
                   </div>
                 </div>
               </div>
             </el-card>
           </el-timeline-item>
         </el-timeline>
-      </div>
-      <div v-else class="no-record">
-        鏆傛棤澶勭悊璁板綍
       </div>
     </div>
 
@@ -195,7 +326,7 @@
         type="primary"
         icon="el-icon-edit"
         @click="handleProcess"
-        v-if="currentRecord.processStatus !== 2"
+        v-if="currentRecord.handleFlag !== '1'"
       >
         澶勭悊寮傚父
       </el-button>
@@ -217,61 +348,72 @@
         label-width="100px"
         size="medium"
       >
-        <el-form-item label="澶勭悊鐘舵��" prop="status">
+        <el-form-item label="澶勭悊鐘舵��" prop="handleFlag">
           <el-select
-            v-model="processForm.status"
+            v-model="processForm.handleFlag"
             placeholder="璇烽�夋嫨澶勭悊鐘舵��"
             style="width: 100%"
           >
-            <el-option label="澶勭悊涓�" :value="1" />
-            <el-option label="宸插鐞�" :value="2" />
-            <el-option label="宸查┏鍥�" :value="3" />
+            <el-option label="宸插鐞�" :value="'1'" />
+            <el-option label="鍙栨秷澶勭悊" :value="'0'" />
           </el-select>
         </el-form-item>
 
-        <el-form-item label="鎶ュ绉戝" prop="reportDepts">
+        <el-form-item label="鎶勯�佺瀹�" prop="ccdepts">
           <el-select
-            v-model="processForm.reportDepts"
-            placeholder="璇烽�夋嫨鎶ュ绉戝"
+            v-model="processForm.ccdepts"
+            placeholder="璇烽�夋嫨鎶勯�佺瀹�"
             multiple
             filterable
             collapse-tags
             style="width: 100%"
+            :disabled="processForm.handleFlag !== '1'"
           >
             <el-option
               v-for="dept in deptList"
-              :key="dept.id"
-              :label="dept.name"
-              :value="dept.id"
+              :key="dept.deptCode"
+              :label="dept.label"
+              :value="dept.deptCode"
             />
           </el-select>
         </el-form-item>
 
-        <el-form-item label="澶勭悊澶囨敞" prop="remark">
+        <el-form-item label="澶勭悊缁撴灉" prop="handleresult">
+          <el-select
+            v-model="processForm.handleresult"
+            placeholder="璇烽�夋嫨澶勭悊缁撴灉"
+            style="width: 100%"
+            :disabled="processForm.handleFlag !== '1'"
+          >
+            <el-option label="宸茶В鍐�" value="resolved" />
+            <el-option label="宸茶В閲�" value="explained" />
+            <el-option label="宸茶浆浜�" value="transferred" />
+            <el-option label="闇�鏀硅繘" value="improvement" />
+            <el-option label="宸查┏鍥�" value="rejected" />
+          </el-select>
+        </el-form-item>
+
+        <el-form-item label="澶勭悊璇存槑" prop="handledesc">
           <el-input
-            v-model="processForm.remark"
+            v-model="processForm.handledesc"
             type="textarea"
             :rows="4"
-            placeholder="璇疯緭鍏ュ鐞嗗娉紙鏈�澶�500瀛楋級"
+            placeholder="璇疯緭鍏ュ鐞嗚鏄庯紙鏈�澶�500瀛楋級"
             maxlength="500"
             show-word-limit
+            :disabled="processForm.handleFlag !== '1'"
           />
         </el-form-item>
 
-        <el-form-item label="闄勪欢涓婁紶">
-          <el-upload
-            class="upload-demo"
-            action="#"
-            :on-preview="handleFilePreview"
-            :on-remove="handleFileRemove"
-            :before-remove="beforeFileRemove"
-            :limit="3"
-            :on-exceed="handleFileExceed"
-            :file-list="fileList"
-          >
-            <el-button size="small" type="primary">鐐瑰嚮涓婁紶</el-button>
-            <div slot="tip" class="el-upload__tip">鏀寔涓婁紶鍥剧墖銆佹枃妗g瓑闄勪欢锛屽崟涓枃浠朵笉瓒呰繃10MB</div>
-          </el-upload>
+        <el-form-item label="鏈�缁堟剰瑙�" prop="finaloption" v-if="hasQualityPermission">
+          <el-input
+            v-model="processForm.finaloption"
+            type="textarea"
+            :rows="3"
+            placeholder="璇疯緭鍏ユ渶缁堝鐞嗘剰瑙侊紙鏈�澶�300瀛楋級"
+            maxlength="300"
+            show-word-limit
+          />
         </el-form-item>
       </el-form>
       <span slot="footer" class="dialog-footer">
@@ -285,24 +427,42 @@
         </el-button>
       </span>
     </el-dialog>
+
+    <!-- 褰曢煶鎾斁鍣� -->
+    <audio
+      v-if="audioUrl"
+      :src="audioUrl"
+      ref="audioPlayer"
+      controls
+      style="display: none"
+    />
   </el-dialog>
 </template>
 
 <script>
+import { traceedit } from "@/api/AiCentre/index";
+import { getsearchrResults, getPersonVoices, getTaskservelist } from "@/api/AiCentre/index";
+import { deptTreeSelect } from "@/api/system/user";
+import AudioPlayer from "@/components/AudioPlayer"; // 闇�瑕佸垱寤鸿繖涓煶棰戞挱鏀剧粍浠�
+
 export default {
   name: 'ExceptionDetailDialog',
+  components: {
+    AudioPlayer
+  },
   props: {
-    // 鏄惁鏄剧ず瀵硅瘽妗�
     visible: {
       type: Boolean,
       default: false
     },
-    // 璁板綍ID
     recordId: {
       type: [Number, String],
       default: null
     },
-    // 瀵硅瘽妗嗘爣棰�
+    recordData: {
+      type: Object,
+      default: () => ({})
+    },
     title: {
       type: String,
       default: '寮傚父鍙嶉璇︽儏'
@@ -313,45 +473,71 @@
       // 褰撳墠璁板綍
       currentRecord: {},
 
-      // 闂嵎鏁版嵁
-      questionnaireData: [],
+      // 闂嵎/璇煶鏁版嵁
+      activeName: 'wj',
+      taskName: '',
+      templateData: [],
+      voiceData: [],
+      voiceAudioUrl: '',
 
       // 澶勭悊璁板綍
       processRecords: [],
 
       // 绉戝鍒楄〃
-      deptList: [
-        { id: 1, name: '蹇冭绠″唴绉�' },
-        { id: 2, name: '绁炵粡鍐呯' },
-        { id: 3, name: '鏅绉�' },
-        { id: 4, name: '楠ㄧ' },
-        { id: 5, name: '濡囦骇绉�' },
-        { id: 6, name: '鍎跨' },
-        { id: 7, name: '鎬ヨ瘖绉�' },
-        { id: 8, name: '鍛煎惛鍐呯' }
-      ],
+      deptList: [],
 
       // 澶勭悊瀵硅瘽妗�
       processDialogVisible: false,
       processing: false,
       processForm: {
-        status: '',
-        reportDepts: [],
-        remark: ''
+        handleFlag: '',
+        ccdepts: [],
+        handleresult: '',
+        handledesc: '',
+        finaloption: ''
       },
       processRules: {
-        status: [
+        handleFlag: [
           { required: true, message: '璇烽�夋嫨澶勭悊鐘舵��', trigger: 'change' }
         ],
-        remark: [
-          { required: true, message: '璇疯緭鍏ュ鐞嗗娉�', trigger: 'blur' },
-          { min: 5, max: 500, message: '澶囨敞闀垮害鍦� 5 鍒� 500 涓瓧绗�', trigger: 'blur' }
+        handleresult: [
+          {
+            required: true,
+            message: '璇烽�夋嫨澶勭悊缁撴灉',
+            trigger: 'change',
+            validator: (rule, value, callback) => {
+              if (this.processForm.handleFlag === '1' && !value) {
+                callback(new Error('璇烽�夋嫨澶勭悊缁撴灉'));
+              } else {
+                callback();
+              }
+            }
+          }
+        ],
+        handledesc: [
+          {
+            required: true,
+            message: '璇疯緭鍏ュ鐞嗚鏄�',
+            trigger: 'blur',
+            validator: (rule, value, callback) => {
+              if (this.processForm.handleFlag === '1' && (!value || value.trim().length < 3)) {
+                callback(new Error('澶勭悊璇存槑鑷冲皯3涓瓧绗�'));
+              } else {
+                callback();
+              }
+            }
+          }
         ]
       },
-      fileList: [],
+
+      // 闊抽鎾斁
+      audioUrl: '',
 
       // 鍔犺浇鐘舵��
-      loading: false
+      loading: false,
+
+      // 鏉冮檺鎺у埗
+      hasQualityPermission: false
     };
   },
 
@@ -363,6 +549,10 @@
       set(val) {
         this.$emit('update:visible', val);
       }
+    },
+
+    isVoiceTemplate() {
+      return this.currentRecord.templateType === 1;
     }
   },
 
@@ -370,237 +560,293 @@
     visible: {
       immediate: true,
       handler(val) {
-        if (val && this.recordId) {
+        if (val) {
           this.loadData();
+        } else {
+          this.resetData();
+        }
+      }
+    },
+
+    recordData: {
+      immediate: true,
+      handler(val) {
+        if (val && Object.keys(val).length > 0) {
+          this.currentRecord = { ...val };
         }
       }
     }
   },
 
   methods: {
-    // 鍔犺浇鏁版嵁
-    async loadData() {
-      this.loading = true;
+    // 鏍煎紡鍖栨棩鏈熸椂闂�
+    formatDateTime(dateTime) {
+      if (!dateTime) return '';
       try {
-        await Promise.all([
-          this.loadRecordDetail(),
-          this.loadQuestionnaireData(),
-          this.loadProcessRecords()
-        ]);
-      } finally {
-        this.loading = false;
+        const date = new Date(dateTime);
+        if (isNaN(date.getTime())) {
+          return dateTime;
+        }
+        return date.toLocaleDateString().replace(/\//g, '-') + ' ' +
+               date.toTimeString().split(' ')[0];
+      } catch (error) {
+        console.error('鏃ユ湡鏍煎紡鍖栭敊璇�:', error);
+        return dateTime;
       }
     },
 
-    // 鍔犺浇璁板綍璇︽儏
-    async loadRecordDetail() {
-      return new Promise(resolve => {
-        setTimeout(() => {
-          // 鏍规嵁涓嶅悓鐨剅ecordId杩斿洖涓嶅悓鐨刴ock鏁版嵁
-          const mockRecords = {
-            1: {
-              id: 1,
-              patientName: '寮犲厛鐢�',
-              gender: 1,
-              age: 45,
-              phone: '13800138000',
-              dischargeDept: '蹇冭绠″唴绉�',
-              dischargeWard: '鍐呯涓�鐥呭尯',
-              fillTime: '2024-01-15 10:30:25',
-              responsibilityDept: '蹇冭绠″唴绉�',
-              processStatus: 0
-            },
-            2: {
-              id: 2,
-              patientName: '鏉庡コ澹�',
-              gender: 0,
-              age: 38,
-              phone: '13900139000',
-              dischargeDept: '绁炵粡鍐呯',
-              dischargeWard: '鍐呯浜岀梾鍖�',
-              fillTime: '2024-01-14 16:20:10',
-              responsibilityDept: '绁炵粡鍐呯',
-              processStatus: 0
-            },
-            3: {
-              id: 3,
-              patientName: '鐜嬪厛鐢�',
-              gender: 1,
-              age: 52,
-              phone: '13700137000',
-              dischargeDept: '鏅绉�',
-              dischargeWard: '澶栫涓�鐥呭尯',
-              fillTime: '2024-01-13 09:15:45',
-              responsibilityDept: '鏅绉�',
-              processStatus: 1
-            }
-          };
-
-          this.currentRecord = mockRecords[this.recordId] || {
-            id: 1,
-            patientName: '寮犲厛鐢�',
-            gender: 1,
-            age: 45,
-            phone: '13800138000',
-            dischargeDept: '蹇冭绠″唴绉�',
-            dischargeWard: '鍐呯涓�鐥呭尯',
-            fillTime: '2024-01-15 10:30:25',
-            responsibilityDept: '蹇冭绠″唴绉�',
-            processStatus: 0
-          };
-          resolve();
-        }, 300);
-      });
+    // 妫�鏌ヨ川绠℃潈闄�
+    checkQualityPermission() {
+      const userRoles = this.$store.getters.roles || [];
+      return userRoles.includes('quality_manager') || userRoles.includes('admin');
     },
 
-    // 鍔犺浇闂嵎鏁版嵁
-    async loadQuestionnaireData() {
-      return new Promise(resolve => {
-        setTimeout(() => {
-          this.questionnaireData = [
-            {
-              question: '鎮ㄥ鍖绘姢浜哄憳鐨勬湇鍔℃�佸害鏄惁婊℃剰锛�',
-              type: 1,
-              options: [
-                { value: '闈炲父婊℃剰', text: '闈炲父婊℃剰' },
-                { value: '婊℃剰', text: '婊℃剰' },
-                { value: '涓�鑸�', text: '涓�鑸�' },
-                { value: '涓嶆弧鎰�', text: '涓嶆弧鎰�' },
-                { value: '闈炲父涓嶆弧鎰�', text: '闈炲父涓嶆弧鎰�' }
-              ],
-              answer: '涓嶆弧鎰�',
-              additional: '鍖荤敓鏌ユ埧鏃堕棿澶煭锛屾矡閫氫笉澶熷厖鍒嗭紝瀵圭梾鎯呰В閲婁笉澶熻缁�'
-            },
-            {
-              question: '鎮ㄥ鍖荤敓鐨勮瘖鐤楁按骞冲拰鎶�鏈兘鍔涜瘎浠峰浣曪紵',
-              type: 1,
-              options: [
-                { value: '闈炲父涓撲笟', text: '闈炲父涓撲笟' },
-                { value: '姣旇緝涓撲笟', text: '姣旇緝涓撲笟' },
-                { value: '涓�鑸�', text: '涓�鑸�' },
-                { value: '涓嶅涓撲笟', text: '涓嶅涓撲笟' },
-                { value: '闈炲父涓嶄笓涓�', text: '闈炲父涓嶄笓涓�' }
-              ],
-              answer: '姣旇緝涓撲笟',
-              additional: ''
-            },
-            {
-              question: '鎮ㄥ鍖婚櫌鐨勭幆澧冨拰鍗敓鐘跺喌鏄惁婊℃剰锛�',
-              type: 1,
-              options: [
-                { value: '闈炲父婊℃剰', text: '闈炲父婊℃剰' },
-                { value: '婊℃剰', text: '婊℃剰' },
-                { value: '涓�鑸�', text: '涓�鑸�' },
-                { value: '涓嶆弧鎰�', text: '涓嶆弧鎰�' },
-                { value: '闈炲父涓嶆弧鎰�', text: '闈炲父涓嶆弧鎰�' }
-              ],
-              answer: '涓�鑸�',
-              additional: ''
-            },
-            {
-              question: '鎮ㄨ涓哄尰鎶や汉鍛樹笌鎮ㄧ殑娌熼�氭槸鍚﹀厖鍒嗭紵',
-              type: 1,
-              options: [
-                { value: '闈炲父鍏呭垎', text: '闈炲父鍏呭垎' },
-                { value: '姣旇緝鍏呭垎', text: '姣旇緝鍏呭垎' },
-                { value: '涓�鑸�', text: '涓�鑸�' },
-                { value: '涓嶅鍏呭垎', text: '涓嶅鍏呭垎' },
-                { value: '闈炲父涓嶅厖鍒�', text: '闈炲父涓嶅厖鍒�' }
-              ],
-              answer: '涓嶅鍏呭垎',
-              additional: '鍖荤敓璁茶В鐥呮儏鏃惰閫熷お蹇紝娌℃湁缁欒冻澶熺殑鏃堕棿鎻愰棶'
-            },
-            {
-              question: '鎮ㄥ绛夊緟灏辫瘖鍜屾不鐤楃殑鏃堕棿鏄惁婊℃剰锛�',
-              type: 1,
-              options: [
-                { value: '闈炲父婊℃剰', text: '闈炲父婊℃剰' },
-                { value: '婊℃剰', text: '婊℃剰' },
-                { value: '涓�鑸�', text: '涓�鑸�' },
-                { value: '涓嶆弧鎰�', text: '涓嶆弧鎰�' },
-                { value: '闈炲父涓嶆弧鎰�', text: '闈炲父涓嶆弧鎰�' }
-              ],
-              answer: '涓嶆弧鎰�',
-              additional: '棰勭害鐨�9鐐癸紝瀹為檯10鐐规墠瑙佸埌鍖荤敓'
-            }
-          ];
-          resolve();
-        }, 300);
-      });
+    // 鑾峰彇绉戝鍒楄〃
+    async getDeptOptions() {
+      try {
+        const res = await deptTreeSelect();
+        if (res.code == 200) {
+          this.deptList = this.flattenArray(res.data) || [];
+        }
+      } catch (error) {
+        console.error('鑾峰彇绉戝鍒楄〃澶辫触:', error);
+      }
     },
 
-    // 鍔犺浇澶勭悊璁板綍
-    async loadProcessRecords() {
-      return new Promise(resolve => {
-        setTimeout(() => {
-          this.processRecords = [
-            {
-              id: 1,
-              time: '2024-01-15 14:20:30',
-              user: '寮犲尰鐢�',
-              status: 1, // 澶勭悊涓�
-              reportDepts: ['鍖诲姟绉�', '鎶ょ悊閮�'],
-              remark: '宸叉敹鍒板弽棣堬紝姝e湪瀹夋帓鐩稿叧浜哄憳鏍告煡鎯呭喌',
-              attachments: [
-                { id: 1, name: '鍒濇璋冩煡璁板綍.docx' },
-                { id: 2, name: '鎮h�呮矡閫氳褰�.jpg' }
-              ]
-            },
-            {
-              id: 2,
-              time: '2024-01-15 10:45:12',
-              user: '绯荤粺',
-              status: 0, // 寰呭鐞�
-              remark: '绯荤粺鑷姩璇嗗埆涓哄紓甯稿弽棣堬紝宸插垎閰嶅埌璐d换绉戝',
-              attachments: []
-            }
-          ];
-          resolve();
-        }, 300);
-      });
-    },
+    // 灞曞钩鏁扮粍
+    flattenArray(multiArray) {
+      let result = [];
 
-    // 鍒ゆ柇鏄惁涓轰笉婊℃剰閫夐」
-    isUnsatisfactoryOption(value) {
-      const unsatisfactoryValues = [
-        '涓嶆弧鎰�',
-        '闈炲父涓嶆弧鎰�',
-        '涓嶅涓撲笟',
-        '闈炲父涓嶄笓涓�',
-        '涓嶅鍏呭垎',
-        '闈炲父涓嶅厖鍒�'
-      ];
-      return unsatisfactoryValues.includes(value);
+      function flatten(element) {
+        if (element.children && element.children.length > 0) {
+          element.children.forEach((child) => flatten(child));
+        } else {
+          let item = JSON.parse(JSON.stringify(element));
+          result.push(item);
+        }
+      }
+
+      multiArray.forEach((element) => flatten(element));
+      return result;
     },
 
     // 鑾峰彇鐘舵�佹爣绛剧被鍨�
-    getStatusTagType(status) {
-      switch (status) {
-        case 0: return 'warning'; // 寰呭鐞�
-        case 1: return 'primary'; // 澶勭悊涓�
-        case 2: return 'success'; // 宸插鐞�
-        case 3: return 'danger';  // 宸查┏鍥�
+    getStatusTagType(handleFlag) {
+      switch (handleFlag) {
+        case '0': return 'warning'; // 鏈鐞�
+        case '1': return 'success'; // 宸插鐞�
         default: return 'info';
       }
     },
 
     // 鑾峰彇鐘舵�佹枃鏈�
-    getStatusText(status) {
-      switch (status) {
-        case 0: return '寰呭鐞�';
-        case 1: return '澶勭悊涓�';
-        case 2: return '宸插鐞�';
-        case 3: return '宸查┏鍥�';
+    getStatusText(handleFlag) {
+      switch (handleFlag) {
+        case '0': return '鏈鐞�';
+        case '1': return '宸插鐞�';
         default: return '鏈煡';
+      }
+    },
+
+    // 鑾峰彇澶勭悊缁撴灉鏂囨湰
+    getHandleresultText(handleresult) {
+      const map = {
+        'resolved': '宸茶В鍐�',
+        'explained': '宸茶В閲�',
+        'transferred': '宸茶浆浜�',
+        'improvement': '闇�鏀硅繘',
+        'rejected': '宸查┏鍥�'
+      };
+      return map[handleresult] || handleresult;
+    },
+
+    // 鑾峰彇绉戝鏁扮粍
+    getDeptArray(ccdepts) {
+      if (!ccdepts) return [];
+      return ccdepts.split(',');
+    },
+
+    // 鎾斁闊抽
+    handlePlayAudio(url) {
+      this.audioUrl = url;
+      this.$nextTick(() => {
+        const audioPlayer = this.$refs.audioPlayer;
+        if (audioPlayer) {
+          audioPlayer.play().catch(error => {
+            console.error('鎾斁澶辫触:', error);
+            this.$message.error('闊抽鎾斁澶辫触');
+          });
+        }
+      });
+    },
+
+    // 鑾峰彇涓婚鏍峰紡绫�
+    getTopicClass(item) {
+      if (item.isabnormal == 1) {
+        return "scriptTopic-isabnormal";
+      } else if (item.isabnormal == 2) {
+        return "scriptTopic-warning";
+      } else {
+        return "scriptTopic-dev";
+      }
+    },
+
+    // 鑾峰彇閫夐」鏍峰紡绫�
+    getOptionClass(items) {
+      if (items.isabnormal == 1) {
+        return "red-star";
+      } else if (items.isabnormal == 2) {
+        return "yellow-star";
+      }
+      return "";
+    },
+
+    // 鍔犺浇鏁版嵁
+    async loadData() {
+      this.loading = true;
+      try {
+        this.hasQualityPermission = this.checkQualityPermission();
+        await this.getDeptOptions();
+
+        if (Object.keys(this.currentRecord).length === 0) {
+          this.currentRecord = this.recordData || {};
+        }
+
+        // 濡傛灉褰撳墠璁板綍鏄闊虫ā鏉匡紝鍔犺浇璇煶鏁版嵁
+        if (this.currentRecord.templateType === 1) {
+          await this.loadVoiceData();
+          this.activeName = 'yy';
+        } else if (this.currentRecord.templateType === 2) {
+          await this.loadQuestionnaireData();
+          this.activeName = 'wj';
+        }
+
+        await this.loadProcessRecords();
+      } catch (error) {
+        console.error('鍔犺浇璇︽儏鏁版嵁澶辫触:', error);
+        this.$message.error('鍔犺浇鏁版嵁澶辫触');
+      } finally {
+        this.loading = false;
+      }
+    },
+
+    // 閲嶇疆鏁版嵁
+    resetData() {
+      this.currentRecord = {};
+      this.templateData = [];
+      this.voiceData = [];
+      this.processRecords = [];
+      this.voiceAudioUrl = '';
+      this.taskName = '';
+      this.activeName = 'wj';
+    },
+
+    // 鍔犺浇闂嵎鏁版嵁
+    async loadQuestionnaireData() {
+      try {
+        // 杩欓噷闇�瑕佹牴鎹疄闄呮儏鍐佃皟鐢ㄦ帴鍙h幏鍙栭棶鍗锋暟鎹�
+        // 濡傛灉recordData涓凡缁忓寘鍚簡闂嵎鏁版嵁锛屽彲浠ョ洿鎺ヤ娇鐢�
+        if (this.currentRecord.taskid && this.currentRecord.patid) {
+          const params = {
+            taskid: this.currentRecord.taskid,
+            patid: this.currentRecord.patid,
+            subId: this.currentRecord.subId || this.currentRecord.id,
+            isFinish: true
+          };
+
+          const res = await getsearchrResults(params);
+          if (res.code === 200 && res.data) {
+            this.templateData = res.data.scriptResult || [];
+            this.taskName = res.data.taskName || '';
+
+            // 澶勭悊鏁版嵁鏍煎紡
+            this.templateData.forEach((item) => {
+              if (item.scriptType == 2) item.scriptResult = [];
+              if (item.scriptResultId && item.scriptType != 2) {
+                item.isoption = 3;
+                item.scriptResult = item.scriptResult;
+              } else if (item.scriptResultId && item.scriptType == 2) {
+                item.scriptResult = item.scriptResult.split("&");
+                item.isoption = 3;
+              }
+            });
+
+            this.overdata();
+          }
+        }
+      } catch (error) {
+        console.error('鍔犺浇闂嵎鏁版嵁澶辫触:', error);
+      }
+    },
+
+    // 澶勭悊寮傚父鏁版嵁
+    overdata() {
+      this.templateData.forEach((item, index) => {
+        var obj = item.svyTaskTemplateTargetoptions.find(
+          (items) => items.optioncontent == item.scriptResult
+        );
+        if (obj && obj.isabnormal) {
+          this.templateData[index].isabnormal = obj.isabnormal;
+        }
+        this.$forceUpdate();
+      });
+    },
+
+    // 鍔犺浇璇煶鏁版嵁
+    async loadVoiceData() {
+      try {
+        if (this.currentRecord.taskid && this.currentRecord.patid) {
+          const params = {
+            taskid: this.currentRecord.taskid,
+            patid: this.currentRecord.patid,
+            subId: this.currentRecord.subId || this.currentRecord.id
+          };
+
+          const res = await getPersonVoices(params);
+          if (res.code == 200) {
+            this.voiceData = res.data.serviceSubtaskDetails || [];
+            this.voiceAudioUrl = res.data.voice || '';
+            this.taskName = res.data.taskName || '';
+            this.templateData = res.data.filteredDetails || [];
+
+            this.templateData.forEach((item) => {
+              if (item.targetvalue) {
+                item.scriptResult = item.targetvalue.split("&");
+              } else {
+                item.scriptResult = [];
+              }
+            });
+          }
+        }
+      } catch (error) {
+        console.error('鍔犺浇璇煶鏁版嵁澶辫触:', error);
+      }
+    },
+
+    // 鍔犺浇澶勭悊璁板綍
+    async loadProcessRecords() {
+      try {
+        // 杩欓噷鍙互鏍规嵁recordId鍔犺浇澶勭悊鍘嗗彶
+        // 鏆傛椂浣跨敤褰撳墠璁板綍鐨勫鐞嗕俊鎭�
+        if (this.currentRecord.handleTime) {
+          this.processRecords = [{
+            ...this.currentRecord,
+            time: this.currentRecord.handleTime
+          }];
+        }
+      } catch (error) {
+        console.error('鍔犺浇澶勭悊璁板綍澶辫触:', error);
       }
     },
 
     // 澶勭悊寮傚父
     handleProcess() {
       this.processForm = {
-        status: this.currentRecord.processStatus === 0 ? 1 : this.currentRecord.processStatus,
-        reportDepts: [],
-        remark: ''
+        handleFlag: this.currentRecord.handleFlag === '0' ? '1' : '0',
+        ccdepts: this.currentRecord.ccdepts ? this.currentRecord.ccdepts.split(',') : [],
+        handleresult: this.currentRecord.handleresult || '',
+        handledesc: this.currentRecord.handledesc || '',
+        finaloption: this.currentRecord.finaloption || ''
       };
       this.processDialogVisible = true;
     },
@@ -608,52 +854,56 @@
     // 鎻愪氦澶勭悊
     async submitProcess() {
       this.$refs.processForm.validate(async (valid) => {
-        if (valid) {
-          this.processing = true;
-          try {
-            // Mock API璋冪敤
-            await new Promise(resolve => setTimeout(resolve, 1000));
+        if (!valid) {
+          return;
+        }
 
-            this.$message.success('澶勭悊鎻愪氦鎴愬姛');
+        this.processing = true;
+        try {
+          const submitData = {
+            id: this.currentRecord.id,
+            handleFlag: this.processForm.handleFlag,
+            handleresult: this.processForm.handleresult,
+            handledesc: this.processForm.handledesc,
+            finaloption: this.processForm.finaloption,
+            ccdepts: Array.isArray(this.processForm.ccdepts)
+              ? this.processForm.ccdepts.join(",")
+              : this.processForm.ccdepts
+          };
+
+          const res = await traceedit(submitData);
+          if (res.code === 200) {
+            this.$message.success("澶勭悊鎻愪氦鎴愬姛");
             this.processDialogVisible = false;
 
-            // 閲嶆柊鍔犺浇鏁版嵁
-            await this.loadData();
+            // 鏇存柊褰撳墠璁板綍
+            this.currentRecord = {
+              ...this.currentRecord,
+              ...submitData,
+              handleBy: this.$store.getters.name, // 褰撳墠鐢ㄦ埛
+              handleTime: new Date().toISOString().replace('T', ' ').substr(0, 19)
+            };
+
+            // 閲嶆柊鍔犺浇澶勭悊璁板綍
+            await this.loadProcessRecords();
 
             // 瑙﹀彂鐖剁粍浠跺埛鏂�
             this.$emit('processed');
-          } finally {
-            this.processing = false;
+          } else {
+            this.$message.error(res.msg || "澶勭悊鎻愪氦澶辫触");
           }
+        } catch (error) {
+          console.error("澶勭悊鎻愪氦澶辫触:", error);
+          this.$message.error("澶勭悊鎻愪氦澶辫触锛岃绋嶅悗閲嶈瘯");
+        } finally {
+          this.processing = false;
         }
       });
-    },
-
-    // 棰勮鏂囦欢
-    handlePreviewFile(file) {
-      this.$message.info(`棰勮鏂囦欢: ${file.name}`);
     },
 
     // 澶勭悊瀵硅瘽妗嗗叧闂�
     handleClose() {
       this.$emit('close');
-    },
-
-    // 鏂囦欢涓婁紶鐩稿叧鏂规硶
-    handleFilePreview(file) {
-      console.log('棰勮鏂囦欢:', file);
-    },
-
-    handleFileRemove(file, fileList) {
-      console.log('绉婚櫎鏂囦欢:', file, fileList);
-    },
-
-    beforeFileRemove(file) {
-      return this.$confirm(`纭畾绉婚櫎 ${file.name}锛焋);
-    },
-
-    handleFileExceed(files, fileList) {
-      this.$message.warning(`褰撳墠闄愬埗閫夋嫨 3 涓枃浠讹紝鏈閫夋嫨浜� ${files.length} 涓枃浠讹紝鍏遍�夋嫨浜� ${files.length + fileList.length} 涓枃浠禶);
     }
   }
 };
@@ -705,116 +955,137 @@
         font-size: 14px;
         color: #303133;
         font-weight: 500;
+        flex: 1;
       }
     }
   }
 
-  .questionnaire-section {
+  .content-container {
     margin-bottom: 20px;
-    padding: 20px;
-    background: #fff;
-    border-radius: 8px;
-    border: 1px solid #ebeef5;
 
-    .section-title {
-      font-size: 16px;
-      font-weight: 600;
-      color: #303133;
-      margin-bottom: 15px;
-      padding-bottom: 10px;
-      border-bottom: 2px solid #409EFF;
+    ::v-deep .el-tabs__content {
+      padding: 20px;
+      background: #fff;
+      border-radius: 0 0 4px 4px;
     }
 
-    .questionnaire-content {
-      .question-item {
-        margin-bottom: 20px;
-        padding: 15px;
-        border-radius: 6px;
-        border: 1px solid #ebeef5;
-        transition: all 0.3s;
+    .CONTENT, .borderdiv {
+      padding: 20px;
+      background: #fff;
+      border-radius: 6px;
 
-        &:hover {
-          border-color: #409EFF;
-          box-shadow: 0 2px 12px 0 rgba(64, 158, 255, 0.1);
+      .title {
+        font-size: 18px;
+        font-weight: 600;
+        color: #303133;
+        margin-bottom: 20px;
+        padding-bottom: 10px;
+        border-bottom: 2px solid #409EFF;
+      }
+
+      .voice-audio {
+        margin-bottom: 20px;
+        display: flex;
+        align-items: center;
+        gap: 10px;
+
+        .audio-player {
+          flex: 1;
+        }
+      }
+
+      .preview-left {
+        .topic-dev {
+          margin-bottom: 20px;
+          padding: 15px;
+          border-radius: 6px;
+          border: 1px solid #ebeef5;
+          background: #fff;
+
+          .dev-text {
+            font-size: 15px;
+            font-weight: 500;
+            color: #303133;
+            margin-bottom: 15px;
+            line-height: 1.5;
+
+            span {
+              color: #606266;
+            }
+          }
+
+          .dev-xx {
+            ::v-deep .el-radio-group,
+            ::v-deep .el-checkbox-group {
+              display: flex;
+              flex-direction: column;
+              gap: 10px;
+            }
+
+            ::v-deep .el-radio,
+            ::v-deep .el-checkbox {
+              margin: 0;
+              padding: 8px 12px;
+              border-radius: 4px;
+              border: 1px solid #ebeef5;
+              transition: all 0.3s;
+
+              &:hover {
+                background: #f5f7fa;
+              }
+
+              &.red-star {
+                border-color: #f56c6c;
+                background: #fef0f0;
+              }
+
+              &.yellow-star {
+                border-color: #e6a23c;
+                background: #fdf6ec;
+              }
+            }
+          }
+
+          .append-input-container {
+            margin-top: 15px;
+          }
+
+          .el-alert {
+            margin-top: 10px;
+          }
         }
 
-        .question-header {
+        .leftside {
           display: flex;
           align-items: center;
-          margin-bottom: 15px;
-          padding-bottom: 10px;
-          border-bottom: 1px dashed #dcdfe6;
+          gap: 10px;
+          margin-bottom: 10px;
+          font-size: 15px;
+          font-weight: 500;
+          color: #303133;
 
-          .question-index {
-            font-weight: 600;
+          i {
             color: #409EFF;
-            margin-right: 8px;
-            font-size: 15px;
+          }
+        }
+
+        .offside {
+          display: flex;
+          align-items: flex-start;
+          gap: 10px;
+          margin-bottom: 20px;
+
+          i {
+            color: #67C23A;
+            margin-top: 8px;
           }
 
-          .question-text {
+          .offside-value {
             flex: 1;
-            font-size: 15px;
-            color: #303133;
-            font-weight: 500;
-            line-height: 1.5;
-          }
 
-          .question-type {
-            margin-left: 10px;
-          }
-        }
-
-        .question-options {
-          ::v-deep .el-radio-group {
-            display: flex;
-            flex-direction: column;
-            gap: 10px;
-          }
-
-          ::v-deep .el-checkbox-group {
-            display: flex;
-            flex-wrap: wrap;
-            gap: 15px;
-          }
-
-          ::v-deep .el-radio,
-          ::v-deep .el-checkbox {
-            margin: 0;
-            padding: 8px 12px;
-            border-radius: 4px;
-            border: 1px solid #ebeef5;
-            transition: all 0.3s;
-
-            &:hover {
-              background: #f5f7fa;
+            .el-textarea {
+              margin-bottom: 10px;
             }
-
-            &.unsatisfactory-option {
-              border-color: #e6a23c;
-              background: #fdf6ec;
-            }
-          }
-        }
-
-        .additional-remark {
-          margin-top: 15px;
-          padding: 12px;
-          background: #f0f9ff;
-          border-radius: 6px;
-          border-left: 4px solid #409EFF;
-
-          .remark-label {
-            font-size: 13px;
-            color: #606266;
-            font-weight: 500;
-            margin-bottom: 5px;
-          }
-
-          .remark-content {
-            font-size: 14px;
-            color: #303133;
-            line-height: 1.6;
           }
         }
       }
@@ -886,30 +1157,8 @@
               line-height: 1.5;
             }
           }
-
-          .process-attachments {
-            .label {
-              font-size: 13px;
-              color: #606266;
-              margin-right: 5px;
-            }
-
-            ::v-deep .el-button {
-              margin-right: 8px;
-              margin-bottom: 5px;
-            }
-          }
         }
       }
-    }
-
-    .no-record {
-      text-align: center;
-      padding: 40px 0;
-      color: #909399;
-      font-style: italic;
-      background: #f8f9fa;
-      border-radius: 6px;
     }
   }
 
@@ -920,4 +1169,15 @@
     gap: 10px;
   }
 }
+
+// 寮傚父鏍峰紡
+.scriptTopic-isabnormal {
+  border-color: #f56c6c !important;
+  background: #fef0f0 !important;
+}
+
+.scriptTopic-warning {
+  border-color: #e6a23c !important;
+  background: #fdf6ec !important;
+}
 </style>

--
Gitblit v1.9.3