|  |  | 
 |  |  | <template> | 
 |  |  |   <!-- 聊连页面记录 --> | 
 |  |  |   <div class="Followupdetailspage"> | 
 |  |  |   <div class="Followupdetailspage" id="app-container"> | 
 |  |  |     <div class="Followuserinfo"> | 
 |  |  |       <div> | 
 |  |  |         <div class="userinfo-text"> | 
 |  |  |           {{ sendname }}<span>患者服务详情</span> | 
 |  |  |           <!-- <span>患者服务详情</span> --> | 
 |  |  |           <div class="headline"> | 
 |  |  |             <div>患者服务详情</div> | 
 |  |  |             <div style="margin-left: 20px"> | 
 |  |  |               <el-button | 
 |  |  |                 v-if="!Whetherall" | 
 |  |  |                 type="primary" | 
 |  |  |                 @click="getTaskservelist()" | 
 |  |  |                 >查看患者全部服务</el-button | 
 |  |  |               > | 
 |  |  |               <el-button v-else type="success" @click="getTaskservelist(id)" | 
 |  |  |                 >只展示本次服务信息</el-button | 
 |  |  |               > | 
 |  |  |             </div> | 
 |  |  |             <!-- <div style="margin-left: 20px; color: #59a0f0"> | 
 |  |  |               <el-link | 
 |  |  |                 href="https://9.208.2.207:6060/search-homepage" | 
 |  |  |                 target="_blank" | 
 |  |  |                 :underline="true" | 
 |  |  |               > | 
 |  |  |                 前往CDSS查询 | 
 |  |  |               </el-link> | 
 |  |  |             </div> --> | 
 |  |  |             <div class="merge-controls" v-if="Whetherall"> | 
 |  |  |               <el-button | 
 |  |  |                 type="primary" | 
 |  |  |                 @click="toggleMergeMode" | 
 |  |  |                 :disabled="selectedServices.length < 2" | 
 |  |  |               > | 
 |  |  |                 {{ isMergeMode ? "取消合并" : "合并编辑问卷" }} | 
 |  |  |               </el-button> | 
 |  |  |               <el-button | 
 |  |  |                 v-if="isMergeMode" | 
 |  |  |                 type="success" | 
 |  |  |                 @click="openMergeDialog" | 
 |  |  |                 :disabled="selectedServices.length < 2" | 
 |  |  |               > | 
 |  |  |                 开始合并 (已选 {{ selectedServices.length }} 个服务) | 
 |  |  |               </el-button> | 
 |  |  |             </div> | 
 |  |  |           </div> | 
 |  |  |           <!-- <el-button type="success">随访后短信</el-button> --> | 
 |  |  |         </div> | 
 |  |  |       </div> | 
 |  |  |       <div> | 
 |  |  |         <el-table :data="logsheetlist" style="width: 100%"> | 
 |  |  |           <el-table-column prop="sendname" align="center" label="姓名"> | 
 |  |  |           </el-table-column> | 
 |  |  |           <el-table-column prop="sendstate" align="center" label="服务状态"> | 
 |  |  |           </el-table-column> | 
 |  |  |         <el-table | 
 |  |  |           :data="logsheetlist" | 
 |  |  |           :row-class-name="tableRowClassName" | 
 |  |  |           style="width: 100%" | 
 |  |  |           @selection-change="handleSelectionChange" | 
 |  |  |         > | 
 |  |  |           <el-table-column | 
 |  |  |             prop="updateTime" | 
 |  |  |             type="selection" | 
 |  |  |             width="55" | 
 |  |  |             :selectable="checkSelectable" | 
 |  |  |             v-if="Whetherall" | 
 |  |  |           ></el-table-column> | 
 |  |  |           <el-table-column | 
 |  |  |             prop="sendname" | 
 |  |  |             align="center" | 
 |  |  |             label="完成时间" | 
 |  |  |             width="200" | 
 |  |  |             show-overflow-tooltip | 
 |  |  |             label="姓名" | 
 |  |  |             width="100" | 
 |  |  |           > | 
 |  |  |             <template slot-scope="scope"> | 
 |  |  |               <el-button | 
 |  |  |                 size="medium" | 
 |  |  |                 type="text" | 
 |  |  |                 @click=" | 
 |  |  |                   gettoken360( | 
 |  |  |                     scope.row.sfzh, | 
 |  |  |                     scope.row.drcode, | 
 |  |  |                     scope.row.drname | 
 |  |  |                   ) | 
 |  |  |                 " | 
 |  |  |                 ><span class="button-textsc">{{ | 
 |  |  |                   scope.row.sendname | 
 |  |  |                 }}</span></el-button | 
 |  |  |               > | 
 |  |  |             </template> | 
 |  |  |           </el-table-column> | 
 |  |  |           <el-table-column | 
 |  |  |             prop="taskName" | 
 |  |  | 
 |  |  |           > | 
 |  |  |           </el-table-column> | 
 |  |  |           <el-table-column | 
 |  |  |             prop="sendstate" | 
 |  |  |             align="center" | 
 |  |  |             width="200" | 
 |  |  |             label="任务状态" | 
 |  |  |           > | 
 |  |  |             <template slot-scope="scope"> | 
 |  |  |               <div v-if="scope.row.sendstate == 1"> | 
 |  |  |                 <el-tag type="primary" :disable-transitions="false" | 
 |  |  |                   >表单已领取</el-tag | 
 |  |  |                 > | 
 |  |  |               </div> | 
 |  |  |               <div v-if="scope.row.sendstate == 2"> | 
 |  |  |                 <el-tag type="primary" :disable-transitions="false" | 
 |  |  |                   >待随访</el-tag | 
 |  |  |                 > | 
 |  |  |               </div> | 
 |  |  |               <div v-if="scope.row.sendstate == 3"> | 
 |  |  |                 <el-tag type="success" :disable-transitions="false" | 
 |  |  |                   >表单已发送</el-tag | 
 |  |  |                 > | 
 |  |  |               </div> | 
 |  |  |               <div v-if="scope.row.sendstate == 4"> | 
 |  |  |                 <el-tag type="info" :disable-transitions="false">不执行</el-tag> | 
 |  |  |               </div> | 
 |  |  |               <div v-if="scope.row.sendstate == 5"> | 
 |  |  |                 <el-tag type="danger" :disable-transitions="false" | 
 |  |  |                   >发送失败</el-tag | 
 |  |  |                 > | 
 |  |  |               </div> | 
 |  |  |               <div v-if="scope.row.sendstate == 6"> | 
 |  |  |                 <el-tag type="success" :disable-transitions="false" | 
 |  |  |                   >已完成</el-tag | 
 |  |  |                 > | 
 |  |  |               </div> | 
 |  |  |             </template> | 
 |  |  |           </el-table-column> | 
 |  |  |           <el-table-column | 
 |  |  |             prop="finishtime" | 
 |  |  |             align="center" | 
 |  |  |             label="随访完成时间" | 
 |  |  |             width="200" | 
 |  |  |             show-overflow-tooltip | 
 |  |  |           > | 
 |  |  |           </el-table-column> | 
 |  |  |           <el-table-column | 
 |  |  |             label="出院日期" | 
 |  |  |             width="200" | 
 |  |  |             align="center" | 
 |  |  |             key="endtime" | 
 |  |  |             prop="endtime" | 
 |  |  |           > | 
 |  |  |             <template slot-scope="scope"> | 
 |  |  |               <span>{{ formatTime(scope.row.endtime) }}</span> | 
 |  |  |             </template></el-table-column | 
 |  |  |           > | 
 |  |  |           <el-table-column | 
 |  |  |             label="责任护士" | 
 |  |  |             width="120" | 
 |  |  |             align="center" | 
 |  |  |             key="nurseName" | 
 |  |  |             prop="nurseName" | 
 |  |  |           /> | 
 |  |  |           <el-table-column | 
 |  |  |             label="主治医生" | 
 |  |  |             width="120" | 
 |  |  |             align="center" | 
 |  |  |             key="drname" | 
 |  |  |             prop="drname" | 
 |  |  |           /> | 
 |  |  |  | 
 |  |  |           <el-table-column | 
 |  |  |             label="结果状态" | 
 |  |  |             align="center" | 
 |  |  |             key="excep" | 
 |  |  |             prop="excep" | 
 |  |  |             width="120" | 
 |  |  |           > | 
 |  |  |             <template slot-scope="scope"> | 
 |  |  |               <dict-tag | 
 |  |  |                 :options="dict.type.sys_yujing" | 
 |  |  |                 :value="scope.row.excep" | 
 |  |  |               /> | 
 |  |  |             </template> | 
 |  |  |           </el-table-column> | 
 |  |  |           <el-table-column | 
 |  |  |             label="处理意见" | 
 |  |  |             align="center" | 
 |  |  |             key="suggest" | 
 |  |  |             prop="suggest" | 
 |  |  |             width="120" | 
 |  |  |           > | 
 |  |  |             <template slot-scope="scope"> | 
 |  |  |               <dict-tag | 
 |  |  |                 :options="dict.type.sys_suggest" | 
 |  |  |                 :value="scope.row.suggest" | 
 |  |  |               /> | 
 |  |  |             </template> | 
 |  |  |           </el-table-column> | 
 |  |  |  | 
 |  |  |           <el-table-column | 
 |  |  |             prop="templatename" | 
 |  |  |             align="center" | 
 |  |  |             label="服务模板" | 
 |  |  |             width="200" | 
 |  |  |             show-overflow-tooltip | 
 |  |  |           > | 
 |  |  |           </el-table-column> | 
 |  |  |           <el-table-column | 
 |  |  |             prop="remark" | 
 |  |  |             align="center" | 
 |  |  |             label="服务记录" | 
 |  |  |             width="200" | 
 |  |  |             show-overflow-tooltip | 
 |  |  |           > | 
 |  |  | 
 |  |  |                 size="medium" | 
 |  |  |                 type="text" | 
 |  |  |                 @click="Seedetails(scope.row)" | 
 |  |  |                 v-hasPermi="['system:user:edit']" | 
 |  |  |                 ><span class="button-zx" | 
 |  |  |                   ><i class="el-icon-s-order"></i>查看服务</span | 
 |  |  |                   ><i class="el-icon-s-order"></i>查看</span | 
 |  |  |                 ></el-button | 
 |  |  |               > | 
 |  |  |             </template> | 
 |  |  | 
 |  |  |         </el-table> | 
 |  |  |       </div> | 
 |  |  |     </div> | 
 |  |  |     <div> | 
 |  |  |       <el-tabs type="border-card"> | 
 |  |  |         <el-tab-pane> | 
 |  |  |           <span class="mulsz" slot="label" | 
 |  |  |             ><i class="el-icon-notebook-1"></i> 问卷随访结果</span | 
 |  |  |           > | 
 |  |  |           <div class="CONTENT"> | 
 |  |  |             <div class="title">{{ taskname ? taskname : "问卷" }}</div> | 
 |  |  |             <div class="preview-left"> | 
 |  |  |               <!-- 单选 --> | 
 |  |  |               <div | 
 |  |  |                 class="topic-dev" | 
 |  |  |                 v-for="(item, index) in tableDatatop" | 
 |  |  |                 :key="item.aaa" | 
 |  |  |               > | 
 |  |  |                 <div | 
 |  |  |                   class="scriptTopic-dev" | 
 |  |  |                   :key="index" | 
 |  |  |                   v-if="item.scriptType == 1" | 
 |  |  |     <!-- 添加合并编辑对话框 --> | 
 |  |  |     <el-dialog | 
 |  |  |       title="合并编辑问卷" | 
 |  |  |       :visible.sync="mergeDialogVisible" | 
 |  |  |       width="80%" | 
 |  |  |       top="5vh" | 
 |  |  |       v-dialogDrag | 
 |  |  |     > | 
 |  |  |       <MergeAndModify | 
 |  |  |         v-if="mergeDialogVisible" | 
 |  |  |         :selected-services="selectedServices" | 
 |  |  |         :patid="patid" | 
 |  |  |         @save="handleMergeSave" | 
 |  |  |         @cancel="mergeDialogVisible = false" | 
 |  |  |       /> | 
 |  |  |     </el-dialog> | 
 |  |  |     <div class="action-container"> | 
 |  |  |       <div class="call-action"> | 
 |  |  |         <div class="call-container"> | 
 |  |  |           <!-- <div class="call-header"> | 
 |  |  |             <h2>一键呼叫功能</h2> | 
 |  |  |           </div> --> | 
 |  |  |  | 
 |  |  |           <div class="headline"> | 
 |  |  |             <div>随访内容</div> | 
 |  |  |           </div> | 
 |  |  |           <div> | 
 |  |  |             <el-tabs v-model="activeName" type="border-card"> | 
 |  |  |               <el-tab-pane name="wj"> | 
 |  |  |                 <span class="mulsz" slot="label" | 
 |  |  |                   ><i class="el-icon-notebook-1"></i> 问卷随访结果</span | 
 |  |  |                 > | 
 |  |  |                   <div class="dev-text"> | 
 |  |  |                     {{ index + 1 }}、[单选]<span>{{ item.scriptContent }}</span> | 
 |  |  |                   </div> | 
 |  |  |                   <div class="dev-xx"> | 
 |  |  |                     <el-radio-group | 
 |  |  |                       v-model="item.scriptResult" | 
 |  |  |                       @change="handleOptionChange($event, index, item)" | 
 |  |  |                 <div class="CONTENT"> | 
 |  |  |                   <div class="title">{{ taskname ? taskname : "问卷" }}</div> | 
 |  |  |  | 
 |  |  |                   <div class="preview-left" v-if="!Voicetype"> | 
 |  |  |                     <div | 
 |  |  |                       class="topic-dev" | 
 |  |  |                       v-for="(item, index) in tableDatatop" | 
 |  |  |                       :key="item.id" | 
 |  |  |                     > | 
 |  |  |                       <el-radio | 
 |  |  |                         v-for="( | 
 |  |  |                           items, index | 
 |  |  |                         ) in item.svyLibTemplateTargetoptions" | 
 |  |  |                       <!-- 单选 --> | 
 |  |  |                       <div | 
 |  |  |                         :class=" | 
 |  |  |                           item.isabnormal | 
 |  |  |                             ? 'scriptTopic-isabnormal' | 
 |  |  |                             : 'scriptTopic-dev' | 
 |  |  |                         " | 
 |  |  |                         :key="index" | 
 |  |  |                         :label="items.optioncontent" | 
 |  |  |                         >{{ items.optioncontent }}</el-radio | 
 |  |  |                         v-if="item.scriptType == 1 && !item.astrict" | 
 |  |  |                       > | 
 |  |  |                     </el-radio-group> | 
 |  |  |                         <div class="dev-text"> | 
 |  |  |                           {{ index + 1 }}、[单选]<span>{{ | 
 |  |  |                             item.scriptContent | 
 |  |  |                           }}</span> | 
 |  |  |                         </div> | 
 |  |  |                         <div class="dev-xx"> | 
 |  |  |                           <el-radio-group | 
 |  |  |                             v-model="item.scriptResult" | 
 |  |  |                             @change=" | 
 |  |  |                               handleOptionChange( | 
 |  |  |                                 $event, | 
 |  |  |                                 index, | 
 |  |  |                                 item.svyLibTemplateTargetoptions, | 
 |  |  |                                 item | 
 |  |  |                               ) | 
 |  |  |                             " | 
 |  |  |                           > | 
 |  |  |                             <el-radio | 
 |  |  |                               v-for="( | 
 |  |  |                                 items, indexs | 
 |  |  |                               ) in item.svyLibTemplateTargetoptions" | 
 |  |  |                               :class="items.isabnormal ? 'red-star' : ''" | 
 |  |  |                               :key="indexs" | 
 |  |  |                               :label="items.optioncontent" | 
 |  |  |                               >{{ items.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" | 
 |  |  |                             clearable | 
 |  |  |                           ></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" | 
 |  |  |                             @change="updateScore($event, index, item)" | 
 |  |  |                           > | 
 |  |  |                             <el-checkbox | 
 |  |  |                               :class="items.isabnormal ? 'red-star' : ''" | 
 |  |  |                               @change="$forceUpdate()" | 
 |  |  |                               v-for="( | 
 |  |  |                                 items, indexs | 
 |  |  |                               ) in item.svyLibTemplateTargetoptions" | 
 |  |  |                               :key="indexs" | 
 |  |  |                               :label="items.optioncontent" | 
 |  |  |                             > | 
 |  |  |                               {{ items.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" | 
 |  |  |                             v-numeric-only | 
 |  |  |                             placeholder="请输入答案" | 
 |  |  |                             v-model="item.scriptResult" | 
 |  |  |                           > | 
 |  |  |                           </el-input> | 
 |  |  |                         </div> | 
 |  |  |                         <div class="dev-xx" v-else> | 
 |  |  |                           <el-input | 
 |  |  |                             type="textarea" | 
 |  |  |                             :rows="2" | 
 |  |  |                             placeholder="请输入答案" | 
 |  |  |                             v-model="item.scriptResult" | 
 |  |  |                             clearable | 
 |  |  |                           > | 
 |  |  |                           </el-input> | 
 |  |  |                         </div> | 
 |  |  |                       </div> | 
 |  |  |                     </div> | 
 |  |  |                   </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>{{ item.scriptContent }}</span> | 
 |  |  |                   </div> | 
 |  |  |                   <div class="dev-xx"> | 
 |  |  |                     <el-checkbox-group | 
 |  |  |                       v-model="item.scriptResult" | 
 |  |  |                       @change="updateScore($event, index, item)" | 
 |  |  |  | 
 |  |  |                   <div class="preview-left" v-else> | 
 |  |  |                     <div | 
 |  |  |                       class="topic-dev" | 
 |  |  |                       v-for="(item, index) in tableDatatop" | 
 |  |  |                       :key="item.id" | 
 |  |  |                     > | 
 |  |  |                       <el-checkbox | 
 |  |  |                         @change="$forceUpdate()" | 
 |  |  |                         v-for="( | 
 |  |  |                           items, indexs | 
 |  |  |                         ) in item.svyLibTemplateTargetoptions" | 
 |  |  |                         :key="indexs" | 
 |  |  |                         :label="items.optioncontent" | 
 |  |  |                       > | 
 |  |  |                         {{ items.optioncontent }} | 
 |  |  |                       </el-checkbox> | 
 |  |  |                     </el-checkbox-group> | 
 |  |  |                       <div v-if="item.targetvalue"> | 
 |  |  |                         <div class="dev-text"> | 
 |  |  |                           {{ index + 1 }}、[单选]<span>{{ | 
 |  |  |                             item.questiontext | 
 |  |  |                           }}</span> | 
 |  |  |                         </div> | 
 |  |  |                         <div class="dev-xx"> | 
 |  |  |                           <el-radio-group | 
 |  |  |                             v-model="item.matchedtext" | 
 |  |  |                             @change=" | 
 |  |  |                               handleOptionChange( | 
 |  |  |                                 $event, | 
 |  |  |                                 index, | 
 |  |  |                                 item.ivrTaskScriptTargetoptionList, | 
 |  |  |                                 item | 
 |  |  |                               ) | 
 |  |  |                             " | 
 |  |  |                           > | 
 |  |  |                             <el-radio | 
 |  |  |                               v-for="(items, index) in item.scriptResult" | 
 |  |  |                               :key="items" | 
 |  |  |                               :label="items" | 
 |  |  |                               >{{ items }}</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-else> | 
 |  |  |                         <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" | 
 |  |  |                             v-numeric-only | 
 |  |  |                             placeholder="请输入答案" | 
 |  |  |                             v-model="item.scriptResult" | 
 |  |  |                           > | 
 |  |  |                           </el-input> | 
 |  |  |                         </div> | 
 |  |  |                         <div class="dev-xx" v-else> | 
 |  |  |                           <el-input | 
 |  |  |                             type="textarea" | 
 |  |  |                             :rows="2" | 
 |  |  |                             placeholder="请输入答案" | 
 |  |  |                             v-model="item.scriptResult" | 
 |  |  |                             clearable | 
 |  |  |                           > | 
 |  |  |                           </el-input> | 
 |  |  |                         </div> | 
 |  |  |                       </div> | 
 |  |  |                     </div> | 
 |  |  |                   </div> | 
 |  |  |                   <div v-show="item.prompt && item.scriptResult[0]"> | 
 |  |  |                     <el-alert :title="item.prompt" type="warning"> </el-alert> | 
 |  |  |                   </div> | 
 |  |  |                   <el-button | 
 |  |  |                     v-if="Voicetype" | 
 |  |  |                     type="primary" | 
 |  |  |                     @click="yuyingetdetail" | 
 |  |  |                     >保存服务详情</el-button | 
 |  |  |                   > | 
 |  |  |                   <el-button v-else type="primary" @click="getdetail" | 
 |  |  |                     >保存服务详情</el-button | 
 |  |  |                   > | 
 |  |  |                 </div> | 
 |  |  |                 <!-- 填空 --> | 
 |  |  |                 <div | 
 |  |  |                   class="scriptTopic-dev" | 
 |  |  |                   :key="index" | 
 |  |  |                   v-if="item.scriptType == 4" | 
 |  |  |               </el-tab-pane> | 
 |  |  |  | 
 |  |  |               <el-tab-pane name="yy"> | 
 |  |  |                 <span class="mulsz" slot="label" | 
 |  |  |                   ><i class="el-icon-headset"></i> 语音随访详情</span | 
 |  |  |                 > | 
 |  |  |                   <div class="dev-text"> | 
 |  |  |                     {{ index + 1 }}、[问答]<span>{{ item.scriptContent }}</span> | 
 |  |  |                 <div class="borderdiv"> | 
 |  |  |                   <div class="title">{{ taskname ? taskname : "问卷" }}</div> | 
 |  |  |                   <div | 
 |  |  |                     style=" | 
 |  |  |                       display: flex; | 
 |  |  |                       text-align: center; | 
 |  |  |                       align-items: center; | 
 |  |  |                       color: #59a0f0; | 
 |  |  |                     " | 
 |  |  |                   > | 
 |  |  |                     完整语音: | 
 |  |  |                     <mini-audio | 
 |  |  |                       :audio-source=" | 
 |  |  |                         voice ? voice : '@assets/order/example.mp3' | 
 |  |  |                       " | 
 |  |  |                     ></mini-audio> | 
 |  |  |                   </div> | 
 |  |  |                   <div class="dev-xx"> | 
 |  |  |                   <div class="preview-left"> | 
 |  |  |                     <div v-for="item in voiceDatatop"> | 
 |  |  |                       <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" | 
 |  |  |                           ></el-input> | 
 |  |  |  | 
 |  |  |                           <div> | 
 |  |  |                             <mini-audio | 
 |  |  |                               :audio-source=" | 
 |  |  |                                 item.questionvoice | 
 |  |  |                                   ? item.questionvoice | 
 |  |  |                                   : '@assets/order/example.mp3' | 
 |  |  |                               " | 
 |  |  |                             ></mini-audio> | 
 |  |  |                           </div> | 
 |  |  |                         </div> | 
 |  |  |                       </div> | 
 |  |  |                     </div> | 
 |  |  |                   </div> | 
 |  |  |                   <el-button | 
 |  |  |                     v-if="Voicetype" | 
 |  |  |                     type="primary" | 
 |  |  |                     @click="yuyingetdetail" | 
 |  |  |                     >保存随访详情</el-button | 
 |  |  |                   > | 
 |  |  |                   <el-button v-else type="primary" @click="getdetail" | 
 |  |  |                     >保存随访详情</el-button | 
 |  |  |                   > | 
 |  |  |                 </div> | 
 |  |  |               </el-tab-pane> | 
 |  |  |             </el-tabs> | 
 |  |  |           </div> | 
 |  |  |         </div> | 
 |  |  |       </div> | 
 |  |  |       <div class="manual-action"> | 
 |  |  |         <div class="Followuserinfos"> | 
 |  |  |           <div> | 
 |  |  |             <el-form | 
 |  |  |               ref="userform" | 
 |  |  |               :model="form" | 
 |  |  |               :rules="userrules" | 
 |  |  |               label-width="120px" | 
 |  |  |             > | 
 |  |  |               <div class="headline"> | 
 |  |  |                 <div>人工处理</div> | 
 |  |  |                 <div style="margin: 0 30px"> | 
 |  |  |                   <el-button | 
 |  |  |                     type="primary" | 
 |  |  |                     plain | 
 |  |  |                     @click="Editsingletasksonyic('')" | 
 |  |  |                     >保存基础信息</el-button | 
 |  |  |                   > | 
 |  |  |                 </div> | 
 |  |  |                 <div> | 
 |  |  |                   <el-button | 
 |  |  |                     type="primary" | 
 |  |  |                     round | 
 |  |  |                     v-if="this.form.isVisitAgain != 2" | 
 |  |  |                     @click="sendAgain()" | 
 |  |  |                     >再次随访</el-button | 
 |  |  |                   > | 
 |  |  |                 </div> | 
 |  |  |                 <div class="tag-selector-container"> | 
 |  |  |                   <el-select | 
 |  |  |                     v-model="selectedTag" | 
 |  |  |                     placeholder="请选择异常状态" | 
 |  |  |                     clearable | 
 |  |  |                     style="width: 150px; margin-right: 10px" | 
 |  |  |                   > | 
 |  |  |                     <el-option | 
 |  |  |                       v-for="item in tagOptions" | 
 |  |  |                       :key="item.value" | 
 |  |  |                       :label="item.label" | 
 |  |  |                       :value="item.value" | 
 |  |  |                     > | 
 |  |  |                       <span style="display: flex; align-items: center"> | 
 |  |  |                         <span | 
 |  |  |                           class="color-indicator" | 
 |  |  |                           :style="{ backgroundColor: item.color }" | 
 |  |  |                         ></span> | 
 |  |  |                         <span>{{ item.label }}</span> | 
 |  |  |                       </span> | 
 |  |  |                     </el-option> | 
 |  |  |                   </el-select> | 
 |  |  |  | 
 |  |  |                   <!-- 当前选择的颜色指示器 --> | 
 |  |  |                   <div | 
 |  |  |                     v-if="selectedTag" | 
 |  |  |                     class="color-indicator selected-indicator" | 
 |  |  |                     :style="{ backgroundColor: getSelectedTagColor() }" | 
 |  |  |                   ></div> | 
 |  |  |  | 
 |  |  |                   <!-- 标记说明提示 --> | 
 |  |  |                   <el-tooltip | 
 |  |  |                     v-if="selectedTag" | 
 |  |  |                     effect="light" | 
 |  |  |                     :content="getSelectedDescription()" | 
 |  |  |                     placement="top" | 
 |  |  |                   > | 
 |  |  |                     <i class="el-icon-info tag-info-icon"></i> | 
 |  |  |                   </el-tooltip> | 
 |  |  |                 </div> | 
 |  |  |               </div> | 
 |  |  |               <el-row> | 
 |  |  |                 <el-col :span="14" | 
 |  |  |                   ><el-form-item label="联系电话"> | 
 |  |  |                     <el-input | 
 |  |  |                       type="textarea" | 
 |  |  |                       :rows="2" | 
 |  |  |                       placeholder="请输入答案" | 
 |  |  |                       v-model="item.scriptResult" | 
 |  |  |                       clearable | 
 |  |  |                       placeholder="联系电话缺失" | 
 |  |  |                       v-model="userform.telcode" | 
 |  |  |                     > | 
 |  |  |                     </el-input> | 
 |  |  |                   </div> | 
 |  |  |                       <el-button | 
 |  |  |                         slot="append" | 
 |  |  |                         icon="el-icon-phone" | 
 |  |  |                         @click="handleCall(userform.telcode, 'tel')" | 
 |  |  |                         :disabled="!isValidPhone(userform.telcode)" | 
 |  |  |                       ></el-button | 
 |  |  |                     ></el-input> </el-form-item | 
 |  |  |                 ></el-col> | 
 |  |  |               </el-row> | 
 |  |  |               <el-row> | 
 |  |  |                 <el-col :span="14" | 
 |  |  |                   ><el-form-item label="联系人电话"> | 
 |  |  |                     <el-input | 
 |  |  |                       placeholder="联系人电话缺失" | 
 |  |  |                       v-model="userform.relativetelcode" | 
 |  |  |                     > | 
 |  |  |                       <el-button | 
 |  |  |                         slot="append" | 
 |  |  |                         icon="el-icon-phone" | 
 |  |  |                         @click=" | 
 |  |  |                           handleCall(userform.relativetelcode, 'relative') | 
 |  |  |                         " | 
 |  |  |                         :disabled="!isValidPhone(userform.relativetelcode)" | 
 |  |  |                       ></el-button | 
 |  |  |                     ></el-input> </el-form-item | 
 |  |  |                 ></el-col> | 
 |  |  |                 <el-col :span="10" | 
 |  |  |                   ><el-form-item label="联系人关系"> | 
 |  |  |                     <el-input | 
 |  |  |                       placeholder="联系人关系缺失" | 
 |  |  |                       v-model="userform.relation" | 
 |  |  |                     ></el-input> </el-form-item | 
 |  |  |                 ></el-col> | 
 |  |  |               </el-row> | 
 |  |  |               <div class="call-controls"> | 
 |  |  |                 <CallButton | 
 |  |  |                   ref="callButton" | 
 |  |  |                   :phoneNumber="currentPhoneNumber" | 
 |  |  |                   style="display: none" | 
 |  |  |                 /> | 
 |  |  |  | 
 |  |  |                 <div v-if="callStatus === 'connected'" class="hangup-btn"> | 
 |  |  |                   <el-button | 
 |  |  |                     type="danger" | 
 |  |  |                     icon="el-icon-phone" | 
 |  |  |                     @click="endCurrentCall" | 
 |  |  |                     :loading="isEndingCall" | 
 |  |  |                   > | 
 |  |  |                     挂断电话 | 
 |  |  |                   </el-button> | 
 |  |  |                 </div> | 
 |  |  |                 <div class="call-status" v-if="callStatus !== 'idle'"> | 
 |  |  |                   <el-alert | 
 |  |  |                     :title="callStatusText" | 
 |  |  |                     :type="callStatusType" | 
 |  |  |                     :closable="false" | 
 |  |  |                     show-icon | 
 |  |  |                   /> | 
 |  |  |                 </div> | 
 |  |  |               </div> | 
 |  |  |             </div> | 
 |  |  |           </div> | 
 |  |  |         </el-tab-pane> | 
 |  |  |         <el-tab-pane> | 
 |  |  |           <span class="mulsz" slot="label" | 
 |  |  |             ><i class="el-icon-headset"></i> 语音随访详情</span | 
 |  |  |           > | 
 |  |  |           <div class="borderdiv"> | 
 |  |  |             <div> | 
 |  |  |               <div class="leftside"> | 
 |  |  |                 <i class="el-icon-phone-outline"></i | 
 |  |  |                 ><span>您今天身体情况怎么样</span> | 
 |  |  |               </div> | 
 |  |  |               <div class="offside"> | 
 |  |  |                 <i class="el-icon-user"></i> | 
 |  |  |                 <div class="offside-value"> | 
 |  |  |                   <el-input v-model="input"></el-input> | 
 |  |  |                   <el-radio v-model="radio" label="1">很棒</el-radio> | 
 |  |  |                   <el-radio v-model="radio" label="2">还可以</el-radio> | 
 |  |  |                   <el-radio v-model="radio" label="3">不太好</el-radio> | 
 |  |  |                   <el-radio v-model="radio" label="4">比较差</el-radio> | 
 |  |  |               <el-form-item label="随访记录"> | 
 |  |  |                 <el-input type="textarea" v-model="form.remark"></el-input> | 
 |  |  |               </el-form-item> | 
 |  |  |  | 
 |  |  |               <el-form-item label="处理意见"> | 
 |  |  |                 <div> | 
 |  |  |                   <el-button | 
 |  |  |                     plain | 
 |  |  |                     type="warning" | 
 |  |  |                     @click="Editsingletaskson('1')" | 
 |  |  |                     >暂不处理</el-button | 
 |  |  |                   > | 
 |  |  |                   <el-button | 
 |  |  |                     plain | 
 |  |  |                     type="success" | 
 |  |  |                     @click="Editsingletaskson('2')" | 
 |  |  |                     >病情稳定</el-button | 
 |  |  |                   > | 
 |  |  |                   <el-button | 
 |  |  |                     plain | 
 |  |  |                     type="primary" | 
 |  |  |                     @click="Editsingletaskson('3')" | 
 |  |  |                     >通知就诊</el-button | 
 |  |  |                   > | 
 |  |  |                   <el-button plain type="info" @click="Editsingletaskson('5')" | 
 |  |  |                     >中心随访</el-button | 
 |  |  |                   > | 
 |  |  |                   <el-button type="primary" round @click="sendAgainmsg" | 
 |  |  |                     >短信发送</el-button | 
 |  |  |                   > | 
 |  |  |                 </div> | 
 |  |  |               </div> | 
 |  |  |               </el-form-item> | 
 |  |  |             </el-form> | 
 |  |  |  | 
 |  |  |             <div class="detailed"> | 
 |  |  |               <h3>患者档案信息</h3> | 
 |  |  |               <el-form ref="userform" :model="userform" label-width="100px"> | 
 |  |  |                 <el-row :gutter="20"> | 
 |  |  |                   <el-col :span="12"> | 
 |  |  |                     <el-form-item label="患者姓名" prop="name"> | 
 |  |  |                       <el-input | 
 |  |  |                         v-model="userform.name" | 
 |  |  |                         placeholder="请输入姓名" | 
 |  |  |                         maxlength="30" | 
 |  |  |                       ></el-input> </el-form-item | 
 |  |  |                   ></el-col> | 
 |  |  |                 </el-row> | 
 |  |  |                 <el-row :gutter="20"> | 
 |  |  |                   <el-col :span="12" | 
 |  |  |                     ><el-form-item label="联系方式" prop="telcode"> | 
 |  |  |                       <el-input | 
 |  |  |                         v-model="userform.telcode" | 
 |  |  |                         placeholder="请输入联系方式" | 
 |  |  |                         maxlength="20" | 
 |  |  |                       /> </el-form-item | 
 |  |  |                   ></el-col> | 
 |  |  |                   <el-col :span="12"> | 
 |  |  |                     <el-form-item label="亲属联系方式" prop="name"> | 
 |  |  |                       <el-input | 
 |  |  |                         v-model="userform.relativetelcode" | 
 |  |  |                         placeholder="请输入姓名" | 
 |  |  |                         maxlength="20" | 
 |  |  |                       ></el-input> </el-form-item | 
 |  |  |                   ></el-col> | 
 |  |  |                 </el-row> | 
 |  |  |                 <el-row :gutter="20"> | 
 |  |  |                   <el-col :span="24"> | 
 |  |  |                     <el-form-item label="出生地" prop="birthplace"> | 
 |  |  |                       <el-input | 
 |  |  |                         v-model="userform.birthplace" | 
 |  |  |                         placeholder="国、省、地市、区县、街道等详细信息" | 
 |  |  |                         maxlength="50" | 
 |  |  |                       /> </el-form-item | 
 |  |  |                   ></el-col> | 
 |  |  |                 </el-row> | 
 |  |  |                 <el-row :gutter="20"> | 
 |  |  |                   <el-col :span="24" | 
 |  |  |                     ><el-form-item label="居住地" prop="placeOfResidence"> | 
 |  |  |                       <el-input | 
 |  |  |                         v-model="userform.placeOfResidence" | 
 |  |  |                         placeholder="国、省、地市、区县、街道等详细信息" | 
 |  |  |                         maxlength="50" | 
 |  |  |                       /> </el-form-item | 
 |  |  |                   ></el-col> | 
 |  |  |                 </el-row> | 
 |  |  |               </el-form> | 
 |  |  |             </div> | 
 |  |  |           </div> | 
 |  |  |         </el-tab-pane> | 
 |  |  |       </el-tabs> | 
 |  |  |         </div> | 
 |  |  |       </div> | 
 |  |  |     </div> | 
 |  |  |     <!-- 短信发送对话框 --> | 
 |  |  |     <el-dialog title="短信发送" :visible.sync="smsDialogVisible"> | 
 |  |  |       <!-- 注意这里使用了 smsDialogVisible 以区分已有的 dialogFormVisible --> | 
 |  |  |       <el-form ref="smsForm" :model="form" label-width="80px"> | 
 |  |  |         <el-form-item label="患者名称"> | 
 |  |  |           <el-input | 
 |  |  |             style="width: 400px" | 
 |  |  |             disabled | 
 |  |  |             v-model="form.sendname" | 
 |  |  |           ></el-input> | 
 |  |  |         </el-form-item> | 
 |  |  |         <el-form-item label="年龄"> | 
 |  |  |           <el-input style="width: 400px" disabled v-model="form.age"></el-input> | 
 |  |  |         </el-form-item> | 
 |  |  |         <el-form-item label="电话"> | 
 |  |  |           <el-input | 
 |  |  |             style="width: 400px" | 
 |  |  |             disabled | 
 |  |  |             v-model="userform.telcode" | 
 |  |  |           ></el-input> | 
 |  |  |           <!-- 注意这里可能使用 userform.telcode --> | 
 |  |  |         </el-form-item> | 
 |  |  |         <el-form-item label="科室"> | 
 |  |  |           <el-input | 
 |  |  |             style="width: 400px" | 
 |  |  |             disabled | 
 |  |  |             v-model="form.deptname" | 
 |  |  |           ></el-input> | 
 |  |  |         </el-form-item> | 
 |  |  |         <el-form-item label="病区"> | 
 |  |  |           <el-input | 
 |  |  |             style="width: 400px" | 
 |  |  |             disabled | 
 |  |  |             v-model="form.leavehospitaldistrictname" | 
 |  |  |           ></el-input> | 
 |  |  |         </el-form-item> | 
 |  |  |         <el-form-item label="短信内容"> | 
 |  |  |           <el-input type="textarea" v-model="smsContent"></el-input> | 
 |  |  |           <!-- 建议使用独立的 smsContent 变量 --> | 
 |  |  |         </el-form-item> | 
 |  |  |       </el-form> | 
 |  |  |       <div slot="footer" class="dialog-footer"> | 
 |  |  |         <el-button @click="smsDialogVisible = false">取 消</el-button> | 
 |  |  |         <el-button type="primary" @click="sendSms">确认发送</el-button> | 
 |  |  |         <!-- 注意方法名改为 sendSms --> | 
 |  |  |       </div> | 
 |  |  |     </el-dialog> | 
 |  |  |     <el-dialog | 
 |  |  |       title="患者再次随访" | 
 |  |  |       v-dialogDrags | 
 |  |  |       :visible.sync="dialogFormVisible" | 
 |  |  |     > | 
 |  |  |       <el-form ref="zcform" :rules="zcrules" :model="form" label-width="80px"> | 
 |  |  |         <el-form-item label="任务名称"> | 
 |  |  |           <el-input | 
 |  |  |             style="width: 400px" | 
 |  |  |             disabled | 
 |  |  |             v-model="form.taskName" | 
 |  |  |           ></el-input> | 
 |  |  |         </el-form-item> | 
 |  |  |         <el-form-item label="患者名称"> | 
 |  |  |           <el-input | 
 |  |  |             style="width: 400px" | 
 |  |  |             disabled | 
 |  |  |             v-model="form.sendname" | 
 |  |  |           ></el-input> | 
 |  |  |         </el-form-item> | 
 |  |  |         <el-form-item label="年龄"> | 
 |  |  |           <el-input style="width: 400px" disabled v-model="form.age"></el-input> | 
 |  |  |         </el-form-item> | 
 |  |  |         <el-form-item label="科室"> | 
 |  |  |           <el-input | 
 |  |  |             style="width: 400px" | 
 |  |  |             disabled | 
 |  |  |             v-model="form.deptname" | 
 |  |  |           ></el-input> | 
 |  |  |         </el-form-item> | 
 |  |  |         <el-form-item label="病区"> | 
 |  |  |           <el-input | 
 |  |  |             style="width: 400px" | 
 |  |  |             disabled | 
 |  |  |             v-model="form.leavehospitaldistrictname" | 
 |  |  |           ></el-input> | 
 |  |  |         </el-form-item> | 
 |  |  |         <el-form-item label="出院时间"> | 
 |  |  |           <el-input | 
 |  |  |             style="width: 400px" | 
 |  |  |             disabled | 
 |  |  |             v-model="form.endtime" | 
 |  |  |           ></el-input> | 
 |  |  |         </el-form-item> | 
 |  |  |         <div class="headline">上次随访</div> | 
 |  |  |         <el-divider></el-divider> | 
 |  |  |         <el-row> | 
 |  |  |           <el-col :span="12"> | 
 |  |  |             <el-form-item label="随访方式"> | 
 |  |  |               <el-select | 
 |  |  |                 v-model="form.visitType2" | 
 |  |  |                 filterable | 
 |  |  |                 allow-create | 
 |  |  |                 default-first-option | 
 |  |  |                 disabled | 
 |  |  |                 placeholder="请选择随访方式" | 
 |  |  |                 class="custom-disabled" | 
 |  |  |               > | 
 |  |  |                 <el-option | 
 |  |  |                   v-for="item in options" | 
 |  |  |                   :key="item.value" | 
 |  |  |                   :label="item.label" | 
 |  |  |                   :value="item.value" | 
 |  |  |                 > | 
 |  |  |                 </el-option> | 
 |  |  |               </el-select> | 
 |  |  |             </el-form-item> | 
 |  |  |           </el-col> | 
 |  |  |           <el-col :span="12"> | 
 |  |  |             <el-form-item label="随访时间"> | 
 |  |  |               <el-date-picker | 
 |  |  |                 type="date" | 
 |  |  |                 disabled | 
 |  |  |                 placeholder="选择日期" | 
 |  |  |                 :picker-options="pickerOptions" | 
 |  |  |                 align="right" | 
 |  |  |                 v-model="form.date2" | 
 |  |  |                 class="custom-disabled" | 
 |  |  |               ></el-date-picker> | 
 |  |  |             </el-form-item> | 
 |  |  |           </el-col> | 
 |  |  |         </el-row> | 
 |  |  |  | 
 |  |  |         <el-form-item label="随访记录"> | 
 |  |  |           <el-input | 
 |  |  |             class="custom-disabled" | 
 |  |  |             type="textarea" | 
 |  |  |             disabled | 
 |  |  |             v-model="form.remark2" | 
 |  |  |           ></el-input> | 
 |  |  |         </el-form-item> | 
 |  |  |         <div class="headline">下次随访</div> | 
 |  |  |         <el-divider></el-divider> | 
 |  |  |         <el-row> | 
 |  |  |           <el-col :span="12"> | 
 |  |  |             <el-form-item label="随访方式" prop="date1"> | 
 |  |  |               <el-select | 
 |  |  |                 v-model="form.visitType" | 
 |  |  |                 filterable | 
 |  |  |                 allow-create | 
 |  |  |                 default-first-option | 
 |  |  |                 @change="visitChange" | 
 |  |  |                 placeholder="请选择随访方式(依出院时间技计算)" | 
 |  |  |               > | 
 |  |  |                 <el-option | 
 |  |  |                   v-for="item in options" | 
 |  |  |                   :key="item.value" | 
 |  |  |                   :label="item.label" | 
 |  |  |                   :value="item.value" | 
 |  |  |                 > | 
 |  |  |                 </el-option> | 
 |  |  |               </el-select> | 
 |  |  |             </el-form-item> | 
 |  |  |           </el-col> | 
 |  |  |           <el-col :span="12"> | 
 |  |  |             <el-form-item label="随访时间" prop="date1"> | 
 |  |  |               <el-date-picker | 
 |  |  |                 type="date" | 
 |  |  |                 placeholder="选择日期" | 
 |  |  |                 :picker-options="pickerOptions" | 
 |  |  |                 align="right" | 
 |  |  |                 v-model="form.date1" | 
 |  |  |                 class="custom-disabled" | 
 |  |  |               ></el-date-picker> | 
 |  |  |             </el-form-item> | 
 |  |  |           </el-col> | 
 |  |  |         </el-row> | 
 |  |  |         <el-form-item label="随访方式" prop="resource"> | 
 |  |  |           <el-radio-group v-model="form.resource"> | 
 |  |  |             <el-radio label="1">本病区随访</el-radio> | 
 |  |  |             <el-radio label="2">随访中心随访</el-radio> | 
 |  |  |           </el-radio-group> | 
 |  |  |         </el-form-item> | 
 |  |  |  | 
 |  |  |         <el-form-item label="随访记录"> | 
 |  |  |           <el-input type="textarea" v-model="form.remark"></el-input> | 
 |  |  |         </el-form-item> | 
 |  |  |       </el-form> | 
 |  |  |       <div slot="footer" class="dialog-footer"> | 
 |  |  |         <el-button type="warning" @click="dialogFormVisible = false" | 
 |  |  |           >取 消</el-button | 
 |  |  |         > | 
 |  |  |         <el-button type="primary" @click="setupsubtask">确认创建服务</el-button> | 
 |  |  |       </div> | 
 |  |  |     </el-dialog> | 
 |  |  |   </div> | 
 |  |  | </template> | 
 |  |  |  | 
 |  |  | <script> | 
 |  |  | import { getsearchrResults, getTaskservelist } from "@/api/AiCentre/index"; | 
 |  |  | import { | 
 |  |  |   getsearchrResults, | 
 |  |  |   getPersonVoices, | 
 |  |  |   addserviceSubtask, | 
 |  |  |   getTaskservelist, | 
 |  |  |   getTaskFollowup, | 
 |  |  |   Editsingletaskson, | 
 |  |  |   serviceSubtaskDetailedit, | 
 |  |  |   serviceSubtaskDetailadd, | 
 |  |  |   updatePersonVoices, | 
 |  |  |   addPersonVoices, | 
 |  |  |   query360PatInfo, | 
 |  |  |   sendMsg, | 
 |  |  | } from "@/api/AiCentre/index"; | 
 |  |  | import { | 
 |  |  |   messagelistpatient, | 
 |  |  |   alterpatient, | 
 |  |  |   listcontactinformation, | 
 |  |  | } from "@/api/patient/homepage"; | 
 |  |  | import CallButton from "@/components/CallButton"; | 
 |  |  | import MergeAndModify from "./MergeAndModify.vue"; | 
 |  |  | export default { | 
 |  |  |   components: { | 
 |  |  |     CallButton, | 
 |  |  |     MergeAndModify, | 
 |  |  |   }, | 
 |  |  |   directives: { | 
 |  |  |     numericOnly: { | 
 |  |  |       bind(el, binding, vnode) { | 
 |  |  |         // 尝试获取实际的input元素 | 
 |  |  |         const input = el.tagName === "INPUT" ? el : el.querySelector("input"); | 
 |  |  |         if (!input) { | 
 |  |  |           console.warn("v-numeric-only: 未找到input元素"); | 
 |  |  |           return; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         const handleInput = function (event) { | 
 |  |  |           const oldValue = input.value; | 
 |  |  |           const newValue = oldValue.replace(/[^\d]/g, ""); | 
 |  |  |           if (newValue !== oldValue) { | 
 |  |  |             input.value = newValue; | 
 |  |  |             // 触发input事件,通知v-model更新 | 
 |  |  |             input.dispatchEvent(new Event("input", { bubbles: true })); // 注意bubbles | 
 |  |  |           } | 
 |  |  |         }; | 
 |  |  |  | 
 |  |  |         const handlePaste = function (event) { | 
 |  |  |           event.preventDefault(); | 
 |  |  |           const clipboardData = event.clipboardData || window.clipboardData; | 
 |  |  |           const pastedData = clipboardData.getData("text"); | 
 |  |  |           const numericValue = pastedData.replace(/[^\d]/g, ""); | 
 |  |  |  | 
 |  |  |           // 模拟在光标位置插入纯数字文本 | 
 |  |  |           const start = input.selectionStart; | 
 |  |  |           const end = input.selectionEnd; | 
 |  |  |           input.value = | 
 |  |  |             input.value.substring(0, start) + | 
 |  |  |             numericValue + | 
 |  |  |             input.value.substring(end); | 
 |  |  |           // 调整光标位置 | 
 |  |  |           const newCursorPos = start + numericValue.length; | 
 |  |  |           input.setSelectionRange(newCursorPos, newCursorPos); | 
 |  |  |  | 
 |  |  |           // 触发input事件 | 
 |  |  |           input.dispatchEvent(new Event("input", { bubbles: true })); | 
 |  |  |         }; | 
 |  |  |  | 
 |  |  |         input.addEventListener("input", handleInput); | 
 |  |  |         input.addEventListener("paste", handlePaste); | 
 |  |  |  | 
 |  |  |         // 存储引用以便解绑 | 
 |  |  |         el._numericOnly = { | 
 |  |  |           inputHandle: handleInput, | 
 |  |  |           pasteHandle: handlePaste, | 
 |  |  |           inputEl: input, | 
 |  |  |         }; | 
 |  |  |       }, | 
 |  |  |       unbind(el) { | 
 |  |  |         if (el._numericOnly) { | 
 |  |  |           const { inputHandle, pasteHandle, inputEl } = el._numericOnly; | 
 |  |  |           inputEl.removeEventListener("input", inputHandle); | 
 |  |  |           inputEl.removeEventListener("paste", pasteHandle); | 
 |  |  |           delete el._numericOnly; | 
 |  |  |         } | 
 |  |  |       }, | 
 |  |  |     }, | 
 |  |  |   }, | 
 |  |  |   dicts: ["sys_normal_disable", "sys_user_sex", "sys_yujing", "sys_suggest"], | 
 |  |  |   data() { | 
 |  |  |     const validatePhone = (rule, value, callback) => { | 
 |  |  |       if (!value) { | 
 |  |  |         return callback(new Error("请输入联系电话")); | 
 |  |  |       } | 
 |  |  |       setTimeout(() => { | 
 |  |  |         if (!/^1[3-9]\d{9}$/.test(value)) { | 
 |  |  |           callback(new Error("请输入正确的11位手机号码")); | 
 |  |  |         } else { | 
 |  |  |           callback(); | 
 |  |  |         } | 
 |  |  |       }, 300); | 
 |  |  |     }; | 
 |  |  |     return { | 
 |  |  |       radio: "1", | 
 |  |  |       userid: "", | 
 |  |  |       currentPhoneNumber: "", | 
 |  |  |       callType: "", // 用于区分是哪个电话 | 
 |  |  |       // 已有数据... | 
 |  |  |       callStatus: "idle", // idle, calling, connected, ended, failed | 
 |  |  |       isEndingCall: false, | 
 |  |  |       currentCall: null, // 当前通话对象 | 
 |  |  |       input: "今天身体还不错", | 
 |  |  |       radio: "2", | 
 |  |  |       taskname: "", | 
 |  |  |       activeName: "wj", | 
 |  |  |       voice: "", | 
 |  |  |       templateid: "", | 
 |  |  |       again: "", | 
 |  |  |       zcform: {}, | 
 |  |  |       form: {}, | 
 |  |  |       tableDatatop: [], //题目表 | 
 |  |  |       voiceDatatop: [], //题目表 | 
 |  |  |       dynamicTags: [], | 
 |  |  |       isMergeMode: false, | 
 |  |  |       mergeDialogVisible: false, | 
 |  |  |       selectedServices: [], // 选中的服务列表 | 
 |  |  |       selectedTag: "", | 
 |  |  |       tagOptions: [ | 
 |  |  |         { | 
 |  |  |           value: "0", | 
 |  |  |           label: "正常", | 
 |  |  |           type: "normal", | 
 |  |  |           color: "#7ff5e1", | 
 |  |  |           description: "患者情况正常,无需特别关注", | 
 |  |  |         }, | 
 |  |  |         { | 
 |  |  |           value: "1", | 
 |  |  |           label: "异常", | 
 |  |  |           type: "abnormal", | 
 |  |  |           color: "#f75c5c", | 
 |  |  |           description: "患者存在异常情况,需要重点关注", | 
 |  |  |         }, | 
 |  |  |         { | 
 |  |  |           value: "2", | 
 |  |  |           label: "警告", | 
 |  |  |           type: "warning", | 
 |  |  |           color: "#fbfb4a", | 
 |  |  |           description: "患者情况需要警告注意,可能存在风险", | 
 |  |  |         }, | 
 |  |  |       ], | 
 |  |  |       zcrules: { | 
 |  |  |         resource: [ | 
 |  |  |           { required: true, message: "请选择随访方式", trigger: "change" }, | 
 |  |  |         ], | 
 |  |  |         date1: [{ required: true, message: "请选择随访时间", trigger: "blur" }], | 
 |  |  |       }, | 
 |  |  |       userrules: { | 
 |  |  |         telcode: [{ validator: validatePhone, trigger: "blur" }], | 
 |  |  |         relativetelcode: [{ validator: validatePhone, trigger: "blur" }], | 
 |  |  |       }, | 
 |  |  |       url: "http://9.208.2.190:8090/smartor/serviceExternal/query360PatInfo", | 
 |  |  |       postData: { | 
 |  |  |         XiaoXiTou: { | 
 |  |  |           FaSongFCSJC: "ZJHES", | 
 |  |  |           FaSongJGID: localStorage.getItem("orgid"), | 
 |  |  |           FaSongJGMC: localStorage.getItem("orgname"), | 
 |  |  |           FaSongSJ: "2025-01-09 17:29:36", | 
 |  |  |           FaSongXTJC: "SUIFANGXT", | 
 |  |  |           FaSongXTMC: "随访系统", | 
 |  |  |           XiaoXiID: "5FA92AFB-9833-4608-87C7-F56A654AC171", | 
 |  |  |           XiaoXiLX: "SC_LC_360STCX", | 
 |  |  |           XiaoXiMC: "360 视图查询", | 
 |  |  |           ZuHuID: localStorage.getItem("ZuHuID"), | 
 |  |  |           ZuHuMC: localStorage.getItem("orgname"), | 
 |  |  |         }, | 
 |  |  |         YeWuXX: { | 
 |  |  |           BingRenXX: { | 
 |  |  |             ZhengJianHM: "", | 
 |  |  |             ZhengJianLXDM: "01", | 
 |  |  |             ZhengJianLXMC: "居民身份证", | 
 |  |  |             ZuZhiJGID: localStorage.getItem("orgid"), | 
 |  |  |             ZuZhiJGMC: localStorage.getItem("orgname"), | 
 |  |  |           }, | 
 |  |  |           YongHuXX: { | 
 |  |  |             XiTongID: "SUIFANGXT", | 
 |  |  |             XiTongMC: "随访系统", | 
 |  |  |             YongHuID: "1400466972205912064", | 
 |  |  |             YongHuXM: "JNRMYY", | 
 |  |  |             ZuZhiJGID: localStorage.getItem("orgid"), | 
 |  |  |             ZuZhiJGMC: localStorage.getItem("orgname"), | 
 |  |  |             idp: "lyra", | 
 |  |  |           }, | 
 |  |  |         }, | 
 |  |  |       }, | 
 |  |  |       pickerOptions: { | 
 |  |  |         disabledDate(time) { | 
 |  |  |           // 禁用今天及之前的日期 | 
 |  |  |           return time.getTime() < Date.now() - 24 * 60 * 60 * 1000; | 
 |  |  |         }, | 
 |  |  |         shortcuts: [ | 
 |  |  |           { | 
 |  |  |             text: "七天后", | 
 |  |  |             onClick(picker) { | 
 |  |  |               const date = new Date(); | 
 |  |  |               date.setTime(date.getTime() + 3600 * 1000 * 24 * 7); | 
 |  |  |               picker.$emit("pick", date); | 
 |  |  |             }, | 
 |  |  |           }, | 
 |  |  |           { | 
 |  |  |             text: "15天后", | 
 |  |  |             onClick(picker) { | 
 |  |  |               const date = new Date(); | 
 |  |  |               date.setTime(date.getTime() + 3600 * 1000 * 24 * 15); | 
 |  |  |               picker.$emit("pick", date); | 
 |  |  |             }, | 
 |  |  |           }, | 
 |  |  |           { | 
 |  |  |             text: "一个月后", | 
 |  |  |             onClick(picker) { | 
 |  |  |               const date = new Date(); | 
 |  |  |               date.setTime(date.getTime() + 3600 * 1000 * 24 * 30); | 
 |  |  |               picker.$emit("pick", date); | 
 |  |  |             }, | 
 |  |  |           }, | 
 |  |  |           { | 
 |  |  |             text: "三个月后", | 
 |  |  |             onClick(picker) { | 
 |  |  |               const date = new Date(); | 
 |  |  |               date.setTime(date.getTime() + 3600 * 1000 * 24 * 90); | 
 |  |  |               picker.$emit("pick", date); | 
 |  |  |             }, | 
 |  |  |           }, | 
 |  |  |           { | 
 |  |  |             text: "六个月后", | 
 |  |  |             onClick(picker) { | 
 |  |  |               const date = new Date(); | 
 |  |  |               date.setTime(date.getTime() + 3600 * 1000 * 24 * 180); | 
 |  |  |               picker.$emit("pick", date); | 
 |  |  |             }, | 
 |  |  |           }, | 
 |  |  |           { | 
 |  |  |             text: "一年后", | 
 |  |  |             onClick(picker) { | 
 |  |  |               const date = new Date(); | 
 |  |  |               date.setTime(date.getTime() + 3600 * 1000 * 24 * 365); | 
 |  |  |               picker.$emit("pick", date); | 
 |  |  |             }, | 
 |  |  |           }, | 
 |  |  |         ], | 
 |  |  |       }, | 
 |  |  |       options: [ | 
 |  |  |         { | 
 |  |  |           value: "七天后", | 
 |  |  |           label: "七天后", | 
 |  |  |         }, | 
 |  |  |         { | 
 |  |  |           value: "15天后", | 
 |  |  |           label: "15天后", | 
 |  |  |         }, | 
 |  |  |         { | 
 |  |  |           value: "一个月后", | 
 |  |  |           label: "一个月后", | 
 |  |  |         }, | 
 |  |  |         { | 
 |  |  |           value: "三个月后", | 
 |  |  |           label: "三个月后", | 
 |  |  |         }, | 
 |  |  |         { | 
 |  |  |           value: "六个月后", | 
 |  |  |           label: "六个月后", | 
 |  |  |         }, | 
 |  |  |         { | 
 |  |  |           value: "一年后", | 
 |  |  |           label: "一年后", | 
 |  |  |         }, | 
 |  |  |       ], | 
 |  |  |       userform: {}, | 
 |  |  |       smsDialogVisible: false, // 控制短信对话框显示 | 
 |  |  |       smsContent: "", // 存储短信内容 | 
 |  |  |       Whetherall: true, //是否全部记录展示 | 
 |  |  |       dialogFormVisible: false, | 
 |  |  |       Voicetype: 0, //是否为语音服务 | 
 |  |  |       visitCount: null, | 
 |  |  |       logsheetlist: [], | 
 |  |  |       topicobj: {}, | 
 |  |  |       sendname: null, | 
 |  |  |       serviceType: null, | 
 |  |  |       id: null, | 
 |  |  |       taskid: null, | 
 |  |  |       patid: null, | 
 |  |  |     }; | 
 |  |  |   }, | 
 |  |  |  | 
 |  |  |   computed: { | 
 |  |  |     callStatusText() { | 
 |  |  |       const statusMap = { | 
 |  |  |         idle: "准备呼叫", | 
 |  |  |         calling: `正在呼叫 ${this.currentPhoneNumber}...`, | 
 |  |  |         connected: `已接通 ${this.currentPhoneNumber}`, | 
 |  |  |         ended: "通话已结束", | 
 |  |  |         failed: "呼叫失败", | 
 |  |  |       }; | 
 |  |  |       return statusMap[this.callStatus]; | 
 |  |  |     }, | 
 |  |  |     callStatusType() { | 
 |  |  |       const typeMap = { | 
 |  |  |         idle: "info", | 
 |  |  |         calling: "warning", | 
 |  |  |         connected: "success", | 
 |  |  |         ended: "info", | 
 |  |  |         failed: "error", | 
 |  |  |       }; | 
 |  |  |       return typeMap[this.callStatus]; | 
 |  |  |     }, | 
 |  |  |   }, | 
 |  |  |   created() { | 
 |  |  |     this.taskid = this.$route.query.taskid; | 
 |  |  |     this.id = this.$route.query.id; | 
 |  |  |     this.sendname = this.$route.query.sendname; | 
 |  |  |     this.patid = this.$route.query.patid; | 
 |  |  |     this.again = this.$route.query.again; | 
 |  |  |     this.Voicetype = this.$route.query.Voicetype; | 
 |  |  |     this.visitCount = this.$route.query.visitCount; | 
 |  |  |     this.serviceType = this.$route.query.serviceType; | 
 |  |  |     this.getsearchrResults(); | 
 |  |  |  | 
 |  |  |     this.getTaskservelist(); | 
 |  |  |   }, | 
 |  |  |  | 
 |  |  |   methods: { | 
 |  |  |     // 获取问卷数据 | 
 |  |  |     getsearchrResults() { | 
 |  |  |     getsearchrResults(id) { | 
 |  |  |       getsearchrResults({ | 
 |  |  |         taskid: this.taskid, | 
 |  |  |         patid: this.patid, | 
 |  |  |         subId: id ? id : this.id, | 
 |  |  |         isFinish: false, | 
 |  |  |       }).then((res) => { | 
 |  |  |         if (res.code === 200) { | 
 |  |  |           this.tableDatatop = res.data.scriptResult.script; | 
 |  |  |           // 针对再次随访服务进行删除结果赋值 | 
 |  |  |           if (this.again && res.data.upScriptResult) { | 
 |  |  |             res.data.upScriptResult.forEach((itemA) => { | 
 |  |  |               const itemB = res.data.scriptResult.find( | 
 |  |  |                 (item) => item.scriptContent === itemA.scriptContent | 
 |  |  |               ); | 
 |  |  |               if (itemB) { | 
 |  |  |                 itemB.scriptResult = itemA.scriptResult; | 
 |  |  |               } | 
 |  |  |             }); | 
 |  |  |           } | 
 |  |  |           this.tableDatatop = res.data.scriptResult; | 
 |  |  |  | 
 |  |  |           this.tableDatatop.forEach((item) => { | 
 |  |  |             if (item.scriptResult && item.scriptType != 2) { | 
 |  |  |               item.scriptResult = JSON.parse(item.scriptResult); | 
 |  |  |             } else if (item.scriptResult && item.scriptType == 2) { | 
 |  |  |             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.taskname = res.data.taskName; | 
 |  |  |           this.overdata(); | 
 |  |  |         } | 
 |  |  |       }); | 
 |  |  |     }, | 
 |  |  |     //患者360跳转 | 
 |  |  |     gettoken360(sfzh, drcode, drname) { | 
 |  |  |       this.$modal.msgWarning("360功能暂未开通"); | 
 |  |  |       return; // 阻止后续代码执行 | 
 |  |  |       this.postData.YeWuXX.BingRenXX.ZhengJianHM = sfzh; | 
 |  |  |       if (this.postData.XiaoXiTou.ZuHuMC == "丽水市中医院") { | 
 |  |  |         this.postData.YeWuXX.YongHuXX.YongHuID = "1400398571877961728"; | 
 |  |  |         this.postData.YeWuXX.YongHuXX.YongHuXM = "LSZYY"; | 
 |  |  |       } | 
 |  |  |       query360PatInfo(this.postData).then((res) => { | 
 |  |  |         if (res.data.url) { | 
 |  |  |           window.open(res.data.url, "_blank"); | 
 |  |  |           // this.linkUrl = res.data.url; | 
 |  |  |         } else { | 
 |  |  |           this.$modal.msgWarning("360查询无结果"); | 
 |  |  |         } | 
 |  |  |       }); | 
 |  |  |     }, | 
 |  |  |     // 获取基础信息 | 
 |  |  |     getuserinfo() { | 
 |  |  |       const queryParams = { | 
 |  |  |         pid: Number(this.patid), | 
 |  |  |         allhosp: "0", //1住院2门诊3体检4出院 | 
 |  |  |       }; | 
 |  |  |       // 患者基础信息 | 
 |  |  |       messagelistpatient(queryParams).then((response) => { | 
 |  |  |         if (response.rows[0]) { | 
 |  |  |           this.userform = response.rows[0]; | 
 |  |  |           // this.dynamicTags = response.rows[0].tagList.map(this.processElement); | 
 |  |  |         } | 
 |  |  |       }); | 
 |  |  |       listcontactinformation({ patid: this.patid }).then((response) => { | 
 |  |  |         this.tableData = response.rows; | 
 |  |  |         if (this.tableData.length) { | 
 |  |  |           this.userform.relativetelcode = this.tableData[0].contactway; | 
 |  |  |           this.userform.relation = this.tableData[0].relation; | 
 |  |  |         } | 
 |  |  |       }); | 
 |  |  |     }, | 
 |  |  |     // 再次随访时间选取 | 
 |  |  |     visitChange(value) { | 
 |  |  |       // 根据选择的随访方式设置时间 | 
 |  |  |       const now = new Date(); | 
 |  |  |       if (value.includes("七天后")) { | 
 |  |  |         this.form.date1 = new Date( | 
 |  |  |           Date.parse(this.form.endtime) + 3600 * 1000 * 24 * 7 | 
 |  |  |         ); | 
 |  |  |       } else if (value.includes("15天后")) { | 
 |  |  |         this.form.date1 = new Date( | 
 |  |  |           Date.parse(this.form.endtime) + 3600 * 1000 * 24 * 15 | 
 |  |  |         ); | 
 |  |  |       } else if (value.includes("一个月后")) { | 
 |  |  |         this.form.date1 = new Date( | 
 |  |  |           Date.parse(this.form.endtime) + 3600 * 1000 * 24 * 30 | 
 |  |  |         ); | 
 |  |  |       } else if (value.includes("三个月后")) { | 
 |  |  |         this.form.date1 = new Date( | 
 |  |  |           Date.parse(this.form.endtime) + 3600 * 1000 * 24 * 90 | 
 |  |  |         ); | 
 |  |  |       } else if (value.includes("六个月后")) { | 
 |  |  |         this.form.date1 = new Date( | 
 |  |  |           Date.parse(this.form.endtime) + 3600 * 1000 * 24 * 180 | 
 |  |  |         ); | 
 |  |  |       } else if (value.includes("一年后")) { | 
 |  |  |         this.form.date1 = new Date( | 
 |  |  |           Date.parse(this.form.endtime) + 3600 * 1000 * 24 * 365 | 
 |  |  |         ); | 
 |  |  |       } | 
 |  |  |     }, | 
 |  |  |  | 
 |  |  |     // 获取语音数据 | 
 |  |  |     getPersonVoices(id) { | 
 |  |  |       let obj = { | 
 |  |  |         taskid: this.taskid, | 
 |  |  |         patid: this.patid, | 
 |  |  |         subId: id ? id : this.id, | 
 |  |  |       }; | 
 |  |  |  | 
 |  |  |       getPersonVoices(obj).then((res) => { | 
 |  |  |         if (res.code == 200) { | 
 |  |  |           this.voiceDatatop = res.data.serviceSubtaskDetails; | 
 |  |  |           this.voice = res.data.voice; | 
 |  |  |           this.activeName = "yy"; | 
 |  |  |           this.taskname = res.data.taskName; | 
 |  |  |           // 问卷展示数据处理 | 
 |  |  |           this.tableDatatop = res.data.filteredDetails; | 
 |  |  |           this.tableDatatop.forEach((item) => { | 
 |  |  |             if (item.targetvalue) { | 
 |  |  |               item.scriptResult = item.targetvalue.split("&"); | 
 |  |  |             } else { | 
 |  |  |               item.scriptResult = []; | 
 |  |  |             } | 
 |  |  |           }); | 
 |  |  |  | 
 |  |  |           if (!this.tableDatatop.length) { | 
 |  |  |             this.puttaskid(this.templateid); | 
 |  |  |           } | 
 |  |  |         } | 
 |  |  |       }); | 
 |  |  |     }, | 
 |  |  |     // 获取问卷完整数据比对 | 
 |  |  |     puttaskid(id) { | 
 |  |  |       getTaskFollowup(id).then((res) => { | 
 |  |  |         if (res.code == 200) { | 
 |  |  |           this.tableDatatop = res.data.ivrTaskTemplateScriptVOList; | 
 |  |  |           this.tableDatatop.forEach((item) => { | 
 |  |  |             item.id = null; | 
 |  |  |             // 类型判断赋值 | 
 |  |  |             if (item.ivrTaskScriptTargetoptionList) { | 
 |  |  |               item.targetvalue = 1; | 
 |  |  |               item.questiontext = item.scriptContent; | 
 |  |  |               item.targetvalue = item.ivrTaskScriptTargetoptionList | 
 |  |  |                 .map((obj) => obj.targetvalue) | 
 |  |  |                 .join("&"); | 
 |  |  |             } | 
 |  |  |             if (item.targetvalue) { | 
 |  |  |               item.scriptResult = item.targetvalue.split("&"); | 
 |  |  |             } else { | 
 |  |  |               item.scriptResult = []; | 
 |  |  |             } | 
 |  |  |           }); | 
 |  |  |         } | 
 |  |  |       }); | 
 |  |  |     }, | 
 |  |  |     // 医护人员存储数据 | 
 |  |  |     getdetail() { | 
 |  |  |       let excep = ""; | 
 |  |  |       const promises = []; | 
 |  |  |       this.tableDatatop.forEach((item) => { | 
 |  |  |         if (item.valueType == 3 && item.scriptResult) { | 
 |  |  |           // 验证是否为有效数字 | 
 |  |  |           if (!/^\d+$/.test(item.scriptResult)) { | 
 |  |  |             this.$message.error(`问题 "${item.scriptContent}" 必须输入数字`); | 
 |  |  |             return; | 
 |  |  |           } | 
 |  |  |         } | 
 |  |  |         var objs = item.svyLibTemplateTargetoptions.find( | 
 |  |  |           (items) => items.optioncontent == item.scriptResult | 
 |  |  |         ); | 
 |  |  |         if (obj) { | 
 |  |  |           if (objs.isabnormal) { | 
 |  |  |             excep = 1; | 
 |  |  |           } | 
 |  |  |         } | 
 |  |  |         let obj = { | 
 |  |  |           asrtext: null, | 
 |  |  |           patid: this.patid, | 
 |  |  |           subId: this.id, | 
 |  |  |           taskid: this.taskid, | 
 |  |  |           scriptid: item.id, | 
 |  |  |           excep: excep, | 
 |  |  |           questiontext: item.scriptContent, | 
 |  |  |           answerps: item.answerps || null, // 添加附加信息 | 
 |  |  |         }; | 
 |  |  |         if (item.scriptType == 2 && item.scriptResult[0]) { | 
 |  |  |           obj.asrtext = item.scriptResult.join("&"); | 
 |  |  |         } else if (item.scriptType != 2 && item.scriptResult) { | 
 |  |  |           obj.asrtext = item.scriptResult; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         if (item.isoption == 3) { | 
 |  |  |           promises.push(serviceSubtaskDetailedit(obj)); | 
 |  |  |         } else { | 
 |  |  |           promises.push(serviceSubtaskDetailadd(obj)); | 
 |  |  |         } | 
 |  |  |       }); | 
 |  |  |  | 
 |  |  |       // 使用 Promise.all 等待所有异步操作完成 | 
 |  |  |       Promise.all(promises) | 
 |  |  |         .then((results) => { | 
 |  |  |           // 所有异步操作成功完成后的逻辑 | 
 |  |  |           results.forEach((res) => { | 
 |  |  |             if (res.code !== 200) { | 
 |  |  |               this.$modal.error("修改失败"); | 
 |  |  |             } | 
 |  |  |           }); | 
 |  |  |           this.Editsingletasksonyic(6); | 
 |  |  |  | 
 |  |  |           this.$modal | 
 |  |  |             .confirm( | 
 |  |  |               '任务保存成功是否针对患者:"' + | 
 |  |  |                 this.logsheetlist[0].sendname + | 
 |  |  |                 '"再次随访?', | 
 |  |  |               "确认", | 
 |  |  |               { | 
 |  |  |                 confirmButtonText: "确定", | 
 |  |  |                 cancelButtonText: "取消", | 
 |  |  |                 showCancelButton: true, | 
 |  |  |                 dangerouslyUseHTMLString: true, | 
 |  |  |                 confirmButtonClass: "custom-confirm-button", // 自定义确认按钮的类名 | 
 |  |  |                 cancelButtonClass: "custom-cancel-button", // 自定义取消按钮的类名 | 
 |  |  |               } | 
 |  |  |             ) | 
 |  |  |             .then(() => { | 
 |  |  |               document.querySelector("#app").scrollTo(0, 0); | 
 |  |  |               this.formtidy(); | 
 |  |  |               this.dialogFormVisible = true; | 
 |  |  |             }) | 
 |  |  |             .catch(() => { | 
 |  |  |               if (this.form.serviceType == 13) { | 
 |  |  |                 if (this.visitCount != 1) { | 
 |  |  |                   this.$router.push({ | 
 |  |  |                     path: "/logisticsservice/zbAgain", | 
 |  |  |                   }); | 
 |  |  |                 } else { | 
 |  |  |                   this.$router.push({ | 
 |  |  |                     path: "/logisticsservice/record", | 
 |  |  |                   }); | 
 |  |  |                 } | 
 |  |  |               } else if (this.form.serviceType == 2) { | 
 |  |  |                 if (this.visitCount != 1) { | 
 |  |  |                   this.$router.push({ | 
 |  |  |                     path: "/logisticsservice/again", | 
 |  |  |                   }); | 
 |  |  |                 } else { | 
 |  |  |                   this.$router.push({ | 
 |  |  |                     path: "/followvisit/discharge", | 
 |  |  |                   }); | 
 |  |  |                 } | 
 |  |  |               } | 
 |  |  |             }); | 
 |  |  |         }) | 
 |  |  |         .catch((error) => { | 
 |  |  |           // 如果有任何一个异步操作失败,会进入这里 | 
 |  |  |           console.error("发生错误:", error); | 
 |  |  |         }); | 
 |  |  |     }, | 
 |  |  |     // 电话============================ | 
 |  |  |     // 验证电话号码格式并返回错误信息 | 
 |  |  |     validatePhoneNumber(phone) { | 
 |  |  |       if (!phone) { | 
 |  |  |         return { isValid: false, message: "请输入电话号码" }; | 
 |  |  |       } | 
 |  |  |  | 
 |  |  |       // 手机号正则 | 
 |  |  |       const mobileRegex = /^1[3-9]\d{9}$/; | 
 |  |  |  | 
 |  |  |       // 带区号的固定电话(完整格式) | 
 |  |  |       const landlineFullRegex = /^0\d{2,3}-?\d{7,8}$/; | 
 |  |  |  | 
 |  |  |       // 不带区号的固定电话(仅本地号码) | 
 |  |  |       const landlineLocalRegex = /^\d{7,8}$/; | 
 |  |  |  | 
 |  |  |       if (mobileRegex.test(phone)) { | 
 |  |  |         return { isValid: true, type: "mobile" }; | 
 |  |  |       } else if (landlineFullRegex.test(phone)) { | 
 |  |  |         return { isValid: true, type: "landline" }; | 
 |  |  |       } else if (landlineLocalRegex.test(phone)) { | 
 |  |  |         return { | 
 |  |  |           isValid: false, | 
 |  |  |           message: "本地号码请添加区号(如028-1234567)", | 
 |  |  |         }; | 
 |  |  |       } else { | 
 |  |  |         return { | 
 |  |  |           isValid: false, | 
 |  |  |           message: "请输入正确的电话号码(手机号或带区号的固定电话)", | 
 |  |  |         }; | 
 |  |  |       } | 
 |  |  |     }, | 
 |  |  |     // 使用示例 | 
 |  |  |     isValidPhone(phone) { | 
 |  |  |       return this.validatePhoneNumber(phone).isValid; | 
 |  |  |     }, | 
 |  |  |     handleCall(phone, type) { | 
 |  |  |       if (!this.isValidPhone(phone)) { | 
 |  |  |         this.$message.error("请输入正确的手机号码"); | 
 |  |  |         return; | 
 |  |  |       } | 
 |  |  |  | 
 |  |  |       this.currentPhoneNumber = phone; | 
 |  |  |       this.callType = type; | 
 |  |  |       this.callStatus = "calling"; | 
 |  |  |  | 
 |  |  |       this.$nextTick(() => { | 
 |  |  |         this.$refs.callButton.startCall(); | 
 |  |  |  | 
 |  |  |         // 监听通话状态变化 | 
 |  |  |         this.$refs.callButton.$on("call-status-change", (status) => { | 
 |  |  |           this.handleCallStatusChange(status); | 
 |  |  |         }); | 
 |  |  |       }); | 
 |  |  |     }, | 
 |  |  |     // 处理通话状态变化 | 
 |  |  |     handleCallStatusChange(status) { | 
 |  |  |       console.log(status, "status"); | 
 |  |  |  | 
 |  |  |       this.callStatus = status.type; | 
 |  |  |  | 
 |  |  |       if (status.type === "connected") { | 
 |  |  |         this.currentCall = { | 
 |  |  |           phone: this.currentPhoneNumber, | 
 |  |  |           type: this.callType, | 
 |  |  |           startTime: new Date(), | 
 |  |  |         }; | 
 |  |  |       } else if (status.type === "ended" || status.type === "failed") { | 
 |  |  |         this.currentCall = null; | 
 |  |  |       } | 
 |  |  |  | 
 |  |  |       // 可以根据状态执行其他操作 | 
 |  |  |       if (status.type === "failed") { | 
 |  |  |         this.$message.error(`呼叫失败: ${status.text}`); | 
 |  |  |       } | 
 |  |  |     }, | 
 |  |  |     // 结束当前通话 | 
 |  |  |     endCurrentCall() { | 
 |  |  |       if (!this.currentCall) return; | 
 |  |  |  | 
 |  |  |       this.isEndingCall = true; | 
 |  |  |       this.$refs.callButton.endCall(); | 
 |  |  |  | 
 |  |  |       // 3秒后重置状态 | 
 |  |  |       setTimeout(() => { | 
 |  |  |         this.isEndingCall = false; | 
 |  |  |       }, 3000); | 
 |  |  |     }, | 
 |  |  |     yuyingetdetail() { | 
 |  |  |       this.tableDatatop.forEach((item, index) => { | 
 |  |  |         item.scriptResult = item.scriptResult.join("&"); | 
 |  |  |         item.templatequestionnum = index + 1; | 
 |  |  |         item.subId = this.id; | 
 |  |  |         item.taskid = this.taskid; | 
 |  |  |         item.asrtext = item.matchedtext; | 
 |  |  |         if (!item.id) { | 
 |  |  |           item.isoperation = 1; | 
 |  |  |         } | 
 |  |  |         item.patid = this.patid; | 
 |  |  |         item.templateid = item.templateID; | 
 |  |  |       }); | 
 |  |  |       let obj = { | 
 |  |  |         serviceSubtaskDetailList: this.tableDatatop, | 
 |  |  |         param1: this.taskid, | 
 |  |  |         param2: this.patid, | 
 |  |  |         subId: this.id, | 
 |  |  |       }; | 
 |  |  |  | 
 |  |  |       addPersonVoices(obj).then((res) => { | 
 |  |  |         if (res.code == 200) { | 
 |  |  |           this.$modal.msgSuccess("服务保存成功"); | 
 |  |  |           this.$modal | 
 |  |  |             .confirm( | 
 |  |  |               '任务保存成功是否针对患者:"' + | 
 |  |  |                 this.userform.name + | 
 |  |  |                 '"再次随访?', | 
 |  |  |               "确认", | 
 |  |  |               { | 
 |  |  |                 confirmButtonText: "确定", | 
 |  |  |                 cancelButtonText: "取消", | 
 |  |  |                 showCancelButton: true, | 
 |  |  |                 dangerouslyUseHTMLString: true, | 
 |  |  |                 confirmButtonClass: "custom-confirm-button", // 自定义确认按钮的类名 | 
 |  |  |                 cancelButtonClass: "custom-cancel-button", // 自定义取消按钮的类名 | 
 |  |  |               } | 
 |  |  |             ) | 
 |  |  |             .then(() => { | 
 |  |  |               document.querySelector("#app").scrollTo(0, 0); | 
 |  |  |               this.formtidy(); | 
 |  |  |               this.dialogFormVisible = true; | 
 |  |  |             }) | 
 |  |  |             .catch(() => { | 
 |  |  |               if (this.form.serviceType == 13) { | 
 |  |  |                 if (this.visitCount != 1) { | 
 |  |  |                   this.$router.push({ | 
 |  |  |                     path: "/logisticsservice/zbAgain", | 
 |  |  |                   }); | 
 |  |  |                 } else { | 
 |  |  |                   this.$router.push({ | 
 |  |  |                     path: "/logisticsservice/record", | 
 |  |  |                   }); | 
 |  |  |                 } | 
 |  |  |               } else if (form.serviceType == 2) { | 
 |  |  |                 if (this.visitCount != 1) { | 
 |  |  |                   this.$router.push({ | 
 |  |  |                     path: "/followvisit/again", | 
 |  |  |                   }); | 
 |  |  |                 } else { | 
 |  |  |                   this.$router.push({ | 
 |  |  |                     path: "/followvisit/discharge", | 
 |  |  |                   }); | 
 |  |  |                 } | 
 |  |  |               } | 
 |  |  |             }); | 
 |  |  |         } | 
 |  |  |       }); | 
 |  |  |     }, | 
 |  |  |     // 再次随访数据更替 | 
 |  |  |     formtidy() { | 
 |  |  |       this.form.visitType2 = this.form.visitType; | 
 |  |  |       this.form.date2 = this.form.longSendTime; | 
 |  |  |       this.form.remark2 = this.form.remark; | 
 |  |  |     }, | 
 |  |  |     // 获取患者记录 | 
 |  |  |     getTaskservelist() { | 
 |  |  |     getTaskservelist(id) { | 
 |  |  |       if (id) { | 
 |  |  |         this.Whetherall = false; | 
 |  |  |       } else { | 
 |  |  |         this.Whetherall = true; | 
 |  |  |       } | 
 |  |  |  | 
 |  |  |       getTaskservelist({ | 
 |  |  |         patid: this.patid, | 
 |  |  |         subId: id, | 
 |  |  |       }).then((res) => { | 
 |  |  |         if (res.code == 200) { | 
 |  |  |           this.logsheetlist = res.rows; | 
 |  |  |           this.form = res.rows[0].serviceSubtaskList.find( | 
 |  |  |             (item) => item.id == this.id | 
 |  |  |           ); | 
 |  |  |           console.log(this.form.serviceType, "serviceType"); | 
 |  |  |  | 
 |  |  |           this.logsheetlist = res.rows[0].serviceSubtaskList; | 
 |  |  |           this.templateid = this.logsheetlist[0].templateid; | 
 |  |  |           this.selectedTag = this.logsheetlist[0].excep; | 
 |  |  |           const targetDate = new Date(this.form.longSendTime); // 目标日期 | 
 |  |  |           const now = new Date(); // 当前时间 | 
 |  |  |           if (now < targetDate && this.form.sendstate == 2) { | 
 |  |  |             this.$confirm("当前服务未到发送时间请谨慎修改", "提示", { | 
 |  |  |               confirmButtonText: "确定", | 
 |  |  |               cancelButtonText: "取消", | 
 |  |  |               type: "warning", | 
 |  |  |             }) | 
 |  |  |               .then(() => {}) | 
 |  |  |               .catch(() => {}); | 
 |  |  |           } | 
 |  |  |           this.getuserinfo(); | 
 |  |  |         } | 
 |  |  |         if (this.Voicetype) { | 
 |  |  |           this.getPersonVoices(); | 
 |  |  |         } else { | 
 |  |  |           this.getsearchrResults(); | 
 |  |  |         } | 
 |  |  |       }); | 
 |  |  |     }, | 
 |  |  |     Seedetails() {}, | 
 |  |  |     // 调起短信发送对话框 | 
 |  |  |     sendAgainmsg() { | 
 |  |  |       this.smsDialogVisible = true; | 
 |  |  |       // 可以在这里初始化 smsContent,例如 this.smsContent = ''; | 
 |  |  |     }, | 
 |  |  |  | 
 |  |  |     // 发送短信的方法 | 
 |  |  |     sendSms() { | 
 |  |  |       // 这里调用你的短信发送 API | 
 |  |  |       // 假设 API 为 sendMsg,参数可能需要根据实际情况调整 | 
 |  |  |       sendMsg({ | 
 |  |  |         phone: this.userform.telcode, // 确保电话号码字段正确 | 
 |  |  |         content: this.smsContent, | 
 |  |  |       }) | 
 |  |  |         .then((res) => { | 
 |  |  |           if (res.code == 200) { | 
 |  |  |             this.$modal.msgSuccess("发送成功"); | 
 |  |  |             this.smsDialogVisible = false; // 关闭对话框 | 
 |  |  |             this.smsContent = ""; // 清空内容 | 
 |  |  |           } else { | 
 |  |  |             this.$modal.msgError("发送失败"); | 
 |  |  |           } | 
 |  |  |         }) | 
 |  |  |         .catch((error) => { | 
 |  |  |           console.error("发送短信失败:", error); | 
 |  |  |           this.$modal.msgError("发送失败"); | 
 |  |  |         }); | 
 |  |  |     }, | 
 |  |  |     Editsingletaskson(son) { | 
 |  |  |       let objson = {}; | 
 |  |  |       getTaskservelist({ | 
 |  |  |         patid: this.patid, | 
 |  |  |         subId: this.id, | 
 |  |  |       }).then((res) => { | 
 |  |  |         if (res.code == 200) { | 
 |  |  |           objson = res.rows[0].serviceSubtaskList[0]; | 
 |  |  |           objson.suggest = son; | 
 |  |  |           Editsingletaskson(objson).then((res) => { | 
 |  |  |             if (res.code) { | 
 |  |  |               this.$modal.msgSuccess("服务记录成功"); | 
 |  |  |               this.getTaskservelist(); | 
 |  |  |             } | 
 |  |  |           }); | 
 |  |  |         } | 
 |  |  |       }); | 
 |  |  |     }, | 
 |  |  |     Editsingletasksonyic(sendstate) { | 
 |  |  |       let objson = {}; | 
 |  |  |       getTaskservelist({ | 
 |  |  |         patid: this.patid, | 
 |  |  |         subId: this.id, | 
 |  |  |       }).then((res) => { | 
 |  |  |         if (res.code == 200) { | 
 |  |  |           objson = res.rows[0].serviceSubtaskList.find( | 
 |  |  |             (item) => item.id == this.id | 
 |  |  |           ); | 
 |  |  |           objson.remark = this.form.remark; | 
 |  |  |           objson.excep = this.selectedTag; | 
 |  |  |           if (sendstate) objson.sendstate = sendstate; | 
 |  |  |           Editsingletaskson(objson).then((res) => { | 
 |  |  |             if (res.code) { | 
 |  |  |               this.$modal.msgSuccess("服务修改成功"); | 
 |  |  |               alterpatient(this.userform).then((res) => { | 
 |  |  |                 if (res.code == 200) { | 
 |  |  |                   this.$modal.msgSuccess("基础信息保存成功"); | 
 |  |  |                 } else { | 
 |  |  |                   this.$modal.msgError("基础信息修改失败"); | 
 |  |  |                 } | 
 |  |  |               }); | 
 |  |  |               this.getTaskservelist(); | 
 |  |  |             } | 
 |  |  |           }); | 
 |  |  |         } | 
 |  |  |       }); | 
 |  |  |     }, | 
 |  |  |     // 异常列渲染 | 
 |  |  |     tableRowClassName({ row, rowIndex }) { | 
 |  |  |       if (row.id == this.id) { | 
 |  |  |         return "warning-row"; | 
 |  |  |       } | 
 |  |  |       return ""; | 
 |  |  |     }, | 
 |  |  |     getSelectedTagType() { | 
 |  |  |       if (!this.selectedTag) return ""; | 
 |  |  |       const tag = this.tagOptions.find( | 
 |  |  |         (item) => item.value === this.selectedTag | 
 |  |  |       ); | 
 |  |  |       return tag ? tag.type : ""; | 
 |  |  |     }, | 
 |  |  |  | 
 |  |  |     getSelectedTagColor() { | 
 |  |  |       if (!this.selectedTag) return ""; | 
 |  |  |       const tag = this.tagOptions.find( | 
 |  |  |         (item) => item.value === this.selectedTag | 
 |  |  |       ); | 
 |  |  |       return tag ? tag.color : ""; | 
 |  |  |     }, | 
 |  |  |  | 
 |  |  |     getSelectedDescription() { | 
 |  |  |       if (!this.selectedTag) return ""; | 
 |  |  |       const tag = this.tagOptions.find( | 
 |  |  |         (item) => item.value === this.selectedTag | 
 |  |  |       ); | 
 |  |  |       return tag ? tag.description : ""; | 
 |  |  |     }, | 
 |  |  |  | 
 |  |  |     // 调起再次发送 | 
 |  |  |     sendAgain() { | 
 |  |  |       document.querySelector("#app").scrollTo(0, 0); | 
 |  |  |       // scrollTo(0, 0) | 
 |  |  |       this.formtidy(); | 
 |  |  |       this.dialogFormVisible = true; | 
 |  |  |     }, | 
 |  |  |     // 查看详情 | 
 |  |  |     Seedetails(row) { | 
 |  |  |       this.$modal | 
 |  |  |         .confirm('是否查看任务为"' + row.taskName + '"的服务详情数据?') | 
 |  |  |         .then(() => { | 
 |  |  |           if (row.preachformson) { | 
 |  |  |             if (row.preachformson.includes("3")) { | 
 |  |  |               this.Voicetype = 1; | 
 |  |  |             } | 
 |  |  |           } | 
 |  |  |           this.taskid = row.taskid; | 
 |  |  |           this.id = row.id; | 
 |  |  |           this.patid = row.patid; | 
 |  |  |           this.serviceType = row.serviceType; | 
 |  |  |           this.getTaskservelist(); | 
 |  |  |         }) | 
 |  |  |         .catch(() => {}); | 
 |  |  |     }, | 
 |  |  |     aahandleOptionChange(a, b, c) { | 
 |  |  |       const result = c.find((item) => item.optioncontent == a); | 
 |  |  |       if (result.nextQuestion == 0) { | 
 |  |  |         this.tableDatatop = this.tableDatatop.reduce((acc, item, i) => { | 
 |  |  |           acc.push(i > b ? { ...item, astrict: 1 } : item); | 
 |  |  |           return acc; | 
 |  |  |         }, []); | 
 |  |  |       } else { | 
 |  |  |         this.tableDatatop = this.tableDatatop.reduce((acc, item, i) => { | 
 |  |  |           acc.push(i > b ? { ...item, astrict: 0 } : item); | 
 |  |  |           return acc; | 
 |  |  |         }, []); | 
 |  |  |       } | 
 |  |  |       if (this.Voicetype) { | 
 |  |  |         var obj = this.tableDatatop[b].ivrTaskScriptTargetoptionList.find( | 
 |  |  |           (item) => item.optioncontent == a | 
 |  |  |         ); | 
 |  |  |       } else { | 
 |  |  |         var obj = this.tableDatatop[b].svyLibTemplateTargetoptions.find( | 
 |  |  |           (item) => item.optioncontent == a | 
 |  |  |         ); | 
 |  |  |       } | 
 |  |  |       if (obj.isabnormal) { | 
 |  |  |         this.tableDatatop[b].isabnormal = true; | 
 |  |  |       } else { | 
 |  |  |         this.tableDatatop[b].isabnormal = false; | 
 |  |  |       } | 
 |  |  |       this.$forceUpdate(); | 
 |  |  |     }, | 
 |  |  |     // 在methods部分,修改handleOptionChange方法: | 
 |  |  |     handleOptionChange(selectedOption, questionIndex, options, a) { | 
 |  |  |       if (document.activeElement) { | 
 |  |  |         document.activeElement.blur(); | 
 |  |  |       } | 
 |  |  |  | 
 |  |  |       // 找到被选中的选项对象 | 
 |  |  |       const selectedOptionObj = options.find( | 
 |  |  |         (item) => item.optioncontent == selectedOption | 
 |  |  |       ); | 
 |  |  |  | 
 |  |  |       // 处理异常状态高亮 | 
 |  |  |       this.tableDatatop[questionIndex].isabnormal = | 
 |  |  |         !!selectedOptionObj.isabnormal; | 
 |  |  |       // 处理附加输入框显示 | 
 |  |  |  | 
 |  |  |       this.tableDatatop[questionIndex].showAppendInput = | 
 |  |  |         selectedOptionObj.appendflag == 1; | 
 |  |  |       console.log(this.tableDatatop); | 
 |  |  |  | 
 |  |  |       // if (!this.tableDatatop[questionIndex].showAppendInput) { | 
 |  |  |       //   this.tableDatatop[questionIndex].answerps = ""; // 清除附加信息 | 
 |  |  |       // } | 
 |  |  |       // 保存当前题目之前已经隐藏的题目状态 | 
 |  |  |       const previouslyHiddenBeforeCurrent = this.tableDatatop | 
 |  |  |         .slice(0, questionIndex) | 
 |  |  |         .map((item, index) => (item.astrict ? index : -1)) | 
 |  |  |         .filter((index) => index !== -1); | 
 |  |  |  | 
 |  |  |       // 保存之前因nextQuestion=0而隐藏的题目范围 | 
 |  |  |       const previouslyHiddenByEnd = this.tableDatatop | 
 |  |  |         .map((item, index) => (item.hiddenByEnd ? index : -1)) | 
 |  |  |         .filter((index) => index !== -1); | 
 |  |  |  | 
 |  |  |       // 如果branchFlag为1,处理题目跳转 | 
 |  |  |       if (a.branchFlag == 1) { | 
 |  |  |         if (selectedOptionObj.nextQuestion == 0) { | 
 |  |  |           // 结束问答 - 隐藏后面所有题目并标记 | 
 |  |  |           this.tableDatatop = this.tableDatatop.map((item, index) => ({ | 
 |  |  |             ...item, | 
 |  |  |             astrict: index > questionIndex, | 
 |  |  |             hiddenByEnd: index > questionIndex, // 标记这些题目是被结束问答隐藏的 | 
 |  |  |           })); | 
 |  |  |         } else { | 
 |  |  |           // 正常跳转逻辑 | 
 |  |  |           const nextQuestionIndex = selectedOptionObj.nextQuestion - 1; | 
 |  |  |  | 
 |  |  |           this.tableDatatop = this.tableDatatop.map((item, index) => { | 
 |  |  |             // 保留当前题目之前的隐藏状态 | 
 |  |  |             if (index < questionIndex) { | 
 |  |  |               return { | 
 |  |  |                 ...item, | 
 |  |  |                 astrict: previouslyHiddenBeforeCurrent.includes(index), | 
 |  |  |                 hiddenByEnd: false, // 清除结束标记 | 
 |  |  |               }; | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             // 当前题目总是可见 | 
 |  |  |             if (index === questionIndex) { | 
 |  |  |               return { ...item, astrict: 0, hiddenByEnd: false }; | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             // 显示目标下一题 | 
 |  |  |             if (index === nextQuestionIndex) { | 
 |  |  |               return { ...item, astrict: 0, hiddenByEnd: false }; | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             // 如果是之前被结束问答隐藏的题目,现在应该恢复显示 | 
 |  |  |             if (item.hiddenByEnd) { | 
 |  |  |               return { ...item, astrict: 0, hiddenByEnd: false }; | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             // 隐藏当前题和目标题之间的题目 | 
 |  |  |             if (index > questionIndex && index < nextQuestionIndex) { | 
 |  |  |               return { ...item, astrict: 1, hiddenByEnd: false }; | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             // 其他情况保持原状 | 
 |  |  |             return item; | 
 |  |  |           }); | 
 |  |  |         } | 
 |  |  |       } else { | 
 |  |  |         // 如果没有跳转,只需确保下一题可见 | 
 |  |  |         this.tableDatatop = this.tableDatatop.map((item, index) => ({ | 
 |  |  |           ...item, | 
 |  |  |           astrict: index === questionIndex + 1 ? 0 : item.astrict, | 
 |  |  |           hiddenByEnd: index === questionIndex + 1 ? false : item.hiddenByEnd, | 
 |  |  |         })); | 
 |  |  |       } | 
 |  |  |  | 
 |  |  |       this.$forceUpdate(); | 
 |  |  |     }, | 
 |  |  |     overdata() { | 
 |  |  |       this.tableDatatop.forEach((item, index) => { | 
 |  |  |         var obj = item.svyLibTemplateTargetoptions.find( | 
 |  |  |           (items) => items.optioncontent == item.scriptResult | 
 |  |  |         ); | 
 |  |  |         if (obj) { | 
 |  |  |           if (obj.isabnormal) { | 
 |  |  |             this.tableDatatop[index].isabnormal = true; | 
 |  |  |           } else { | 
 |  |  |             this.tableDatatop[index].isabnormal = false; | 
 |  |  |           } | 
 |  |  |           this.$forceUpdate(); | 
 |  |  |         } | 
 |  |  |       }); | 
 |  |  |     }, | 
 |  |  |     // 创建再次随访服务 | 
 |  |  |     setupsubtask() { | 
 |  |  |       this.$refs["zcform"].validate((valid) => { | 
 |  |  |         if (valid) { | 
 |  |  |           if (this.form.date1 && new Date(this.form.date1) < new Date()) { | 
 |  |  |             this.$message.error("随访时间不能小于当前时间"); | 
 |  |  |             return false; | 
 |  |  |           } | 
 |  |  |           this.form.remark = | 
 |  |  |             this.form.remark + "【" + this.getCurrentTime() + "】"; | 
 |  |  |           let form = structuredClone(this.form); | 
 |  |  |           form.longSendTime = this.formatTime(form.date1); | 
 |  |  |           form.finishtime = ""; | 
 |  |  |           if (form.resource) { | 
 |  |  |             if (form.resource == 2) { | 
 |  |  |               form.visitDeptCode = localStorage.getItem("deptCode"); | 
 |  |  |               form.visitDeptName = "随访中心"; | 
 |  |  |             } else { | 
 |  |  |               form.visitDeptCode = form.deptcode; | 
 |  |  |               form.visitDeptName = form.deptname; | 
 |  |  |             } | 
 |  |  |           } else { | 
 |  |  |             this.$modal.msgError("未选择随访方式"); | 
 |  |  |             return; | 
 |  |  |           } | 
 |  |  |           // form.id = null; | 
 |  |  |           form.sendstate = 2; | 
 |  |  |           console.log(form.serviceType, "form.serviceType"); | 
 |  |  |  | 
 |  |  |           addserviceSubtask(form).then((res) => { | 
 |  |  |             if (res.code == 200) { | 
 |  |  |               this.$modal.msgSuccess("创建成功"); | 
 |  |  |               if (form.serviceType == 13) { | 
 |  |  |                 this.$router.push({ | 
 |  |  |                   path: "/logisticsservice/zbAgain", | 
 |  |  |                 }); | 
 |  |  |               } else if (form.serviceType == 2) { | 
 |  |  |                 this.$router.push({ | 
 |  |  |                   path: "/logisticsservice/again", | 
 |  |  |                 }); | 
 |  |  |               } | 
 |  |  |             } else { | 
 |  |  |               this.$modal.msgError("创建失败"); | 
 |  |  |             } | 
 |  |  |             document.querySelector("#app").scrollTo(0, 0); | 
 |  |  |             this.dialogFormVisible = false; | 
 |  |  |           }); | 
 |  |  |         } | 
 |  |  |       }); | 
 |  |  |     }, | 
 |  |  |     getCurrentTime() { | 
 |  |  |       const now = new Date(); | 
 |  |  |       const year = now.getFullYear(); | 
 |  |  |       const month = String(now.getMonth() + 1).padStart(2, "0"); | 
 |  |  |       const day = String(now.getDate()).padStart(2, "0"); | 
 |  |  |       const hours = String(now.getHours()).padStart(2, "0"); | 
 |  |  |       const minutes = String(now.getMinutes()).padStart(2, "0"); | 
 |  |  |       const seconds = String(now.getSeconds()).padStart(2, "0"); | 
 |  |  |  | 
 |  |  |       return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`; | 
 |  |  |     }, | 
 |  |  |     updateScore(a, b, c) {}, | 
 |  |  |     // 合并修改相关============================= | 
 |  |  |     toggleMergeMode() { | 
 |  |  |       this.isMergeMode = !this.isMergeMode; | 
 |  |  |       if (!this.isMergeMode) { | 
 |  |  |         this.selectedServices = []; | 
 |  |  |       } | 
 |  |  |     }, | 
 |  |  |  | 
 |  |  |     handleSelectionChange(selection) { | 
 |  |  |       this.selectedServices = selection | 
 |  |  |         .filter( | 
 |  |  |           (item) => !item.preachformson || !item.preachformson.includes("3") | 
 |  |  |         ) | 
 |  |  |         .map((item) => ({ | 
 |  |  |           id: item.id, | 
 |  |  |           taskid: item.taskid, | 
 |  |  |           taskName: item.taskName, | 
 |  |  |           sendname: item.sendname, | 
 |  |  |         })); | 
 |  |  |     }, | 
 |  |  |     checkSelectable(row, index) { | 
 |  |  |       // 当 sendstate 为 6 时不可选 | 
 |  |  |       return row.sendstate !== 6; | 
 |  |  |     }, | 
 |  |  |     openMergeDialog() { | 
 |  |  |       if (this.selectedServices.length < 2) { | 
 |  |  |         this.$message.warning("请至少选择2个问卷服务进行合并"); | 
 |  |  |         return; | 
 |  |  |       } | 
 |  |  |       this.mergeDialogVisible = true; | 
 |  |  |     }, | 
 |  |  |  | 
 |  |  |     handleMergeSave(mergedData) { | 
 |  |  |       // 处理合并保存逻辑 | 
 |  |  |       this.mergeDialogVisible = false; | 
 |  |  |       this.isMergeMode = false; | 
 |  |  |       this.selectedServices = []; | 
 |  |  |  | 
 |  |  |       // 显示保存结果 | 
 |  |  |       if (mergedData.successCount == mergedData.totalCount) { | 
 |  |  |         this.$message.success(`成功保存 ${mergedData.successCount} 个问卷`); | 
 |  |  |       } else if (mergedData.successCount > 0) { | 
 |  |  |         this.$message.warning( | 
 |  |  |           `成功保存 ${mergedData.successCount} 个问卷,失败 ${ | 
 |  |  |             mergedData.totalCount - mergedData.successCount | 
 |  |  |           } 个` | 
 |  |  |         ); | 
 |  |  |       } else { | 
 |  |  |         this.$message.error("所有问卷保存失败"); | 
 |  |  |       } | 
 |  |  |  | 
 |  |  |       // 刷新数据 | 
 |  |  |       this.getTaskservelist(); | 
 |  |  |     }, | 
 |  |  |   }, | 
 |  |  | }; | 
 |  |  | </script> | 
 |  |  | 
 |  |  | <style lang="scss" scoped> | 
 |  |  | .Followupdetailspage { | 
 |  |  |   margin: 10px; | 
 |  |  |   display: flex; | 
 |  |  |   flex-direction: column; | 
 |  |  |   gap: 20px; | 
 |  |  | } | 
 |  |  |  | 
 |  |  | .action-container { | 
 |  |  |   display: flex; | 
 |  |  |   gap: 20px; | 
 |  |  |   margin: 0 10px 20px 10px; | 
 |  |  |  | 
 |  |  |   .manual-action { | 
 |  |  |     flex: 1; | 
 |  |  |     min-width: 0; | 
 |  |  |     height: 100%; /* 确保高度继承 */ | 
 |  |  |   } | 
 |  |  |  | 
 |  |  |   .call-action { | 
 |  |  |     width: 60%; | 
 |  |  |     min-width: 0; | 
 |  |  |     height: 100%; /* 确保高度继承 */ | 
 |  |  |   } | 
 |  |  | } | 
 |  |  | .numeric-input { | 
 |  |  |   position: relative; | 
 |  |  | } | 
 |  |  |  | 
 |  |  | .numeric-input::after { | 
 |  |  |   content: "只能输入数字"; | 
 |  |  |   position: absolute; | 
 |  |  |   right: 8px; | 
 |  |  |   top: 50%; | 
 |  |  |   transform: translateY(-50%); | 
 |  |  |   font-size: 12px; | 
 |  |  |   color: #999; | 
 |  |  |   background: #f5f5f5; | 
 |  |  |   padding: 2px 6px; | 
 |  |  |   border-radius: 4px; | 
 |  |  | } | 
 |  |  | .call-container { | 
 |  |  |   padding: 20px; | 
 |  |  |   background: #fff; | 
 |  |  |   border: 1px solid #dcdfe6; | 
 |  |  |   box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12), 0 0 6px 0 rgba(0, 0, 0, 0.04); | 
 |  |  |   border-radius: 4px; | 
 |  |  |   height: 100%; | 
 |  |  |  | 
 |  |  |   .call-header { | 
 |  |  |     margin-bottom: 20px; | 
 |  |  |  | 
 |  |  |     h2 { | 
 |  |  |       font-size: 20px; | 
 |  |  |       color: #333; | 
 |  |  |       margin: 0; | 
 |  |  |       padding-bottom: 10px; | 
 |  |  |       border-bottom: 1px solid #eee; | 
 |  |  |     } | 
 |  |  |   } | 
 |  |  |  | 
 |  |  |   .call-status { | 
 |  |  |     margin-bottom: 20px; | 
 |  |  |   } | 
 |  |  |  | 
 |  |  |   .hangup-btn { | 
 |  |  |     text-align: center; | 
 |  |  |     margin-top: 20px; | 
 |  |  |   } | 
 |  |  | } | 
 |  |  | .merge-controls { | 
 |  |  |   background: #f5f7fa; | 
 |  |  |   border-radius: 4px; | 
 |  |  |   margin-left: 20px; | 
 |  |  | } | 
 |  |  | .Followuserinfo { | 
 |  |  |   margin: 20px 10px; | 
 |  |  |   margin: 10px 10px 0 10px; | 
 |  |  |   align-items: center; | 
 |  |  |   padding: 30px; | 
 |  |  |   background: #ffff; | 
 |  |  |   border: 1px solid #dcdfe6; | 
 |  |  |   -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12), | 
 |  |  |     0 0 6px 0 rgba(0, 0, 0, 0.04); | 
 |  |  |   box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12), 0 0 6px 0 rgba(0, 0, 0, 0.04); | 
 |  |  |  | 
 |  |  |   .userinfo-text { | 
 |  |  |     font-size: 20px; | 
 |  |  |     margin-right: 20px; | 
 |  |  |     margin-bottom: 10px; | 
 |  |  |   } | 
 |  |  |  | 
 |  |  |   .userinfo-value { | 
 |  |  |     color: rgb(15, 139, 211); | 
 |  |  |  | 
 |  |  |     span { | 
 |  |  |       margin-right: 20px; | 
 |  |  |     } | 
 |  |  |   } | 
 |  |  | } | 
 |  |  |  | 
 |  |  | ::v-deep.el-table .warning-row { | 
 |  |  |   background: #c4e2ee; | 
 |  |  | } | 
 |  |  |  | 
 |  |  | .Followuserinfos { | 
 |  |  |   align-items: center; | 
 |  |  |   padding: 30px; | 
 |  |  |   background: #ffff; | 
 |  |  |   border: 1px solid #dcdfe6; | 
 |  |  |   box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12), 0 0 6px 0 rgba(0, 0, 0, 0.04); | 
 |  |  |   height: 100%; /* 确保高度继承 */ | 
 |  |  |   min-height: 880px; /* 最小高度与随访内容一致 */ | 
 |  |  |   display: flex; | 
 |  |  |   flex-direction: column; | 
 |  |  |  | 
 |  |  |   .userinfo-text { | 
 |  |  |     font-size: 20px; | 
 |  |  |     margin-right: 20px; | 
 |  |  |     margin-bottom: 10px; | 
 |  |  |   } | 
 |  |  |  | 
 |  |  |   .userinfo-value { | 
 |  |  |     color: rgb(15, 139, 211); | 
 |  |  |  | 
 |  |  |     span { | 
 |  |  |       margin-right: 20px; | 
 |  |  |     } | 
 |  |  |   } | 
 |  |  |  | 
 |  |  |   .el-form { | 
 |  |  |     flex: 1; | 
 |  |  |     overflow-y: auto; /* 内容超过高度时显示滚动条 */ | 
 |  |  |     max-height: calc(880px - 60px); /* 减去padding */ | 
 |  |  |     padding-right: 10px; /* 防止滚动条遮挡内容 */ | 
 |  |  |   } | 
 |  |  | } | 
 |  |  | .append-input-container { | 
 |  |  |   margin-top: 15px; | 
 |  |  |   padding: 10px; | 
 |  |  |   background-color: #f5f7fa; | 
 |  |  |   border-radius: 4px; | 
 |  |  |   border: 1px solid #dcdfe6; | 
 |  |  | } | 
 |  |  | .borderdiv { | 
 |  |  |   min-height: 60vh; | 
 |  |  |   font-size: 20px; | 
 |  |  |   padding: 30px; | 
 |  |  |  | 
 |  |  |   .title { | 
 |  |  |     font-size: 22px; | 
 |  |  |     font-weight: bold; | 
 |  |  |     margin-bottom: 20px; | 
 |  |  |     text-align: center; | 
 |  |  |   } | 
 |  |  |  | 
 |  |  |   .leftside { | 
 |  |  |     margin-bottom: 30px; | 
 |  |  |     margin: 30px 0; | 
 |  |  |  | 
 |  |  |     span { | 
 |  |  |       width: 400px; | 
 |  |  |       margin-left: 20px; | 
 |  |  | 
 |  |  |       border-radius: 10px; | 
 |  |  |     } | 
 |  |  |   } | 
 |  |  |  | 
 |  |  |   .offside { | 
 |  |  |     display: flex; | 
 |  |  |     flex-direction: row-reverse; | 
 |  |  |  | 
 |  |  |     .offside-value { | 
 |  |  |       padding: 10px; | 
 |  |  |       background: rgb(217, 173, 253); | 
 |  |  | 
 |  |  |     } | 
 |  |  |   } | 
 |  |  | } | 
 |  |  | .topic-dev[inert] { | 
 |  |  |   opacity: 0.5; | 
 |  |  |   pointer-events: none; | 
 |  |  | } | 
 |  |  | .CONTENT { | 
 |  |  |   padding: 10px; | 
 |  |  |   height: 100%; | 
 |  |  |   min-height: 660px; /* 设置最小高度 */ | 
 |  |  |  | 
 |  |  |   .title { | 
 |  |  |     font-size: 22px; | 
 |  |  |     font-weight: bold; | 
 |  |  | 
 |  |  |     text-align: center; | 
 |  |  |   } | 
 |  |  | } | 
 |  |  |  | 
 |  |  | .preview-left { | 
 |  |  |   margin: 20px; | 
 |  |  |   //   margin: 20px; | 
 |  |  |   padding: 30px; | 
 |  |  |   // background: #ffff; | 
 |  |  |   border: 1px solid #dcdfe6; | 
 |  |  |   -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12), | 
 |  |  |     0 0 6px 0 rgba(0, 0, 0, 0.04); | 
 |  |  |   box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12), 0 0 6px 0 rgba(0, 0, 0, 0.04); | 
 |  |  |   max-height: 580px; /* 设置最大高度 */ | 
 |  |  |   overflow-y: auto; /* 内容超过高度时显示滚动条 */ | 
 |  |  |  | 
 |  |  |   .topic-dev { | 
 |  |  |     margin-bottom: 25px; | 
 |  |  |     font-size: 20px !important; | 
 |  |  |  | 
 |  |  |     .dev-text { | 
 |  |  |       margin-bottom: 10px; | 
 |  |  |     } | 
 |  |  |   } | 
 |  |  | } | 
 |  |  |  | 
 |  |  | .scriptTopic-isabnormal { | 
 |  |  |   color: red; | 
 |  |  | } | 
 |  |  |  | 
 |  |  | .detailed { | 
 |  |  |   width: 88%; | 
 |  |  |   border-radius: 8px; | 
 |  |  |   padding: 30px; | 
 |  |  |   margin-bottom: 30px; | 
 |  |  |   background-color: #ddf0f8; | 
 |  |  |  | 
 |  |  |   .bg-purple { | 
 |  |  |     margin-bottom: 20px; | 
 |  |  |   } | 
 |  |  |  | 
 |  |  |   .spanvalue { | 
 |  |  |     display: inline-block; | 
 |  |  |     min-width: 200px; | 
 |  |  |     border-bottom: 1px solid rgb(172, 172, 172); | 
 |  |  |   } | 
 |  |  | } | 
 |  |  |  | 
 |  |  | .headline { | 
 |  |  |   font-size: 24px; | 
 |  |  |   height: 40px; | 
 |  |  |   border-left: 5px solid #41a1be; | 
 |  |  |   padding-left: 5px; | 
 |  |  |   margin-bottom: 10px; | 
 |  |  |   display: flex; | 
 |  |  |  | 
 |  |  |   .Add-details { | 
 |  |  |     font-size: 18px; | 
 |  |  |     color: #02a7f0; | 
 |  |  |     cursor: pointer; | 
 |  |  |   } | 
 |  |  | } | 
 |  |  |  | 
 |  |  | .red-star { | 
 |  |  |   ::v-deep.el-radio__label { | 
 |  |  |     position: relative; | 
 |  |  |     padding-right: 10px; | 
 |  |  |   } | 
 |  |  |  | 
 |  |  |   ::v-deep.el-radio__label::after { | 
 |  |  |     content: "*"; | 
 |  |  |     color: red; | 
 |  |  |     position: absolute; | 
 |  |  |     right: -5px; | 
 |  |  |     top: 0; | 
 |  |  |   } | 
 |  |  |  | 
 |  |  |   ::v-deep.el-input-group__textarea { | 
 |  |  |     white-space: pre-wrap; | 
 |  |  |     word-break: break-all; | 
 |  |  |   } | 
 |  |  |  | 
 |  |  |   ::v-deep.el-checkbox__label { | 
 |  |  |     position: relative; | 
 |  |  |     padding-right: 10px; | 
 |  |  |   } | 
 |  |  |  | 
 |  |  |   ::v-deep.el-checkbox__label::after { | 
 |  |  |     content: "*"; | 
 |  |  |     color: red; | 
 |  |  |     position: absolute; | 
 |  |  |     right: -5px; | 
 |  |  |     top: 0; | 
 |  |  |   } | 
 |  |  | } | 
 |  |  | .tag-selector-container { | 
 |  |  |   display: flex; | 
 |  |  |   align-items: center; | 
 |  |  |   margin: 0 30px; | 
 |  |  | } | 
 |  |  |  | 
 |  |  | .color-indicator { | 
 |  |  |   width: 16px; | 
 |  |  |   height: 16px; | 
 |  |  |   border-radius: 3px; | 
 |  |  |   margin-right: 8px; | 
 |  |  |   display: inline-block; | 
 |  |  | } | 
 |  |  |  | 
 |  |  | .selected-indicator { | 
 |  |  |   margin-left: 10px; | 
 |  |  |   width: 20px; | 
 |  |  |   height: 20px; | 
 |  |  | } | 
 |  |  |  | 
 |  |  | .tag-info-icon { | 
 |  |  |   margin-left: 10px; | 
 |  |  |   color: #909399; | 
 |  |  |   cursor: pointer; | 
 |  |  |   font-size: 16px; | 
 |  |  | } | 
 |  |  |  | 
 |  |  | /* 确保选择器选项中也显示颜色块 */ | 
 |  |  | .el-select-dropdown__item { | 
 |  |  |   display: flex; | 
 |  |  |   align-items: center; | 
 |  |  | } | 
 |  |  |  | 
 |  |  | .tag-normal { | 
 |  |  |   background-color: #7ff5e1; | 
 |  |  | } | 
 |  |  | .tag-abnormal { | 
 |  |  |   background-color: #f75c5c; | 
 |  |  | } | 
 |  |  | .tag-warning { | 
 |  |  |   background-color: #fbfb4a; | 
 |  |  | } | 
 |  |  |  | 
 |  |  | .tag-info { | 
 |  |  |   margin-left: 10px; | 
 |  |  |   color: #909399; | 
 |  |  |   cursor: pointer; | 
 |  |  | } | 
 |  |  | ::v-deep.offside-value .el-radio__label { | 
 |  |  |   color: #fff; | 
 |  |  | } | 
 |  |  |  | 
 |  |  | ::v-deep.el-link.el-link--default { | 
 |  |  |   color: #02a7f0 !important; | 
 |  |  | } | 
 |  |  |  | 
 |  |  | .el-message-box__btns button:nth-child(2) { | 
 |  |  |   margin-left: 10px; | 
 |  |  |   background-color: #f57676; | 
 |  |  |   border-color: #f57676; | 
 |  |  | } | 
 |  |  |  | 
 |  |  | .el-icon-phone { | 
 |  |  |   transition: all 0.3s; | 
 |  |  | } | 
 |  |  |  | 
 |  |  | .el-button[disabled] .el-icon-phone { | 
 |  |  |   color: #c0c4cc; | 
 |  |  | } | 
 |  |  |  | 
 |  |  | .el-button:not([disabled]) .el-icon-phone { | 
 |  |  |   color: #409eff; | 
 |  |  | } | 
 |  |  |  | 
 |  |  | .el-button:not([disabled]):hover .el-icon-phone { | 
 |  |  |   color: #66b1ff; | 
 |  |  |   transform: scale(1.1); | 
 |  |  | } | 
 |  |  |  | 
 |  |  | .mulsz { | 
 |  |  |   font-size: 25px; | 
 |  |  |   margin-top: 20px; | 
 |  |  | } | 
 |  |  |  | 
 |  |  | .el-input.is-disabled .el-input__inner { | 
 |  |  |   background-color: #fff; | 
 |  |  |   border-color: #dcdfe6; | 
 |  |  |   color: #080808 !important; | 
 |  |  |   cursor: not-allowed; | 
 |  |  | } | 
 |  |  |  | 
 |  |  | .el-textarea.is-disabled .el-textarea__inner { | 
 |  |  |   background-color: #fff; | 
 |  |  |   border-color: #dcdfe6; | 
 |  |  |   color: #080808 !important; | 
 |  |  |   cursor: not-allowed; | 
 |  |  | } | 
 |  |  | </style> |