|  |  |  | 
|---|
|  |  |  | <template> | 
|---|
|  |  |  | <!-- 聊连页面记录 --> | 
|---|
|  |  |  | <div class="Followupdetailspage"> | 
|---|
|  |  |  | <div class="Followupdetailspage" id="app-container"> | 
|---|
|  |  |  | <div class="Followuserinfo"> | 
|---|
|  |  |  | <div> | 
|---|
|  |  |  | <div class="userinfo-text"> | 
|---|
|  |  |  | 
|---|
|  |  |  | >查看患者全部服务</el-button | 
|---|
|  |  |  | > | 
|---|
|  |  |  | <el-button v-else type="success" @click="getTaskservelist(id)" | 
|---|
|  |  |  | >查看患者本次服务信息</el-button | 
|---|
|  |  |  | >只展示本次服务信息</el-button | 
|---|
|  |  |  | > | 
|---|
|  |  |  | </div> | 
|---|
|  |  |  | <div style="margin-left: 20px; color: #59a0f0"> | 
|---|
|  |  |  | <!-- <div style="margin-left: 20px; color: #59a0f0"> | 
|---|
|  |  |  | <el-link | 
|---|
|  |  |  | href="https://9.208.2.207:6060/search-homepage" | 
|---|
|  |  |  | target="_blank" | 
|---|
|  |  |  | 
|---|
|  |  |  | > | 
|---|
|  |  |  | 前往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="姓名" | 
|---|
|  |  |  | width="100"> | 
|---|
|  |  |  | <el-table | 
|---|
|  |  |  | :data="logsheetlist" | 
|---|
|  |  |  | :row-class-name="tableRowClassName" | 
|---|
|  |  |  | style="width: 100%" | 
|---|
|  |  |  | @selection-change="handleSelectionChange" | 
|---|
|  |  |  | > | 
|---|
|  |  |  | <el-table-column | 
|---|
|  |  |  | type="selection" | 
|---|
|  |  |  | width="55" | 
|---|
|  |  |  | :selectable="checkSelectable" | 
|---|
|  |  |  | v-if="Whetherall" | 
|---|
|  |  |  | ></el-table-column> | 
|---|
|  |  |  | <el-table-column | 
|---|
|  |  |  | prop="sendname" | 
|---|
|  |  |  | align="center" | 
|---|
|  |  |  | 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 | 
|---|
|  |  |  | prop="finishtime" | 
|---|
|  |  |  | align="center" | 
|---|
|  |  |  | label="完成时间" | 
|---|
|  |  |  | label="随访完成时间" | 
|---|
|  |  |  | width="200" | 
|---|
|  |  |  | show-overflow-tooltip | 
|---|
|  |  |  | > | 
|---|
|  |  |  | 
|---|
|  |  |  | show-overflow-tooltip | 
|---|
|  |  |  | > | 
|---|
|  |  |  | </el-table-column> | 
|---|
|  |  |  | <el-table-column | 
|---|
|  |  |  | prop="remark" | 
|---|
|  |  |  | align="center" | 
|---|
|  |  |  | label="服务记录" | 
|---|
|  |  |  | width="200" | 
|---|
|  |  |  | show-overflow-tooltip | 
|---|
|  |  |  | > | 
|---|
|  |  |  | </el-table-column> | 
|---|
|  |  |  |  | 
|---|
|  |  |  | <el-table-column | 
|---|
|  |  |  | prop="bankcardno" | 
|---|
|  |  |  | 
|---|
|  |  |  | 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 | 
|---|
|  |  |  | ></el-button | 
|---|
|  |  |  | 
|---|
|  |  |  | </el-table> | 
|---|
|  |  |  | </div> | 
|---|
|  |  |  | </div> | 
|---|
|  |  |  | <div :class="form.serviceType == 2 ? 'Followuserinfo' : 'Followuserinfos'"> | 
|---|
|  |  |  | <div> | 
|---|
|  |  |  | <el-form ref="form" :model="form" label-width="120px"> | 
|---|
|  |  |  | <!-- 添加合并编辑对话框 --> | 
|---|
|  |  |  | <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> | 
|---|
|  |  |  | <el-row :gutter="20"> | 
|---|
|  |  |  | <el-col :span="12" | 
|---|
|  |  |  | ><el-form-item label="联系电话"> | 
|---|
|  |  |  | <el-input | 
|---|
|  |  |  | disabled | 
|---|
|  |  |  | placeholder="联系电话缺失" | 
|---|
|  |  |  | v-model="userform.telcode" | 
|---|
|  |  |  | ></el-input> </el-form-item | 
|---|
|  |  |  | ></el-col> | 
|---|
|  |  |  | <el-col :span="12" | 
|---|
|  |  |  | ><el-form-item label="联系人电话"> | 
|---|
|  |  |  | <el-input | 
|---|
|  |  |  | disabled | 
|---|
|  |  |  | placeholder="联系人电话缺失" | 
|---|
|  |  |  | v-model="userform.relativetelcode" | 
|---|
|  |  |  | ></el-input> </el-form-item | 
|---|
|  |  |  | ></el-col> | 
|---|
|  |  |  | </el-row> | 
|---|
|  |  |  | <div style="margin-left: 30px"> | 
|---|
|  |  |  | <el-button type="primary" plain @click="Editsingletasksonyic">保存服务</el-button> | 
|---|
|  |  |  | <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="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" | 
|---|
|  |  |  | > | 
|---|
|  |  |  | <!-- 单选 --> | 
|---|
|  |  |  | <div | 
|---|
|  |  |  | :class=" | 
|---|
|  |  |  | item.isabnormal | 
|---|
|  |  |  | ? 'scriptTopic-isabnormal' | 
|---|
|  |  |  | : 'scriptTopic-dev' | 
|---|
|  |  |  | " | 
|---|
|  |  |  | :key="index" | 
|---|
|  |  |  | v-if="item.scriptType == 1 && !item.astrict" | 
|---|
|  |  |  | > | 
|---|
|  |  |  | <div class="dev-text"> | 
|---|
|  |  |  | {{ index + 1 }}、[单选]<span>{{ | 
|---|
|  |  |  | item.scriptContent | 
|---|
|  |  |  | }}</span> | 
|---|
|  |  |  | </div> | 
|---|
|  |  |  | <div class="dev-xx"> | 
|---|
|  |  |  | <el-radio-group | 
|---|
|  |  |  | v-model="item.scriptResult" | 
|---|
|  |  |  | @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 class="preview-left" v-else> | 
|---|
|  |  |  | <div | 
|---|
|  |  |  | class="topic-dev" | 
|---|
|  |  |  | v-for="(item, index) in tableDatatop" | 
|---|
|  |  |  | :key="item.id" | 
|---|
|  |  |  | > | 
|---|
|  |  |  | <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> | 
|---|
|  |  |  | <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-tab-pane name="yy"> | 
|---|
|  |  |  | <span class="mulsz" slot="label" | 
|---|
|  |  |  | ><i class="el-icon-headset"></i> 语音随访详情</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="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> | 
|---|
|  |  |  |  | 
|---|
|  |  |  | <el-form-item label="随访记录"> | 
|---|
|  |  |  | <el-input type="textarea" v-model="form.remark" ></el-input> | 
|---|
|  |  |  | </el-form-item> | 
|---|
|  |  |  | <!-- 当前选择的颜色指示器 --> | 
|---|
|  |  |  | <div | 
|---|
|  |  |  | v-if="selectedTag" | 
|---|
|  |  |  | class="color-indicator selected-indicator" | 
|---|
|  |  |  | :style="{ backgroundColor: getSelectedTagColor() }" | 
|---|
|  |  |  | ></div> | 
|---|
|  |  |  |  | 
|---|
|  |  |  | <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 type="danger" @click="Editsingletaskson('4')" | 
|---|
|  |  |  | >失访</el-button | 
|---|
|  |  |  | > --> | 
|---|
|  |  |  | <el-button plain type="info" @click="Editsingletaskson('5')" | 
|---|
|  |  |  | >中心随访</el-button | 
|---|
|  |  |  | > | 
|---|
|  |  |  | <el-button type="primary" round @click="sendAgain()" | 
|---|
|  |  |  | >再次随访</el-button | 
|---|
|  |  |  | > | 
|---|
|  |  |  | </div> | 
|---|
|  |  |  | </el-form-item> | 
|---|
|  |  |  | </el-form> | 
|---|
|  |  |  | <el-collapse> | 
|---|
|  |  |  | <el-collapse-item title="查看当前患者信息" name="1"> | 
|---|
|  |  |  | <!-- 标记说明提示 --> | 
|---|
|  |  |  | <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 | 
|---|
|  |  |  | placeholder="联系电话缺失" | 
|---|
|  |  |  | v-model="userform.telcode" | 
|---|
|  |  |  | > | 
|---|
|  |  |  | <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> | 
|---|
|  |  |  | <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> | 
|---|
|  |  |  | </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"> | 
|---|
|  |  |  | 
|---|
|  |  |  | 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="30" | 
|---|
|  |  |  | 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-form-item | 
|---|
|  |  |  | ></el-col> | 
|---|
|  |  |  | </el-row> | 
|---|
|  |  |  | <!-- <el-row :gutter="20"> | 
|---|
|  |  |  | <el-col :span="24"> | 
|---|
|  |  |  | <el-form-item label="标签" prop="desc"> | 
|---|
|  |  |  | <div class="xinz-inf"> | 
|---|
|  |  |  | <el-tag | 
|---|
|  |  |  | :key="tag.tagname" | 
|---|
|  |  |  | type="success" | 
|---|
|  |  |  | v-for="tag in dynamicTags" | 
|---|
|  |  |  | :disable-transitions="false" | 
|---|
|  |  |  | > | 
|---|
|  |  |  | {{ tag.tagname }} | 
|---|
|  |  |  | </el-tag> | 
|---|
|  |  |  | </div> | 
|---|
|  |  |  | </el-form-item> | 
|---|
|  |  |  | </el-col> | 
|---|
|  |  |  | </el-row> --> | 
|---|
|  |  |  | </el-form> | 
|---|
|  |  |  | </div> | 
|---|
|  |  |  | </el-collapse-item> | 
|---|
|  |  |  | </el-collapse> | 
|---|
|  |  |  | </div> | 
|---|
|  |  |  | </div> | 
|---|
|  |  |  | </div> | 
|---|
|  |  |  | </div> | 
|---|
|  |  |  | <div v-if="form.serviceType == 2"> | 
|---|
|  |  |  | <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="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" | 
|---|
|  |  |  | > | 
|---|
|  |  |  | <div | 
|---|
|  |  |  | :class=" | 
|---|
|  |  |  | item.isabnormal | 
|---|
|  |  |  | ? 'scriptTopic-isabnormal' | 
|---|
|  |  |  | : 'scriptTopic-dev' | 
|---|
|  |  |  | " | 
|---|
|  |  |  | :key="index" | 
|---|
|  |  |  | v-if="item.scriptType == 1" | 
|---|
|  |  |  | > | 
|---|
|  |  |  | <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)" | 
|---|
|  |  |  | > | 
|---|
|  |  |  | <el-radio | 
|---|
|  |  |  | v-for="( | 
|---|
|  |  |  | items, index | 
|---|
|  |  |  | ) in item.svyLibTemplateTargetoptions" | 
|---|
|  |  |  | :class="items.isabnormal ? 'red-star' : ''" | 
|---|
|  |  |  | :key="index" | 
|---|
|  |  |  | :label="items.optioncontent" | 
|---|
|  |  |  | >{{ items.optioncontent }}</el-radio | 
|---|
|  |  |  | > | 
|---|
|  |  |  | </el-radio-group> | 
|---|
|  |  |  | </div> | 
|---|
|  |  |  | <div v-show="item.prompt"> | 
|---|
|  |  |  | <el-alert :title="item.prompt" type="warning"> </el-alert> | 
|---|
|  |  |  | </div> | 
|---|
|  |  |  | </div> | 
|---|
|  |  |  | <!-- 多选 --> | 
|---|
|  |  |  | <div | 
|---|
|  |  |  | :class=" | 
|---|
|  |  |  | item.isabnormal | 
|---|
|  |  |  | ? 'scriptTopic-isabnormal' | 
|---|
|  |  |  | : '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)" | 
|---|
|  |  |  | > | 
|---|
|  |  |  | <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" | 
|---|
|  |  |  | > | 
|---|
|  |  |  | <div class="dev-text"> | 
|---|
|  |  |  | {{ index + 1 }}、[问答]<span>{{ item.scriptContent }}</span> | 
|---|
|  |  |  | </div> | 
|---|
|  |  |  | <div class="dev-xx"> | 
|---|
|  |  |  | <el-input | 
|---|
|  |  |  | type="textarea" | 
|---|
|  |  |  | :rows="2" | 
|---|
|  |  |  | placeholder="请输入答案" | 
|---|
|  |  |  | v-model="item.scriptResult" | 
|---|
|  |  |  | clearable | 
|---|
|  |  |  | > | 
|---|
|  |  |  | </el-input> | 
|---|
|  |  |  | </div> | 
|---|
|  |  |  | </div> | 
|---|
|  |  |  | </div> | 
|---|
|  |  |  | </div> | 
|---|
|  |  |  |  | 
|---|
|  |  |  | <div class="preview-left" v-else> | 
|---|
|  |  |  | <div | 
|---|
|  |  |  | class="topic-dev" | 
|---|
|  |  |  | v-for="(item, index) in tableDatatop" | 
|---|
|  |  |  | :key="item.id" | 
|---|
|  |  |  | > | 
|---|
|  |  |  | <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)" | 
|---|
|  |  |  | > | 
|---|
|  |  |  | <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.questiontext }}</span> | 
|---|
|  |  |  | </div> | 
|---|
|  |  |  | <div class="dev-xx"> | 
|---|
|  |  |  | <el-input | 
|---|
|  |  |  | type="textarea" | 
|---|
|  |  |  | :rows="2" | 
|---|
|  |  |  | placeholder="请输入答案" | 
|---|
|  |  |  | v-model="item.matchedtext" | 
|---|
|  |  |  | clearable | 
|---|
|  |  |  | > | 
|---|
|  |  |  | </el-input> | 
|---|
|  |  |  | </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-tab-pane name="yy"> | 
|---|
|  |  |  | <span class="mulsz" slot="label" | 
|---|
|  |  |  | ><i class="el-icon-headset"></i> 语音随访详情</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 : 'https://example.com/example.mp3' | 
|---|
|  |  |  | " | 
|---|
|  |  |  | ></mini-audio> | 
|---|
|  |  |  | </div> | 
|---|
|  |  |  | <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 | 
|---|
|  |  |  | : 'https://example.com/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> | 
|---|
|  |  |  | <el-dialog title="患者再次随访" :visible.sync="dialogFormVisible"> | 
|---|
|  |  |  | <el-form ref="form" :model="form" label-width="80px"> | 
|---|
|  |  |  | <!-- 短信发送对话框 --> | 
|---|
|  |  |  | <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" | 
|---|
|  |  |  | 
|---|
|  |  |  | 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-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-switch v-model="zcform.delivery"></el-switch> | 
|---|
|  |  |  | </el-form-item> --> | 
|---|
|  |  |  | <el-form-item label="随访时间"> | 
|---|
|  |  |  | <el-date-picker | 
|---|
|  |  |  | type="date" | 
|---|
|  |  |  | placeholder="选择日期" | 
|---|
|  |  |  | v-model="form.date1" | 
|---|
|  |  |  | style="width: 100%" | 
|---|
|  |  |  | ></el-date-picker> | 
|---|
|  |  |  | </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 @click="dialogFormVisible = false">取 消</el-button> | 
|---|
|  |  |  | <el-button type="warning" @click="dialogFormVisible = false" | 
|---|
|  |  |  | >取 消</el-button | 
|---|
|  |  |  | > | 
|---|
|  |  |  | <el-button type="primary" @click="setupsubtask">确认创建服务</el-button> | 
|---|
|  |  |  | </div> | 
|---|
|  |  |  | </el-dialog> | 
|---|
|  |  |  | 
|---|
|  |  |  | serviceSubtaskDetailadd, | 
|---|
|  |  |  | updatePersonVoices, | 
|---|
|  |  |  | addPersonVoices, | 
|---|
|  |  |  | query360PatInfo, | 
|---|
|  |  |  | sendMsg, | 
|---|
|  |  |  | } from "@/api/AiCentre/index"; | 
|---|
|  |  |  | import { messagelistpatient } from "@/api/patient/homepage"; | 
|---|
|  |  |  | 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 { | 
|---|
|  |  |  | 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: {}, | 
|---|
|  |  |  | Whetherall: false, //是否全部记录展示 | 
|---|
|  |  |  | smsDialogVisible: false, // 控制短信对话框显示 | 
|---|
|  |  |  | smsContent: "", // 存储短信内容 | 
|---|
|  |  |  | Whetherall: true, //是否全部记录展示 | 
|---|
|  |  |  | dialogFormVisible: false, | 
|---|
|  |  |  | Voicetype: 0, //是否为语音服务 | 
|---|
|  |  |  | visitCount: null, | 
|---|
|  |  |  | logsheetlist: [], | 
|---|
|  |  |  | topicobj: {}, | 
|---|
|  |  |  | sendname: 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.getTaskservelist(this.id); | 
|---|
|  |  |  | this.getTaskservelist(); | 
|---|
|  |  |  | }, | 
|---|
|  |  |  |  | 
|---|
|  |  |  | methods: { | 
|---|
|  |  |  | 
|---|
|  |  |  | isFinish: false, | 
|---|
|  |  |  | }).then((res) => { | 
|---|
|  |  |  | if (res.code === 200) { | 
|---|
|  |  |  | this.tableDatatop = res.data.scriptResult.script; | 
|---|
|  |  |  | this.tableDatatop.forEach((item) => { | 
|---|
|  |  |  | console.log(item.scriptResultId, "scriptResultId"); | 
|---|
|  |  |  | // 针对再次随访服务进行删除结果赋值 | 
|---|
|  |  |  | 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.scriptType == 2) item.scriptResult = []; | 
|---|
|  |  |  | if (item.scriptResultId && item.scriptType != 2) { | 
|---|
|  |  |  | item.isoption = 3; | 
|---|
|  |  |  | item.scriptResult = item.scriptResult; | 
|---|
|  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  | }); | 
|---|
|  |  |  | }, | 
|---|
|  |  |  | //患者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", | 
|---|
|  |  |  | pageNum: 1, | 
|---|
|  |  |  | allhosp: "0", //1住院2门诊3体检4出院 | 
|---|
|  |  |  | }; | 
|---|
|  |  |  | // 患者基础信息 | 
|---|
|  |  |  | messagelistpatient(queryParams).then((response) => { | 
|---|
|  |  |  | console.log(response.rows[0],'888'); | 
|---|
|  |  |  | this.userform = response.rows[0]; | 
|---|
|  |  |  | this.dynamicTags = response.rows[0].tagList.map(this.processElement); | 
|---|
|  |  |  | 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 = { | 
|---|
|  |  |  | 
|---|
|  |  |  | patid: this.patid, | 
|---|
|  |  |  | subId: id ? id : this.id, | 
|---|
|  |  |  | }; | 
|---|
|  |  |  | console.log(this.voiceDatatop, "111"); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | getPersonVoices(obj).then((res) => { | 
|---|
|  |  |  | console.log("222"); | 
|---|
|  |  |  | if (res.code == 200) { | 
|---|
|  |  |  | this.voiceDatatop = res.data.serviceSubtaskDetails; | 
|---|
|  |  |  | this.voice = res.data.voice; | 
|---|
|  |  |  | // // this.activeName = "yy"; | 
|---|
|  |  |  | this.activeName = "yy"; | 
|---|
|  |  |  | this.taskname = res.data.taskName; | 
|---|
|  |  |  | // 问卷展示数据处理 | 
|---|
|  |  |  | this.tableDatatop = res.data.filteredDetails; | 
|---|
|  |  |  | 
|---|
|  |  |  | item.scriptResult = []; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | }); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if (!this.tableDatatop.length) { | 
|---|
|  |  |  | this.puttaskid(this.templateid); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | 
|---|
|  |  |  | item.scriptResult = []; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | }); | 
|---|
|  |  |  | console.log(this.tableDatatop, "this.tableDatatop"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | }); | 
|---|
|  |  |  | }, | 
|---|
|  |  |  | // 医护人员存储数据 | 
|---|
|  |  |  | 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 | 
|---|
|  |  |  | ); | 
|---|
|  |  |  | 
|---|
|  |  |  | 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("&"); | 
|---|
|  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if (item.isoption == 3) { | 
|---|
|  |  |  | serviceSubtaskDetailedit(obj).then((res) => { | 
|---|
|  |  |  | if (res.code == 200) { | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | this.$modal.error("修改失败"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | }); | 
|---|
|  |  |  | promises.push(serviceSubtaskDetailedit(obj)); | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | serviceSubtaskDetailadd(obj).then((res) => { | 
|---|
|  |  |  | if (res.code == 200) { | 
|---|
|  |  |  | console.log(res); | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | this.$modal.error("修改失败"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | }); | 
|---|
|  |  |  | promises.push(serviceSubtaskDetailadd(obj)); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | }); | 
|---|
|  |  |  | this.Editsingletasksonyic(excep); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // 使用 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) => { | 
|---|
|  |  |  | console.log(item.scriptResult, "scriptResult"); | 
|---|
|  |  |  | item.scriptResult = item.scriptResult.join("&"); | 
|---|
|  |  |  | item.templatequestionnum = index + 1; | 
|---|
|  |  |  | item.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(id) { | 
|---|
|  |  |  | this.id = id; | 
|---|
|  |  |  | if (id) { | 
|---|
|  |  |  | this.Whetherall = false; | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | 
|---|
|  |  |  | getTaskservelist({ | 
|---|
|  |  |  | patid: this.patid, | 
|---|
|  |  |  | subId: id, | 
|---|
|  |  |  | deptOrDistrict:2, | 
|---|
|  |  |  | }).then((res) => { | 
|---|
|  |  |  | if (res.code == 200) { | 
|---|
|  |  |  | this.form = res.rows[0].serviceSubtaskList[0]; | 
|---|
|  |  |  | 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(); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | this.getuserinfo(); | 
|---|
|  |  |  | if (this.Voicetype) { | 
|---|
|  |  |  | this.getPersonVoices(); | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  | }); | 
|---|
|  |  |  | }, | 
|---|
|  |  |  | // 调起短信发送对话框 | 
|---|
|  |  |  | 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, | 
|---|
|  |  |  | deptOrDistrict:2, | 
|---|
|  |  |  | }).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(this.id); | 
|---|
|  |  |  | this.$modal.msgSuccess("服务记录成功"); | 
|---|
|  |  |  | this.getTaskservelist(); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | }); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | }); | 
|---|
|  |  |  | }, | 
|---|
|  |  |  | Editsingletasksonyic(excep) { | 
|---|
|  |  |  | Editsingletasksonyic(sendstate) { | 
|---|
|  |  |  | let objson = {}; | 
|---|
|  |  |  | getTaskservelist({ | 
|---|
|  |  |  | patid: this.patid, | 
|---|
|  |  |  | subId: this.id, | 
|---|
|  |  |  | deptOrDistrict:2, | 
|---|
|  |  |  | }).then((res) => { | 
|---|
|  |  |  | if (res.code == 200) { | 
|---|
|  |  |  | objson = res.rows[0].serviceSubtaskList[0]; | 
|---|
|  |  |  | objson.excep = excep; | 
|---|
|  |  |  | objson.remark = remark; | 
|---|
|  |  |  | 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("服务修改成功"); | 
|---|
|  |  |  | this.getTaskservelist(this.id); | 
|---|
|  |  |  | 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; | 
|---|
|  |  |  | }, | 
|---|
|  |  |  | // 查看详情 | 
|---|
|  |  |  | 
|---|
|  |  |  | 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.Voicetype = row.type; | 
|---|
|  |  |  | this.serviceType = row.serviceType; | 
|---|
|  |  |  | this.getTaskservelist(this.id); | 
|---|
|  |  |  | this.getTaskservelist(); | 
|---|
|  |  |  | }) | 
|---|
|  |  |  | .catch(() => {}); | 
|---|
|  |  |  | }, | 
|---|
|  |  |  | handleOptionChange(a, b, c) { | 
|---|
|  |  |  | console.log(this.tableDatatop[b], "this.tableDatatop[b]"); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 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 | 
|---|
|  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  | 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) => { | 
|---|
|  |  |  | console.log(item.svyLibTemplateTargetoptions); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | var obj = item.svyLibTemplateTargetoptions.find( | 
|---|
|  |  |  | (items) => items.optioncontent == item.scriptResult | 
|---|
|  |  |  | ); | 
|---|
|  |  |  | 
|---|
|  |  |  | }, | 
|---|
|  |  |  | // 创建再次随访服务 | 
|---|
|  |  |  | setupsubtask() { | 
|---|
|  |  |  | console.log(this.form); | 
|---|
|  |  |  | let form = structuredClone(this.form); | 
|---|
|  |  |  | form.longSendTime = this.formatTime(form.date1); | 
|---|
|  |  |  | if (form.resource) { | 
|---|
|  |  |  | if (form.resource == 2) { | 
|---|
|  |  |  | form.serviceType = 10; | 
|---|
|  |  |  | 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; | 
|---|
|  |  |  | }); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | this.$modal.msgError("未选择随访方式"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | form.id = null; | 
|---|
|  |  |  | form.sendstate = 2; | 
|---|
|  |  |  | addserviceSubtask(form).then((res) => { | 
|---|
|  |  |  | if (res.code == 200) { | 
|---|
|  |  |  | this.$modal.msgSuccess("创建成功"); | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | this.$modal.msgError("创建失败"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | this.dialogFormVisible = false; | 
|---|
|  |  |  | }); | 
|---|
|  |  |  | }, | 
|---|
|  |  |  | updateScore(a, b, c) { | 
|---|
|  |  |  | console.log(a); | 
|---|
|  |  |  | console.log(b); | 
|---|
|  |  |  | console.log(c); | 
|---|
|  |  |  | 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(); | 
|---|
|  |  |  | }, | 
|---|
|  |  |  | }, | 
|---|
|  |  |  | }; | 
|---|
|  |  |  | 
|---|
|  |  |  | <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 { | 
|---|
|  |  |  | margin: 20px 10px; | 
|---|
|  |  |  | align-items: center; | 
|---|
|  |  |  | height: 300px; | 
|---|
|  |  |  | 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); | 
|---|
|  |  |  | 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: 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; | 
|---|
|  |  |  | 
|---|
|  |  |  | padding-left: 5px; | 
|---|
|  |  |  | margin-bottom: 10px; | 
|---|
|  |  |  | display: flex; | 
|---|
|  |  |  | // justify-content: space-between; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | .Add-details { | 
|---|
|  |  |  | font-size: 18px; | 
|---|
|  |  |  | color: #02a7f0; | 
|---|
|  |  |  | cursor: pointer; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | .red-star { | 
|---|
|  |  |  | ::v-deep.el-radio__label { | 
|---|
|  |  |  | position: relative; | 
|---|
|  |  |  | padding-right: 10px; /* 根据需要调整 */ | 
|---|
|  |  |  | padding-right: 10px; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | ::v-deep.el-radio__label::after { | 
|---|
|  |  |  | content: "*"; | 
|---|
|  |  |  | color: red; | 
|---|
|  |  |  | position: absolute; | 
|---|
|  |  |  | right: -5px; /* 根据需要调整 */ | 
|---|
|  |  |  | right: -5px; | 
|---|
|  |  |  | top: 0; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | ::v-deep.el-input-group__textarea { | 
|---|
|  |  |  | white-space: pre-wrap; /* 保持空白符序列并正常换行 */ | 
|---|
|  |  |  | word-break: break-all; /* 在长单词或URL地址内部进行换行 */ | 
|---|
|  |  |  | white-space: pre-wrap; | 
|---|
|  |  |  | word-break: break-all; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | ::v-deep.el-checkbox__label { | 
|---|
|  |  |  | position: relative; | 
|---|
|  |  |  | padding-right: 10px; /* 根据需要调整 */ | 
|---|
|  |  |  | padding-right: 10px; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | ::v-deep.el-checkbox__label::after { | 
|---|
|  |  |  | content: "*"; | 
|---|
|  |  |  | color: red; | 
|---|
|  |  |  | position: absolute; | 
|---|
|  |  |  | right: -5px; /* 根据需要调整 */ | 
|---|
|  |  |  | 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> | 
|---|