From 93bc6ed9fbed8472be7b393334855743d09940f8 Mon Sep 17 00:00:00 2001 From: WXL (wul) <wl_5969728@163.com> Date: 星期三, 03 九月 2025 14:49:08 +0800 Subject: [PATCH] 测试完成 --- src/views/followvisit/record/detailpage/index.vue | 1748 +++++++++++++++++++++++++++++++++++++++++++++------------ 1 files changed, 1,379 insertions(+), 369 deletions(-) diff --git a/src/views/followvisit/record/detailpage/index.vue b/src/views/followvisit/record/detailpage/index.vue index 0fa7f18..13a3136 100644 --- a/src/views/followvisit/record/detailpage/index.vue +++ b/src/views/followvisit/record/detailpage/index.vue @@ -1,6 +1,6 @@ <template> <!-- 鑱婅繛椤甸潰璁板綍 --> - <div class="Followupdetailspage"> + <div class="Followupdetailspage" id="app-container"> <div class="Followuserinfo"> <div> <div class="userinfo-text"> @@ -15,7 +15,7 @@ >鏌ョ湅鎮h�呭叏閮ㄦ湇鍔�</el-button > <el-button v-else type="success" @click="getTaskservelist(id)" - >鏌ョ湅鎮h�呮湰娆℃湇鍔′俊鎭�</el-button + >鍙睍绀烘湰娆℃湇鍔′俊鎭�</el-button > </div> <div style="margin-left: 20px; color: #59a0f0"> @@ -27,18 +27,62 @@ 鍓嶅線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 + :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" @@ -88,7 +132,7 @@ <el-table-column prop="finishtime" align="center" - label="瀹屾垚鏃堕棿" + label="闅忚瀹屾垚鏃堕棿" width="200" show-overflow-tooltip > @@ -184,7 +228,6 @@ 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 @@ -194,64 +237,427 @@ </el-table> </div> </div> - <div class="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 - placeholder="鑱旂郴鐢佃瘽缂哄け" - v-model="userform.telcode" - ></el-input> </el-form-item - ></el-col> - <el-col :span="12" - ><el-form-item label="鑱旂郴浜虹數璇�"> - <el-input - 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> + <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.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> + </div> + <div class="dev-xx"> + <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 @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" + >{{ 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 : '@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> + <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 + > + </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"> @@ -262,13 +668,23 @@ 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"> @@ -291,248 +707,18 @@ /> </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> - <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="鎮h�呭啀娆¢殢璁�" :visible.sync="dialogFormVisible"> + <el-dialog + title="鎮h�呭啀娆¢殢璁�" + v-dialogDrags + :visible.sync="dialogFormVisible" + > <el-form ref="zcform" :rules="zcrules" :model="form" label-width="80px"> <el-form-item label="浠诲姟鍚嶇О"> <el-input @@ -565,30 +751,111 @@ v-model="form.leavehospitaldistrictname" ></el-input> </el-form-item> + <el-form-item label="鍑洪櫌鏃堕棿"> + <el-input + style="width: 400px" + disabled + v-model="form.endtime" + ></el-input> + </el-form-item> + <div class="headline">涓婃闅忚</div> + <el-divider></el-divider> + <el-row> + <el-col :span="12"> + <el-form-item label="闅忚鏂瑰紡"> + <el-select + v-model="form.visitType2" + filterable + allow-create + default-first-option + disabled + placeholder="璇烽�夋嫨闅忚鏂瑰紡" + class="custom-disabled" + > + <el-option + v-for="item in options" + :key="item.value" + :label="item.label" + :value="item.value" + > + </el-option> + </el-select> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="闅忚鏃堕棿"> + <el-date-picker + type="date" + disabled + placeholder="閫夋嫨鏃ユ湡" + :picker-options="pickerOptions" + align="right" + v-model="form.date2" + class="custom-disabled" + ></el-date-picker> + </el-form-item> + </el-col> + </el-row> + <el-form-item label="闅忚璁板綍"> + <el-input + class="custom-disabled" + type="textarea" + disabled + v-model="form.remark2" + ></el-input> + </el-form-item> + <div class="headline">涓嬫闅忚</div> + <el-divider></el-divider> + <el-row> + <el-col :span="12"> + <el-form-item label="闅忚鏂瑰紡" prop="date1"> + <el-select + v-model="form.visitType" + filterable + allow-create + default-first-option + @change="visitChange" + placeholder="璇烽�夋嫨闅忚鏂瑰紡(渚濆嚭闄㈡椂闂存妧璁$畻)" + > + <el-option + v-for="item in options" + :key="item.value" + :label="item.label" + :value="item.value" + > + </el-option> + </el-select> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="闅忚鏃堕棿" prop="date1"> + <el-date-picker + type="date" + placeholder="閫夋嫨鏃ユ湡" + :picker-options="pickerOptions" + align="right" + v-model="form.date1" + class="custom-disabled" + ></el-date-picker> + </el-form-item> + </el-col> + </el-row> <el-form-item label="闅忚鏂瑰紡" prop="resource"> <el-radio-group v-model="form.resource"> <el-radio label="1">鏈梾鍖洪殢璁�</el-radio> <el-radio label="2">闅忚涓績闅忚</el-radio> </el-radio-group> </el-form-item> - <!-- <el-form-item label="鍗冲埢鍙戦��"> - <el-switch v-model="zcform.delivery"></el-switch> - </el-form-item> --> - <el-form-item label="闅忚鏃堕棿" prop="date1"> - <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> @@ -607,36 +874,189 @@ serviceSubtaskDetailadd, updatePersonVoices, addPersonVoices, + query360PatInfo, } from "@/api/AiCentre/index"; -import { messagelistpatient, alterpatient } 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, + }, + 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: [], // 閫変腑鐨勬湇鍔″垪琛� zcrules: { - date1: [ + resource: [ { required: true, message: "璇烽�夋嫨闅忚鏂瑰紡", trigger: "change" }, ], - resource: [ - { required: true, message: "璇烽�夋嫨闅忚鏃堕棿", trigger: "blur" }, + 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, //鏄惁鍏ㄩ儴璁板綍灞曠ず + Whetherall: true, //鏄惁鍏ㄩ儴璁板綍灞曠ず dialogFormVisible: false, Voicetype: 0, //鏄惁涓鸿闊虫湇鍔� + visitCount: null, logsheetlist: [], topicobj: {}, sendname: null, @@ -646,16 +1066,39 @@ 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; 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: { @@ -668,10 +1111,21 @@ isFinish: false, }).then((res) => { if (res.code === 200) { + // 閽堝鍐嶆闅忚鏈嶅姟杩涜鍒犻櫎缁撴灉璧嬪�� + 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) => { - console.log(item.scriptResultId, "scriptResultId"); + this.tableDatatop.forEach((item) => { + if (item.scriptType == 2) item.scriptResult = []; if (item.scriptResultId && item.scriptType != 2) { item.isoption = 3; item.scriptResult = item.scriptResult; @@ -685,12 +1139,29 @@ } }); }, + //鎮h��360璺宠浆 + gettoken360(sfzh, drcode, drname) { + this.$modal.msgWarning('360鍔熻兘鏆傛湭寮�閫�'); + return; // 闃绘鍚庣画浠g爜鎵ц + 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鍑洪櫌 }; // 鎮h�呭熀纭�淇℃伅 messagelistpatient(queryParams).then((response) => { @@ -699,7 +1170,45 @@ // 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 = { @@ -707,10 +1216,8 @@ 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; @@ -725,6 +1232,7 @@ item.scriptResult = []; } }); + if (!this.tableDatatop.length) { this.puttaskid(this.templateid); } @@ -752,7 +1260,6 @@ item.scriptResult = []; } }); - console.log(this.tableDatatop, "this.tableDatatop"); } }); }, @@ -777,6 +1284,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("&"); @@ -800,23 +1308,146 @@ } }); this.Editsingletasksonyic(6); + this.$modal .confirm( - '浠诲姟淇濆瓨鎴愬姛鏄惁閽堝鎮h�咃細"' + this.userform.name + '"鍐嶆闅忚锛�' + '浠诲姟淇濆瓨鎴愬姛鏄惁閽堝鎮h�咃細"' + + 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(() => {}); + .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; @@ -840,19 +1471,58 @@ this.$modal.msgSuccess("鏈嶅姟淇濆瓨鎴愬姛"); this.$modal .confirm( - '浠诲姟淇濆瓨鎴愬姛鏄惁閽堝鎮h�咃細"' + this.userform.name + '"鍐嶆闅忚锛�' + '浠诲姟淇濆瓨鎴愬姛鏄惁閽堝鎮h�咃細"' + + 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(() => {}); + .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; + }, // 鑾峰彇鎮h�呰褰� getTaskservelist(id) { - this.id = id; if (id) { this.Whetherall = false; } else { @@ -864,13 +1534,15 @@ subId: id, }).then((res) => { if (res.code == 200) { - this.form = res.rows[0].serviceSubtaskList[0]; - console.log(this.form, "this.form"); + 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; const targetDate = new Date(this.form.longSendTime); // 鐩爣鏃ユ湡 const now = new Date(); // 褰撳墠鏃堕棿 - if (now < targetDate && this.form.sendstate == 2) { this.$confirm("褰撳墠鏈嶅姟鏈埌鍙戦�佹椂闂磋璋ㄦ厧淇敼", "鎻愮ず", { confirmButtonText: "纭畾", @@ -901,22 +1573,22 @@ Editsingletaskson(objson).then((res) => { if (res.code) { this.$modal.msgSuccess("鏈嶅姟璁板綍鎴愬姛"); - this.getTaskservelist(this.id); + this.getTaskservelist(); } }); } }); }, Editsingletasksonyic(sendstate) { - console.log(sendstate,'sendstate'); - let objson = {}; getTaskservelist({ patid: this.patid, subId: this.id, }).then((res) => { if (res.code == 200) { - objson = res.rows[0].serviceSubtaskList[0]; + objson = res.rows[0].serviceSubtaskList.find( + (item) => item.id == this.id + ); objson.remark = this.form.remark; if (sendstate) objson.sendstate = sendstate; Editsingletaskson(objson).then((res) => { @@ -929,14 +1601,24 @@ this.$modal.msgError("鍩虹淇℃伅淇敼澶辫触"); } }); - this.getTaskservelist(this.id); + this.getTaskservelist(); } }); } }); }, + // 寮傚父鍒楁覆鏌� + tableRowClassName({ row, rowIndex }) { + if (row.id == this.id) { + return "warning-row"; + } + return ""; + }, // 璋冭捣鍐嶆鍙戦�� sendAgain() { + document.querySelector("#app").scrollTo(0, 0); + // scrollTo(0, 0) + this.formtidy(); this.dialogFormVisible = true; }, // 鏌ョ湅璇︽儏 @@ -949,19 +1631,27 @@ this.Voicetype = 1; } } - console.log(this.Voicetype, "this.Voicetype"); - this.taskid = row.taskid; this.id = row.id; this.patid = row.patid; 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 @@ -978,10 +1668,100 @@ } this.$forceUpdate(); }, + // 鍦╩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) => { - console.log(item.svyLibTemplateTargetoptions); - var obj = item.svyLibTemplateTargetoptions.find( (items) => items.optioncontent == item.scriptResult ); @@ -999,33 +1779,117 @@ setupsubtask() { this.$refs["zcform"].validate((valid) => { if (valid) { + if (this.form.date1 && new Date(this.form.date1) < new Date()) { + this.$message.error("闅忚鏃堕棿涓嶈兘灏忎簬褰撳墠鏃堕棿"); + return false; + } + this.form.remark = + this.form.remark + "銆�" + this.getCurrentTime() + "銆�"; let form = structuredClone(this.form); form.longSendTime = this.formatTime(form.date1); - form.finishtime = ''; + form.finishtime = ""; if (form.resource) { if (form.resource == 2) { - form.serviceType = 10; + 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.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; }); } }); }, - 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(); }, }, }; @@ -1034,59 +1898,144 @@ <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%; /* 纭繚楂樺害缁ф壙 */ + } +} + +.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; @@ -1096,9 +2045,11 @@ border-radius: 10px; } } + .offside { display: flex; flex-direction: row-reverse; + .offside-value { padding: 10px; background: rgb(217, 173, 253); @@ -1108,8 +2059,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; @@ -1117,40 +2075,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; @@ -1158,49 +2123,94 @@ 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; } } + ::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> -- Gitblit v1.9.3