From d54ac083e2992a5613f5cb22849db9742dbe9a9b Mon Sep 17 00:00:00 2001
From: WXL (wul) <wl_5969728@163.com>
Date: 星期三, 22 十月 2025 11:06:14 +0800
Subject: [PATCH] 问卷联调
---
src/views/followvisit/record/detailpage/index.vue | 1917 +++++++++++++++++++++++++++++++++++++++++++++++------------
1 files changed, 1,512 insertions(+), 405 deletions(-)
diff --git a/src/views/followvisit/record/detailpage/index.vue b/src/views/followvisit/record/detailpage/index.vue
index fb42e14..fa48d8a 100644
--- a/src/views/followvisit/record/detailpage/index.vue
+++ b/src/views/followvisit/record/detailpage/index.vue
@@ -18,7 +18,7 @@
>鍙睍绀烘湰娆℃湇鍔′俊鎭�</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"
@@ -26,6 +26,23 @@
>
鍓嶅線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> -->
@@ -35,8 +52,16 @@
<el-table
:data="logsheetlist"
:row-class-name="tableRowClassName"
+ :max-height="350"
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"
@@ -213,94 +238,508 @@
</el-table>
</div>
</div>
- <div class="Followuserinfos">
- <div>
- <el-form
- ref="userform"
- :model="form"
- :rules="userrules"
- 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="8"
- ><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-col :span="8"
- ><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="8"
- ><el-form-item label="鑱旂郴浜哄叧绯�">
- <el-input
- placeholder="鑱旂郴浜哄叧绯荤己澶�"
- v-model="userform.relation"
- ></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>
+ <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>
- <el-form-item label="闅忚璁板綍">
- <el-input type="textarea" v-model="form.remark"></el-input>
- </el-form-item>
+ <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.svyTaskTemplateTargetoptions,
+ item
+ )
+ "
+ >
+ <el-radio
+ v-for="(
+ items, indexs
+ ) in item.svyTaskTemplateTargetoptions"
+ :class="items.isabnormal ? 'red-star' : ''"
+ :key="indexs"
+ :label="items.optioncontent"
+ @click.native.prevent="handleRadioToggle(item, 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.svyTaskTemplateTargetoptions"
+ :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>
- <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
- v-if="this.form.isVisitAgain != 2"
- @click="sendAgain()"
- >鍐嶆闅忚</el-button
- >
- </div>
- </el-form-item>
- </el-form>
- <el-collapse>
- <el-collapse-item title="鏌ョ湅褰撳墠鎮h�呬俊鎭�" name="1">
+ <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"
+ @click.native.prevent="handleRadioToggle(item, items.optioncontent)"
+ >{{ 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>
+
+ <!-- 褰撳墠閫夋嫨鐨勯鑹叉寚绀哄櫒 -->
+ <div
+ v-if="selectedTag"
+ class="color-indicator selected-indicator"
+ :style="{ backgroundColor: getSelectedTagColor() }"
+ ></div>
+
+ <!-- 鏍囪璇存槑鎻愮ず -->
+ <el-tooltip
+ v-if="selectedTag"
+ effect="light"
+ :content="getSelectedDescription()"
+ placement="top"
+ >
+ <i class="el-icon-info tag-info-icon"></i>
+ </el-tooltip>
+ </div>
+ </div>
+ <el-row>
+ <el-col :span="14"
+ ><el-form-item label="鑱旂郴鐢佃瘽">
+ <el-input
+ 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="闅忚鍐呭" v-if="orgname == '涓芥按甯備腑鍖婚櫌'">
+ <el-input type="textarea" v-model="form.remark"></el-input>
+ </el-form-item>
+ <el-form-item label="闅忚璁板綍" v-else>
+ <el-input type="textarea" v-model="form.remark"></el-input>
+ </el-form-item>
+
+ <el-form-item label="闅忚鎯呭喌" v-if="orgname == '涓芥按甯備腑鍖婚櫌'">
+ <el-radio-group v-model="form.taskSituation">
+ <el-radio
+ v-for="city in cities"
+ :label="city.value"
+ :value="city.value"
+ :key="city.value"
+ >{{ city.label }}</el-radio
+ >
+ </el-radio-group>
+ </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>鎮h�呮。妗堜俊鎭�</h3>
<el-form ref="userform" :model="userform" label-width="100px">
<el-row :gutter="20">
<el-col :span="12">
@@ -312,6 +751,24 @@
></el-input> </el-form-item
></el-col>
</el-row>
+ <el-row :gutter="20">
+ <el-col :span="12"
+ ><el-form-item label="鎬у埆" prop="telcode">
+ <el-select v-model="userform.sex" placeholder="璇烽�夋嫨">
+ <el-option label="鐢�" :value="1"> </el-option>
+ <el-option label="濂�" :value="2"> </el-option>
+ </el-select> </el-form-item
+ ></el-col>
+ <el-col :span="12">
+ <el-form-item label="骞撮緞" prop="name">
+ <el-input
+ v-model="userform.age"
+ placeholder="璇疯緭鍏ュ鍚�"
+ maxlength="20"
+ ></el-input> </el-form-item
+ ></el-col>
+ </el-row>
+
<el-row :gutter="20">
<el-col :span="12"
><el-form-item label="鑱旂郴鏂瑰紡" prop="telcode">
@@ -327,6 +784,16 @@
v-model="userform.relativetelcode"
placeholder="璇疯緭鍏ュ鍚�"
maxlength="20"
+ ></el-input> </el-form-item
+ ></el-col>
+ </el-row>
+ <el-row :gutter="20">
+ <el-col :span="24">
+ <el-form-item label="璇婃柇鍚嶇О" prop="name">
+ <el-input
+ v-model="form.leavediagname"
+ placeholder="璇疯緭鍏ヨ瘖鏂�"
+ maxlength="50"
></el-input> </el-form-item
></el-col>
</el-row>
@@ -350,261 +817,59 @@
/> </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>
- <h2>涓�閿懠鍙姛鑳�</h2>
- <CallButton
- ref="callButton"
- :phoneNumber="currentPhoneNumber"
- style="display: none"
- />
- </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
- )
- "
- >
- <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-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>
- </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="smsDialogVisible">
+ <!-- 娉ㄦ剰杩欓噷浣跨敤浜� smsDialogVisible 浠ュ尯鍒嗗凡鏈夌殑 dialogFormVisible -->
+ <el-form ref="smsForm" :model="form" label-width="80px">
+ <el-form-item label="鎮h�呭悕绉�">
+ <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="鎮h�呭啀娆¢殢璁�"
v-dialogDrags
@@ -750,6 +1015,21 @@
<el-button type="primary" @click="setupsubtask">纭鍒涘缓鏈嶅姟</el-button>
</div>
</el-dialog>
+ <div class="main-content" v-if="orgname == '鏅畞鐣叉棌鑷不鍘夸汉姘戝尰闄�'">
+ <!-- <el-button @click="CaldialogVisible = true">鎵撳紑寮规</el-button> -->
+
+ <!-- 寮规璋冪敤 -->
+ <el-dialog
+ title="鍛煎彨鍔熻兘妗�"
+ :visible.sync="CaldialogVisible"
+ width="60%"
+ >
+ <CallCenterLs
+ ref="callCenterModal"
+ :initial-phone="currentPhoneNumber"
+ />
+ </el-dialog>
+ </div>
</div>
</template>
@@ -766,6 +1046,7 @@
updatePersonVoices,
addPersonVoices,
query360PatInfo,
+ sendMsg,
} from "@/api/AiCentre/index";
import {
messagelistpatient,
@@ -773,11 +1054,75 @@
listcontactinformation,
} from "@/api/patient/homepage";
import CallButton from "@/components/CallButton";
+import MergeAndModify from "./MergeAndModify.vue";
+import CallCenterLs from "@/components/CallCenterLs";
export default {
components: {
CallButton,
+ MergeAndModify,
+ CallCenterLs,
},
+ directives: {
+ numericOnly: {
+ bind(el, binding, vnode) {
+ // 灏濊瘯鑾峰彇瀹為檯鐨刬nput鍏冪礌
+ const input = el.tagName === "INPUT" ? el : el.querySelector("input");
+ if (!input) {
+ console.warn("v-numeric-only: 鏈壘鍒癷nput鍏冪礌");
+ 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);
+
+ // 瀛樺偍寮曠敤浠ヤ究瑙g粦
+ 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) => {
@@ -796,6 +1141,11 @@
userid: "",
currentPhoneNumber: "",
callType: "", // 鐢ㄤ簬鍖哄垎鏄摢涓數璇�
+ // 宸叉湁鏁版嵁...
+ callStatus: "idle", // idle, calling, connected, ended, failed
+ isEndingCall: false,
+ CaldialogVisible: false,
+ currentCall: null, // 褰撳墠閫氳瘽瀵硅薄
input: "浠婂ぉ韬綋杩樹笉閿�",
radio: "2",
taskname: "",
@@ -803,11 +1153,65 @@
voice: "",
templateid: "",
again: "",
+ orgname: "",
zcform: {},
form: {},
+ cities: [
+ {
+ label: "姝e父璇煶",
+ value: "1",
+ },
+ {
+ label: "鎮h�呮嫆鎺ユ垨鎷掕",
+ value: "2",
+ },
+ {
+ label: "闈㈣鎴栬�呮帴璇�",
+ value: "3",
+ },
+ {
+ label: "寰俊闅忚",
+ value: "4",
+ },
+ {
+ label: "闅忚鐢佃瘽涓嶆纭�",
+ value: "5",
+ },
+ {
+ label: "鍏朵粬鎯呭喌涓嶅疁闅忚",
+ value: "6",
+ },
+ ],
tableDatatop: [], //棰樼洰琛�
voiceDatatop: [], //棰樼洰琛�
dynamicTags: [],
+ isMergeMode: false,
+ mergeDialogVisible: false,
+ selectedServices: [], // 閫変腑鐨勬湇鍔″垪琛�
+ selectedTag: "",
+ tagOptions: [
+ {
+ value: "0",
+ label: "姝e父",
+ type: "normal",
+ color: "#7ff5e1",
+ description: "鎮h�呮儏鍐垫甯革紝鏃犻渶鐗瑰埆鍏虫敞",
+ },
+ {
+ value: "1",
+ label: "寮傚父",
+ type: "abnormal",
+ color: "#f75c5c",
+ description: "鎮h�呭瓨鍦ㄥ紓甯告儏鍐碉紝闇�瑕侀噸鐐瑰叧娉�",
+ },
+ {
+ value: "2",
+ label: "璀﹀憡",
+ type: "warning",
+ color: "#fbfb4a",
+ description: "鎮h�呮儏鍐甸渶瑕佽鍛婃敞鎰忥紝鍙兘瀛樺湪椋庨櫓",
+ },
+ ],
zcrules: {
resource: [
{ required: true, message: "璇烽�夋嫨闅忚鏂瑰紡", trigger: "change" },
@@ -844,8 +1248,8 @@
YongHuXX: {
XiTongID: "SUIFANGXT",
XiTongMC: "闅忚绯荤粺",
- YongHuID: "1400466972205912064",
- YongHuXM: "JNRMYY",
+ YongHuID: localStorage.getItem("YongHuID"),
+ YongHuXM: localStorage.getItem("YongHuXM"),
ZuZhiJGID: localStorage.getItem("orgid"),
ZuZhiJGMC: localStorage.getItem("orgname"),
idp: "lyra",
@@ -854,9 +1258,9 @@
},
pickerOptions: {
disabledDate(time) {
- // 绂佺敤浠婂ぉ鍙婁箣鍓嶇殑鏃ユ湡
- return time.getTime() < Date.now() - 24 * 60 * 60 * 1000;
- },
+ // 绂佺敤浠婂ぉ鍙婁箣鍓嶇殑鏃ユ湡
+ return time.getTime() < Date.now() - 24 * 60 * 60 * 1000;
+ },
shortcuts: [
{
text: "涓冨ぉ鍚�",
@@ -935,6 +1339,8 @@
},
],
userform: {},
+ smsDialogVisible: false, // 鎺у埗鐭俊瀵硅瘽妗嗘樉绀�
+ smsContent: "", // 瀛樺偍鐭俊鍐呭
Whetherall: true, //鏄惁鍏ㄩ儴璁板綍灞曠ず
dialogFormVisible: false,
Voicetype: 0, //鏄惁涓鸿闊虫湇鍔�
@@ -948,7 +1354,28 @@
patid: null,
};
},
-
+ computed: {
+ callStatusText() {
+ const statusMap = {
+ idle: "鍑嗗鍛煎彨",
+ calling: `姝e湪鍛煎彨 ${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;
@@ -958,6 +1385,7 @@
this.Voicetype = this.$route.query.Voicetype;
this.visitCount = this.$route.query.visitCount;
this.serviceType = this.$route.query.serviceType;
+ this.orgname = localStorage.getItem("orgname");
this.getTaskservelist();
},
@@ -1002,11 +1430,10 @@
},
//鎮h��360璺宠浆
gettoken360(sfzh, drcode, drname) {
+ // this.$modal.msgWarning("360鍔熻兘鏆傛湭寮�閫�");
+
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");
@@ -1020,8 +1447,7 @@
getuserinfo() {
const queryParams = {
pid: Number(this.patid),
- allhosp: "0",
- pageNum: 1,
+ allhosp: "0", //1浣忛櫌2闂ㄨ瘖3浣撴4鍑洪櫌
};
// 鎮h�呭熀纭�淇℃伅
messagelistpatient(queryParams).then((response) => {
@@ -1128,7 +1554,14 @@
let excep = "";
const promises = [];
this.tableDatatop.forEach((item) => {
- var objs = item.svyLibTemplateTargetoptions.find(
+ if (item.valueType == 3 && item.scriptResult) {
+ // 楠岃瘉鏄惁涓烘湁鏁堟暟瀛�
+ if (!/^\d+$/.test(item.scriptResult)) {
+ this.$message.error(`闂 "${item.scriptContent}" 蹇呴』杈撳叆鏁板瓧`);
+ return;
+ }
+ }
+ var objs = item.svyTaskTemplateTargetoptions.find(
(items) => items.optioncontent == item.scriptResult
);
if (obj) {
@@ -1144,6 +1577,7 @@
scriptid: item.id,
excep: excep,
questiontext: item.scriptContent,
+ answerps: item.answerps || null, // 娣诲姞闄勫姞淇℃伅
};
if (item.scriptType == 2 && item.scriptResult[0]) {
obj.asrtext = item.scriptResult.join("&");
@@ -1157,6 +1591,7 @@
promises.push(serviceSubtaskDetailadd(obj));
}
});
+
// 浣跨敤 Promise.all 绛夊緟鎵�鏈夊紓姝ユ搷浣滃畬鎴�
Promise.all(promises)
.then((results) => {
@@ -1190,7 +1625,7 @@
})
.catch(() => {
if (this.form.serviceType == 13) {
- if (this.visitCount) {
+ if (this.visitCount != 1) {
this.$router.push({
path: "/logisticsservice/zbAgain",
});
@@ -1200,7 +1635,7 @@
});
}
} else if (this.form.serviceType == 2) {
- if (this.visitCount) {
+ if (this.visitCount != 1) {
this.$router.push({
path: "/logisticsservice/again",
});
@@ -1217,31 +1652,104 @@
console.error("鍙戠敓閿欒锛�", error);
});
},
- // 楠岃瘉鎵嬫満鍙锋牸寮�
- isValidPhone(phone) {
- return /^1[3-9]\d{9}$/.test(phone);
- },
- // 鍛煎彨澶勭悊
- handleCall(phone, type) {
- if (this.isValidPhone(phone)) {
- this.currentPhoneNumber = phone;
- this.callType = type;
+ // 鐢佃瘽============================
+ // 楠岃瘉鐢佃瘽鍙风爜鏍煎紡骞惰繑鍥為敊璇俊鎭�
+ validatePhoneNumber(phone) {
+ if (!phone) {
+ return { isValid: false, message: "璇疯緭鍏ョ數璇濆彿鐮�" };
+ }
- // 绛夊緟涓嬩竴涓猼ick纭繚鍊煎凡鏇存柊
- this.$nextTick(() => {
- this.$refs.callButton.startCall();
+ // 鎵嬫満鍙锋鍒�
+ const mobileRegex = /^1[3-9]\d{9}$/;
- // 鍙�夛細鏍规嵁涓嶅悓绫诲瀷鍋氫笉鍚屽鐞�
- if (type === "tel") {
- console.log("姝e湪鍛煎彨鎮h�呮湰浜�:", phone);
- } else {
- console.log("姝e湪鍛煎彨鑱旂郴浜�:", phone);
- }
- });
+ // 甯﹀尯鍙风殑鍥哄畾鐢佃瘽锛堝畬鏁存牸寮忥級
+ 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;
+ // 鍛煎彨鍒ゆ柇
+ if (this.orgname == "鏅畞鐣叉棌鑷不鍘夸汉姘戝尰闄�") {
+ this.CaldialogVisible = true;
+ return;
+ }
+
+ 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) => {
+ const dataToSubmit = JSON.parse(JSON.stringify(this.tableDatatop));
+
+ dataToSubmit.forEach((item, index) => {
+ // 瀵规嫹璐濈殑鏁版嵁杩涜鎿嶄綔锛屼笉褰卞搷鍘熷鐨� scriptResult 鏁扮粍
item.scriptResult = item.scriptResult.join("&");
item.templatequestionnum = index + 1;
item.subId = this.id;
@@ -1253,8 +1761,9 @@
item.patid = this.patid;
item.templateid = item.templateID;
});
+
let obj = {
- serviceSubtaskDetailList: this.tableDatatop,
+ serviceSubtaskDetailList: dataToSubmit, // 鎻愪氦澶勭悊鍚庣殑鍓湰
param1: this.taskid,
param2: this.patid,
subId: this.id,
@@ -1285,7 +1794,7 @@
})
.catch(() => {
if (this.form.serviceType == 13) {
- if (this.visitCount!=1) {
+ if (this.visitCount != 1) {
this.$router.push({
path: "/logisticsservice/zbAgain",
});
@@ -1295,7 +1804,7 @@
});
}
} else if (form.serviceType == 2) {
- if (this.visitCount!=1) {
+ if (this.visitCount != 1) {
this.$router.push({
path: "/followvisit/again",
});
@@ -1326,15 +1835,17 @@
getTaskservelist({
patid: this.patid,
subId: id,
+ pageSize: 100,
}).then((res) => {
if (res.code == 200) {
this.form = res.rows[0].serviceSubtaskList.find(
(item) => item.id == this.id
);
- console.log(this.form.serviceType,'serviceType');
+ console.log(this.form, "serviceType");
this.logsheetlist = res.rows[0].serviceSubtaskList;
- this.templateid = this.logsheetlist[0].templateid;
+ this.templateid = this.form.templateid;
+ this.selectedTag = this.form.excep;
const targetDate = new Date(this.form.longSendTime); // 鐩爣鏃ユ湡
const now = new Date(); // 褰撳墠鏃堕棿
if (now < targetDate && this.form.sendstate == 2) {
@@ -1354,6 +1865,34 @@
this.getsearchrResults();
}
});
+ },
+ // 璋冭捣鐭俊鍙戦�佸璇濇
+ sendAgainmsg() {
+ this.smsDialogVisible = true;
+ // 鍙互鍦ㄨ繖閲屽垵濮嬪寲 smsContent锛屼緥濡� this.smsContent = '';
+ },
+
+ // 鍙戦�佺煭淇$殑鏂规硶
+ sendSms() {
+ // 杩欓噷璋冪敤浣犵殑鐭俊鍙戦�� API
+ // 鍋囪 API 涓� sendMsg锛屽弬鏁板彲鑳介渶瑕佹牴鎹疄闄呮儏鍐佃皟鏁�
+ sendMsg({
+ phone: this.userform.telcode, // 纭繚鐢佃瘽鍙风爜瀛楁姝g‘
+ 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 = {};
@@ -1384,6 +1923,8 @@
(item) => item.id == this.id
);
objson.remark = this.form.remark;
+ objson.taskSituation = this.form.taskSituation;
+ objson.excep = this.selectedTag;
if (sendstate) objson.sendstate = sendstate;
Editsingletaskson(objson).then((res) => {
if (res.code) {
@@ -1408,6 +1949,30 @@
}
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);
@@ -1433,7 +1998,7 @@
})
.catch(() => {});
},
- handleOptionChange(a, b, c) {
+ aahandleOptionChange(a, b, c) {
const result = c.find((item) => item.optioncontent == a);
if (result.nextQuestion == 0) {
this.tableDatatop = this.tableDatatop.reduce((acc, item, i) => {
@@ -1451,7 +2016,7 @@
(item) => item.optioncontent == a
);
} else {
- var obj = this.tableDatatop[b].svyLibTemplateTargetoptions.find(
+ var obj = this.tableDatatop[b].svyTaskTemplateTargetoptions.find(
(item) => item.optioncontent == a
);
}
@@ -1462,9 +2027,118 @@
}
this.$forceUpdate();
},
+ // 鏂板鐨勫垏鎹㈤�変腑/鍙栨秷閫変腑鏂规硶
+ handleRadioToggle(questionItem, optionValue) {
+ // 濡傛灉鐐瑰嚮鐨勬槸褰撳墠宸查�変腑鐨勯�夐」锛屽垯鍙栨秷閫変腑
+ if (questionItem.scriptResult === optionValue) {
+ questionItem.scriptResult = ""; // 娓呯┖閫変腑鍊�
+ // 鍚屾椂閲嶇疆涓庨�夐」鐩稿叧鐨勭姸鎬�
+ questionItem.isabnormal = false;
+ questionItem.showAppendInput = false;
+ // 娉ㄦ剰锛氬彇娑堥�変腑鏃讹紝鎴戜滑閫氬父涓嶅笇鏈涜Е鍙戦鐩烦杞�昏緫锛屾墍浠ョ洿鎺ヨ繑鍥�
+ // 濡傛灉闇�瑕侊紝鍙互鍦ㄨ繖閲屾坊鍔犲彇娑堥�変腑鍚庣殑鐗瑰畾閫昏緫锛屼緥濡傞噸缃鐩簭鍒�
+ } else {
+ // 濡傛灉鐐瑰嚮鐨勬槸鏈�変腑鐨勯�夐」锛屽垯閫氳繃鏇存敼缁戝畾鍊兼潵瑙﹀彂鍘熷鐨� handleOptionChange 鏂规硶
+ // 杩欓噷鍙渶瑕佹敼鍙� v-model 缁戝畾鐨勫�硷紝change浜嬩欢浼氳嚜鍔ㄨЕ鍙�
+ questionItem.scriptResult = optionValue;
+ // 鍚庣画鐨勮烦杞瓑澶嶆潅閫昏緫浼氬湪 handleOptionChange 涓甯告墽琛�
+ }
+ },
+ // 鍦╩ethods閮ㄥ垎锛屼慨鏀筯andleOptionChange鏂规硶:
+ 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);
+
+ // 淇濆瓨涔嬪墠鍥爊extQuestion=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 {
+ // 姝e父璺宠浆閫昏緫
+ const nextQuestionIndex = selectedOptionObj.nextQuestion - 1;
+
+ this.tableDatatop = this.tableDatatop.map((item, index) => {
+ // 淇濈暀褰撳墠棰樼洰涔嬪墠鐨勯殣钘忕姸鎬�
+ if (index < questionIndex) {
+ return {
+ ...item,
+ astrict: previouslyHiddenBeforeCurrent.includes(index),
+ hiddenByEnd: false, // 娓呴櫎缁撴潫鏍囪
+ };
+ }
+
+ // 褰撳墠棰樼洰鎬绘槸鍙
+ if (index === questionIndex) {
+ return { ...item, astrict: 0, hiddenByEnd: false };
+ }
+
+ // 鏄剧ず鐩爣涓嬩竴棰�
+ if (index === nextQuestionIndex) {
+ return { ...item, astrict: 0, hiddenByEnd: false };
+ }
+
+ // 濡傛灉鏄箣鍓嶈缁撴潫闂瓟闅愯棌鐨勯鐩紝鐜板湪搴旇鎭㈠鏄剧ず
+ if (item.hiddenByEnd) {
+ return { ...item, astrict: 0, hiddenByEnd: false };
+ }
+
+ // 闅愯棌褰撳墠棰樺拰鐩爣棰樹箣闂寸殑棰樼洰
+ if (index > questionIndex && index < nextQuestionIndex) {
+ return { ...item, astrict: 1, hiddenByEnd: false };
+ }
+
+ // 鍏朵粬鎯呭喌淇濇寔鍘熺姸
+ return item;
+ });
+ }
+ } else {
+ // 濡傛灉娌℃湁璺宠浆锛屽彧闇�纭繚涓嬩竴棰樺彲瑙�
+ this.tableDatatop = this.tableDatatop.map((item, index) => ({
+ ...item,
+ astrict: index === questionIndex + 1 ? 0 : item.astrict,
+ hiddenByEnd: index === questionIndex + 1 ? false : item.hiddenByEnd,
+ }));
+ }
+
+ this.$forceUpdate();
+ },
overdata() {
this.tableDatatop.forEach((item, index) => {
- var obj = item.svyLibTemplateTargetoptions.find(
+ var obj = item.svyTaskTemplateTargetoptions.find(
(items) => items.optioncontent == item.scriptResult
);
if (obj) {
@@ -1481,6 +2155,10 @@
setupsubtask() {
this.$refs["zcform"].validate((valid) => {
if (valid) {
+ if (this.form.date1 && new Date(this.form.date1) < new Date()) {
+ this.$message.error("闅忚鏃堕棿涓嶈兘灏忎簬褰撳墠鏃堕棿");
+ return false;
+ }
this.form.remark =
this.form.remark + "銆�" + this.getCurrentTime() + "銆�";
let form = structuredClone(this.form);
@@ -1500,7 +2178,7 @@
}
// form.id = null;
form.sendstate = 2;
- console.log(form.serviceType,'form.serviceType');
+ console.log(form.serviceType, "form.serviceType");
addserviceSubtask(form).then((res) => {
if (res.code == 200) {
@@ -1535,69 +2213,230 @@
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();
+ },
},
+ // deactivated() {
+ // console.log(11);
+ // },
+ beforeRouteLeave(to, from, next) {
+ this.$refs.callButton.cleanupResources();
+ next(); // 纭繚璋冪敤 nex
+ },
+ // beforeRouteUpdate() {
+ // console.log(33);
+ // },
};
</script>
-<style lang="scss">
+<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;
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;
@@ -1607,9 +2446,11 @@
border-radius: 10px;
}
}
+
.offside {
display: flex;
flex-direction: row-reverse;
+
.offside-value {
padding: 10px;
background: rgb(217, 173, 253);
@@ -1619,8 +2460,15 @@
}
}
}
+.topic-dev[inert] {
+ opacity: 0.5;
+ pointer-events: none;
+}
.CONTENT {
padding: 10px;
+ height: 100%;
+ min-height: 660px; /* 璁剧疆鏈�灏忛珮搴� */
+
.title {
font-size: 22px;
font-weight: bold;
@@ -1628,40 +2476,47 @@
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;
@@ -1669,79 +2524,331 @@
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; /* 淇濇寔绌虹櫧绗﹀簭鍒楀苟姝e父鎹㈣ */
- word-break: break-all; /* 鍦ㄩ暱鍗曡瘝鎴朥RL鍦板潃鍐呴儴杩涜鎹㈣ */
+ 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; /* 榧犳爣鏍峰紡 */
+ 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; /* 榧犳爣鏍峰紡 */
+ background-color: #fff;
+ border-color: #dcdfe6;
+ color: #080808 !important;
+ cursor: not-allowed;
+}
+/* 鍘熸湁鐨勬牱寮忎繚鎸佷笉鍙橈紝娣诲姞浠ヤ笅鍝嶅簲寮忎唬鐮� */
+
+.Followupdetailspage {
+ margin: 10px;
+ display: flex;
+ flex-direction: column;
+ gap: 20px;
+}
+
+.action-container {
+ display: flex;
+ flex-direction: row; /* 榛樿妯悜鎺掑垪 */
+ gap: 20px;
+ margin: 0 10px 20px 10px;
+
+ /* 褰撶缉鏀炬瘮渚嬪ぇ浜�100%鎴栧睆骞曞搴﹁緝灏忔椂鏀逛负涓婁笅鎺掑垪 */
+ @media screen and (max-width: 1200px), (min-resolution: 1dppx) {
+ flex-direction: column;
+
+ .call-action,
+ .manual-action {
+ width: 100% !important;
+ }
+ }
+}
+
+.call-action {
+ width: 65%;
+ min-width: 0;
+}
+
+.manual-action {
+ flex: 1;
+ min-width: 0;
+}
+
+/* 璋冩暣鍐呴儴鍏冪礌鐨勫搷搴斿紡甯冨眬 */
+.Followuserinfos {
+ .el-form {
+ /* 琛ㄥ崟鍝嶅簲寮忚皟鏁� */
+ .el-row {
+ margin: 0 -10px;
+ }
+
+ .el-col {
+ padding: 0 10px;
+ }
+
+ @media screen and (max-width: 768px) {
+ .el-col {
+ width: 100%;
+ margin-bottom: 15px;
+
+ &:last-child {
+ margin-bottom: 0;
+ }
+ }
+ }
+ }
+}
+
+/* 璋冩暣琛ㄦ牸鐨勫搷搴斿紡琛ㄧ幇 */
+.el-table {
+ ::v-deep .el-table__body-wrapper {
+ overflow-x: auto;
+ }
+
+ /* 鍦ㄥ皬灞忓箷涓婅皟鏁磋〃鏍煎垪瀹� */
+ @media screen and (max-width: 992px) {
+ .el-table-column {
+ min-width: 120px;
+ }
+ }
+}
+
+/* 璋冩暣鏍囩閫夋嫨鍣ㄧ殑鍝嶅簲寮忓竷灞� */
+.tag-selector-container {
+ display: flex;
+ align-items: center;
+ flex-wrap: wrap;
+ gap: 10px;
+
+ @media screen and (max-width: 576px) {
+ flex-direction: column;
+ align-items: flex-start;
+
+ .el-select {
+ width: 100%;
+ margin-right: 0 !important;
+ }
+ }
+}
+
+/* 璋冩暣鎸夐挳缁勭殑鍝嶅簲寮忓竷灞� */
+.el-form-item.label-processing-opinion {
+ .el-button-group {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 10px;
+
+ .el-button {
+ flex: 1;
+ min-width: 120px;
+ }
+ }
+}
+
+/* 璋冩暣閫夐」鍗$殑鍝嶅簲寮忚〃鐜� */
+.el-tabs {
+ ::v-deep .el-tabs__nav-wrap {
+ overflow-x: auto;
+ white-space: nowrap;
+
+ &::after {
+ display: none;
+ }
+ }
+}
+
+/* 璋冩暣棰勮鍖哄煙鐨勫搷搴斿紡琛ㄧ幇 */
+.preview-left {
+ @media screen and (max-width: 768px) {
+ margin: 10px;
+ padding: 15px;
+
+ .topic-dev,
+ .scriptTopic-dev {
+ margin-bottom: 15px;
+ }
+ }
+}
+
+/* 璋冩暣瀵硅瘽妗嗙殑鍝嶅簲寮忚〃鐜� */
+.el-dialog {
+ @media screen and (max-width: 992px) {
+ width: 90% !important;
+ margin-top: 5vh !important;
+
+ .el-dialog__body {
+ padding: 15px;
+ }
+ }
+
+ @media screen and (max-width: 576px) {
+ width: 95% !important;
+
+ .el-form-item {
+ margin-bottom: 15px;
+ }
+ }
+}
+
+/* 纭繚鍐呭鍦ㄧ缉鏀炬椂淇濇寔鍙鎬� */
+.headline {
+ font-size: clamp(18px, 2vw, 24px); /* 浣跨敤clamp鍑芥暟纭繚瀛椾綋澶у皬鍦ㄥ悎鐞嗚寖鍥村唴 */
+}
+
+/* 涓虹Щ鍔ㄨ澶囦紭鍖栨粴鍔ㄤ綋楠� */
+@media screen and (max-width: 768px) {
+ .Followuserinfo,
+ .Followuserinfos {
+ padding: 15px;
+ margin: 5px;
+ }
+
+ .CONTENT {
+ min-height: auto;
+ padding: 5px;
+ }
+}
+
+/* 缂╂斁妫�娴嬫牱寮� */
+@media screen and (min-resolution: 1.1dppx),
+ screen and (-webkit-min-device-pixel-ratio: 1.1),
+ screen and (max-width: 1200px) {
+ .action-container {
+ flex-direction: column;
+ }
+
+ .call-action,
+ .manual-action {
+ width: 100%;
+ }
+
+ /* 璋冩暣鍐呴儴鍏冪礌闂磋窛 */
+ .call-container,
+ .Followuserinfos {
+ margin-bottom: 20px;
+ }
}
</style>
--
Gitblit v1.9.3