123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781 |
- <template>
- <el-dialog
- v-model="state.dialogVisible"
- draggable
- :title="dialogTitle"
- ref="dialogRef"
- width="50%"
- append-to-body
- @mouseup="mouseup"
- :style="'transform: ' + state.transform + ';'"
- @close="close"
- destroy-on-close
- >
- <el-collapse v-model="state.collapseArr" class="collapse-box" v-loading="state.loading">
- <!-- 工单信息 -->
- <el-collapse-item name="1">
- <template #title>
- <p class="pl20">
- <b class="font14">工单信息</b>
- </p>
- </template>
- <div class="collapse-container">
- <el-form label-width="100px" class="show-info-form">
- <el-row :gutter="10">
- <el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
- <el-form-item label="工单编码" class="mb5"> {{ state.orderDetail.no }} </el-form-item>
- </el-col>
- <el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
- <el-form-item label="受理时间" class="mb5">
- <span>{{ dayjs(state.orderDetail.startTime).format('YYYY-MM-DD HH:mm:ss') }}</span></el-form-item
- >
- </el-col>
- <el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
- <el-form-item label="受理人" class="mb5">
- <span>{{ state.orderDetail?.acceptorName }}</span>
- </el-form-item>
- </el-col>
- <el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
- <el-form-item label="来源渠道" class="mb5"> {{ state.orderDetail.sourceChannel }} </el-form-item>
- </el-col>
- <el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
- <el-form-item label="受理类型" class="mb5"> {{ state.orderDetail.acceptType }} </el-form-item>
- </el-col>
- <el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
- <el-form-item label="热点分类" class="mb5"> {{ state.orderDetail.hotspotName }} </el-form-item>
- </el-col>
- <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
- <el-form-item label="工单标题" class="mb5"> {{ state.orderDetail.title }} </el-form-item>
- </el-col>
- <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
- <el-form-item label="工单内容" class="mb5"> {{ state.orderDetail.content }} </el-form-item>
- </el-col>
- <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
- <el-form-item label="办理结果" class="formatted-text mb5"> {{ state.orderDetail.fileOpinion }} </el-form-item>
- </el-col>
- </el-row>
- </el-form>
- </div>
- </el-collapse-item>
- <el-collapse-item name="2">
- <template #title>
- <p class="pl20">
- <b class="font14">来电人信息</b>
- </p>
- </template>
- <div class="collapse-container">
- <el-form label-width="100px" class="show-info-form">
- <el-row :gutter="10">
- <el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
- <el-form-item label="来电人姓名"> {{ state.orderDetail.fromName }} </el-form-item>
- </el-col>
- <el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12" v-if="state.orderDetail.fromPhone">
- <el-form-item label="来电号码" class="mb5">
- {{ state.orderDetail.fromPhone }}
- <el-button
- plain
- title="人工回访录音"
- size="small"
- type="primary"
- class="ml8"
- @click="recordFile"
- v-if="state.recordingAbsolutePath"
- >人工回访录音</el-button
- >
- </el-form-item>
- </el-col>
- <el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
- <el-form-item label="来电人性别" class="mb5"> {{ state.orderDetail.fromGenderText }} </el-form-item>
- </el-col>
- <el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
- <el-form-item label="联系电话">
- {{ state.orderDetail.contact }}
- <el-button plain title="呼叫" size="small" type="primary" class="ml8" @click="onCall(state.orderDetail.contact)" v-if="!disabled"
- >外呼</el-button
- >
- </el-form-item>
- </el-col>
- <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
- <el-form-item label="联系地址"> {{ state.orderDetail.address }} </el-form-item>
- </el-col>
- </el-row>
- </el-form>
- </div>
- </el-collapse-item>
- <el-collapse-item name="3">
- <template #title>
- <p class="pl20">
- <b class="font14">回访信息</b>
- </p>
- </template>
- <div class="collapse-container">
- <el-form label-width="120px" ref="ruleFormRef" :model="state.ruleForm" label-position="left">
- <!-- 详情 -->
- <template v-if="disabled">
- <el-row :gutter="10" class="show-info-form">
- <el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
- <el-form-item label="当前回访人">
- {{ state.orderVisitModel.employeeName }}
- <el-button plain title="智能回访录音" size="small" type="primary" class="ml8" @click="onSmartRecord" v-if="state.smartRecord"
- >智能回访录音
- </el-button>
- <el-button
- plain
- title="人工回访录音"
- size="small"
- type="primary"
- class="ml8"
- @click="recordFile"
- v-if="state.recordingAbsolutePath"
- >人工回访录音</el-button
- >
- </el-form-item>
- </el-col>
- <el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12" v-if="visitCount">
- <el-form-item label="当前工单已回访次数" label-width="140px"> {{ visitCount }}次 </el-form-item>
- </el-col>
- <!-- <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
- <el-form-item label="回访标签">
- <span v-if="state.ruleForm.isPutThrough !== null">{{ state.ruleForm.isPutThrough ? '已接通' : '未接通' }}</span>
- </el-form-item>
- </el-col>-->
- <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" v-if="['ZiGong'].includes(themeConfig.appScope)">
- <el-form-item label="语音评价">
- </el-form-item>
- </el-col>
- <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
- <el-row v-for="item in state.ruleForm.visitDetails" :key="item.id" :gutter="10">
- <!-- 务员评价 -->
- <template v-if="item.visitTarget === 10 && isTelSource">
- <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
- <el-form-item label="话务员评价">
- {{ item.seatEvaluateText }}
- </el-form-item>
- </el-col>
- <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
- <el-form-item label="话务员回访内容">
- {{ item.visitContent }}
- </el-form-item>
- </el-col>
- </template>
- <!-- 部门评价 -->
- <template v-if="item.visitTarget === 20">
- <el-divider content-position="left">
- <el-text tag="b" size="large" type="primary"> {{ item.visitOrgName }} </el-text>
- </el-divider>
- <template v-if="['YiBin'].includes(themeConfig.appScope)">
- <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
- <el-form-item label="部门是否联系">
- {{ item.isContact === null ? '' : item.isContact === true ? '是' : '否' }}
- </el-form-item>
- </el-col>
- <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
- <el-form-item label="处理结果">
- {{ item.volved === null ? '' : item.volved === true ? '已得到解决' : '未得到解决' }}
- </el-form-item>
- </el-col>
- <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" v-if="item.volveConent">
- <el-form-item label="备注" class="formatted-text mb5">
- {{ item.volveConent }}
- </el-form-item>
- </el-col>
- </template>
- <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
- <el-form-item label="部门办件结果">
- {{ item.orgProcessingResults?.dicDataName }}
- </el-form-item>
- </el-col>
- <!-- 不满意才会选择不满意原因 -->
- <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12" v-if="item.orgNoSatisfiedReason && item.orgNoSatisfiedReason.length">
- <el-form-item label="不满意原因">
- {{ item.orgNoSatisfiedReason.map((item) => item.dicDataName).join(',') }}
- </el-form-item>
- </el-col>
- <!-- <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
- <el-form-item label="部门办件态度">
- {{ item.orgHandledAttitude?.dicDataName }}
- </el-form-item>
- </el-col>-->
- <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
- <el-form-item label="部门回访内容">
- {{ item.visitContent }}
- </el-form-item>
- </el-col>
- </template>
- </el-row>
- </el-col>
- <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" v-if="state.orderVisitModel.orgJudge || state.orderVisitModel.seatJudge">
- <el-form-item label="扭转满意度">
- <el-tag v-if="state.orderVisitModel.orgJudge" class="mr10">扭转部门满意度</el-tag>
- <el-tag v-if="state.orderVisitModel.seatJudge">扭转坐席满意度</el-tag>
- </el-form-item>
- </el-col>
- <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" v-if="state.orderVisitModel.judgeStateText">
- <el-form-item label="评判结果">
- <span>{{ state.orderVisitModel.judgeStateText }}</span>
- </el-form-item>
- </el-col>
- <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" v-if="state.orderVisitModel.judgeContent">
- <el-form-item label="评判内容" class="formatted-text mb5">
- <span>{{ state.orderVisitModel.judgeContent }}</span>
- </el-form-item>
- </el-col>
- <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" v-if="['ZiGong'].includes(themeConfig.appScope)">
- <el-form-item label="历史回访记录">
- <ProTable
- ref="proTableRef"
- :columns="columns"
- :data="state.tableData"
- @updateTable="queryList"
- :loading="state.loading"
- :pagination="false"
- border
- :toolButton="false"
- >
- <template #empty>
- 暂无数据
- </template>
- </ProTable>
- </el-form-item>
- </el-col>
- </el-row>
- </template>
- <!-- 编辑 -->
- <template v-else>
- <el-row :gutter="10">
- <el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
- <el-form-item label="当前回访人">
- {{ userInfos.name }}
- <el-button plain title="智能回访录音" size="small" type="primary" class="ml8" @click="onSmartRecord" v-if="state.smartRecord"
- >智能回访录音
- </el-button>
- <el-button
- plain
- title="人工回访录音"
- size="small"
- type="primary"
- class="ml8"
- @click="recordFile"
- v-if="state.recordingAbsolutePath"
- >人工回访录音</el-button
- >
- </el-form-item>
- </el-col>
- <el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
- <el-form-item label="当前工单已回访次数" label-width="140px"> {{ visitCount }}次 </el-form-item>
- </el-col>
- <!-- <el-col :span="24">
- <el-form-item label="回访标签" prop="isPutThrough" :rules="[{ required: false, message: '请选择回访标签', trigger: 'change' }]">
- <el-checkbox v-model="state.ruleForm.isPutThrough">未接通</el-checkbox>
- </el-form-item>
- </el-col>-->
- <el-col :span="24">
- <el-row v-for="(item, index) in state.ruleForm.visitDetails" :key="item.id" :gutter="10">
- <!-- 务员评价 -->
- <template v-if="item.visitTarget === 10 && isTelSource">
- <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" v-if="['ZiGong'].includes(themeConfig.appScope)">
- <el-form-item
- label="语音评价"
- :prop="`visitDetails.${index}.viceEvaluate`"
- :rules="[{ required: true, message: '请选择语音评价', trigger: 'change' }]"
- >
- <el-radio-group v-model="item.viceEvaluate">
- <el-radio v-for="items in seatEvaluate" :key="items.key" :label="items.value" :value="items.key">{{items.value}}</el-radio>
- </el-radio-group>
- </el-form-item>
- </el-col>
- <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
- <el-form-item
- label="话务员评价"
- :prop="`visitDetails.${index}.seatEvaluate`"
- :rules="[{ required: true, message: '请选择话务员评价', trigger: 'change' }]"
- >
- <el-select v-model="item.seatEvaluate" placeholder="请选择话务员评价" class="w100">
- <el-option v-for="items in seatEvaluate" :key="items.key" :label="items.value" :value="items.key" />
- </el-select>
- </el-form-item>
- </el-col>
- <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
- <el-form-item
- label="话务员回访内容"
- :prop="`visitDetails.${index}.visitContent`"
- :rules="[{ required: true, message: '请填写话务员回访内容', trigger: 'blur' }]"
- >
- <common-advice
- @chooseAdvice="chooseAdvice($event, index)"
- v-model="item.visitContent"
- placeholder="请填写话务员回访内容"
- :loading="state.loading"
- :commonEnum="commonEnum.ReturnVisit"
- :minRows="5"
- :maxRows="10"
- drawerWidth="40%"
- />
- </el-form-item>
- </el-col>
- </template>
- <!-- 部门评价 -->
- <template v-if="item.visitTarget === 20">
- <el-divider content-position="left">
- <el-text tag="b" size="large"> {{ item.visitOrgName }} </el-text>
- </el-divider>
- <template v-if="['YiBin'].includes(themeConfig.appScope)">
- <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
- <el-form-item
- label="部门是否联系"
- :prop="`visitDetails.${index}.isContact`"
- :rules="[{ required: true, message: '请选择部门是否联系', trigger: 'change' }]"
- >
- <el-radio-group v-model="item.isContact">
- <el-radio :value="true">是</el-radio>
- <el-radio :value="false">否</el-radio>
- </el-radio-group>
- </el-form-item>
- </el-col>
- <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
- <el-form-item
- label="处理结果"
- :prop="`visitDetails.${index}.volved`"
- :rules="[{ required: true, message: '请选择处理结果', trigger: 'change' }]"
- >
- <el-radio-group v-model="item.volved">
- <el-radio :value="true">已得到解决</el-radio>
- <el-radio :value="false">未得到解决</el-radio>
- </el-radio-group>
- </el-form-item>
- </el-col>
- <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" v-if="item.volved === false">
- <el-form-item
- label=""
- :prop="`visitDetails.${index}.volveConent`"
- :rules="[{ required: false, message: '请填写备注', trigger: 'blur' }]"
- >
- <common-advice
- @chooseAdvice="chooseAdvice($event, index)"
- v-model="item.volveConent"
- placeholder="请填写备注"
- :loading="state.loading"
- :commonEnum="commonEnum.ReturnVisit"
- :minRows="5"
- :maxRows="10"
- drawerWidth="40%"
- />
- </el-form-item>
- </el-col>
- </template>
- <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
- <el-form-item
- label="部门办件结果"
- :prop="`visitDetails.${index}.orgProcessingResults`"
- :rules="[{ required: true, message: '请选择部门办件结果', trigger: 'change' }]"
- >
- <el-select
- v-model="item.orgProcessingResults"
- placeholder="请选择部门办件结果"
- class="w100"
- value-key="dicDataValue"
- @change="
- (val) => {
- item.orgProcessingResults.value = val?.dicDataName;
- item.orgProcessingResults.key = val?.dicDataValue;
- }
- "
- >
- <el-option v-for="items in visitSatisfaction" :key="items.dicDataValue" :label="items.dicDataName" :value="items" />
- </el-select>
- </el-form-item>
- </el-col>
- <!-- 不满意才会选择不满意原因 -->
- <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12" v-if="['1', '2'].includes(item.orgProcessingResults?.key)">
- <el-form-item
- label="不满意原因"
- :prop="`visitDetails.${index}.orgNoSatisfiedReason`"
- :rules="[{ required: true, message: '请选择不满意原因', trigger: 'change' }]"
- >
- <el-select
- v-model="item.orgNoSatisfiedReason"
- placeholder="请选择不满意原因"
- class="w100"
- value-key="dicDataValue"
- multiple
- collapse-tags
- collapse-tags-tooltip
- @change="selectReason($event, index)"
- >
- <el-option v-for="items in dissatisfiedReason" :key="items.dicDataValue" :label="items.dicDataName" :value="items" />
- </el-select>
- </el-form-item>
- </el-col>
- <!-- <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
- <el-form-item
- label="部门办件态度"
- :prop="`visitDetails.${index}.orgHandledAttitude`"
- :rules="[{ required: true, message: '请选择部门办件态度', trigger: 'change' }]"
- >
- <el-select
- v-model="item.orgHandledAttitude"
- placeholder="请选择部门办件态度"
- class="w100"
- value-key="dicDataValue"
- @change="
- (val) => {
- item.orgHandledAttitude.value = val.dicDataName;
- item.orgHandledAttitude.key = val.dicDataValue;
- }
- "
- >
- <el-option v-for="items in visitManner" :key="items.dicDataValue" :label="items.dicDataName" :value="items" />
- </el-select>
- </el-form-item>
- </el-col>-->
- <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
- <el-form-item
- label="部门回访内容"
- :prop="`visitDetails.${index}.visitContent`"
- :rules="[{ required: true, message: '请填写部门回访内容', trigger: 'blur' }]"
- >
- <common-advice
- @chooseAdvice="chooseAdvice($event, index)"
- v-model="item.visitContent"
- d
- placeholder="请填写部门回访内容"
- :loading="state.loading"
- :commonEnum="commonEnum.ReturnVisit"
- :minRows="5"
- :maxRows="10"
- drawerWidth="40%"
- />
- </el-form-item>
- </el-col>
- </template>
- </el-row>
- </el-col>
- <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
- <el-form-item label="扭转满意度" prop="orgJudge" :rules="[{ required: false, message: '请选择扭转满意度', trigger: 'change' }]">
- <el-checkbox v-model="state.ruleForm.orgJudge">扭转部门满意度</el-checkbox>
- <el-checkbox v-model="state.ruleForm.seatJudge">扭转坐席满意度</el-checkbox>
- </el-form-item>
- </el-col>
- <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" v-if="['ZiGong'].includes(themeConfig.appScope)">
- <el-form-item label="历史回访记录">
- <ProTable
- ref="proTableRef"
- :columns="columns"
- :data="state.tableData"
- @updateTable="queryList"
- :loading="state.loading"
- :pagination="false"
- border
- :toolButton="false"
- >
- <template #empty>
- 暂无数据
- </template>
- </ProTable>
- </el-form-item>
- </el-col>
- </el-row>
- </template>
- </el-form>
- </div>
- </el-collapse-item>
- </el-collapse>
- <template #footer v-if="disabled">
- <span class="dialog-footer">
- <el-button @click="closeDialog" class="default-button">关 闭</el-button>
- </span>
- </template>
- <template #footer v-else>
- <span class="dialog-footer">
- <el-button @click="closeDialog" class="default-button">取 消</el-button>
- <el-button type="primary" @click="onRedo" :loading="state.loading" v-if="['ZiGong'].includes(themeConfig.appScope)">重办</el-button>
- <el-button type="primary" @click="onSubmit(ruleFormRef)" :loading="state.loading">保存</el-button>
- </span>
- </template>
- </el-dialog>
- <!-- 播放录音 -->
- <play-record ref="playRecordRef" />
- <!-- 回访重办 -->
- <visit-redo ref="visitRedoRef" />
- </template>
- <script setup lang="tsx" name="orderFollowUpDetail">
- import { computed, defineAsyncComponent, onBeforeUnmount, onMounted, reactive, ref, watch } from 'vue';
- import { ElMessage, FormInstance } from 'element-plus';
- import { commonEnum } from '@/utils/constants';
- import { storeToRefs } from 'pinia';
- import { useUserInfo } from '@/stores/userInfo';
- import dayjs from 'dayjs';
- import { visitDetailBaseData, visitOrder } from '@/api/business/visit';
- import mittBus from '@/utils/mitt';
- import { callCenterOutbound } from '@/utils/callCenter';
- import { useThemeConfig } from '@/stores/themeConfig';
- // 引入组件
- const CommonAdvice = defineAsyncComponent(() => import('@/components/CommonAdvice/index.vue')); // 常用意见
- const PlayRecord = defineAsyncComponent(() => import('@/components/PlayRecord/index.vue')); // 播放录音
- const VisitRedo = defineAsyncComponent(() => import('@/views/business/visit/component/Visit-redo.vue')); // 回访重办
- // 定义子组件向父组件传值/事件
- const emit = defineEmits(['updateList']);
- // 定义变量内容
- const state = reactive<any>({
- collapseArr: ['1', '2', '3'], // 折叠面板
- dialogVisible: false, // 是否显示弹窗
- loading: false, // 是否显示加载
- transform: 'translate(0px, 0px)', // 附件弹窗位置
- smartRecord: null,
- ruleForm: {
- isPutThrough: false, //未接通
- visitDetails: {},
- orgJudge: false, // 扭转部门满意度
- seatJudge: false, // 扭转坐席满意度
- },
- orderDetail: {}, // 工单详情
- orderVisitModel: {}, // 回访详情
- recordingAbsolutePath: '', // 录音文件
- tableData:[], //回访记录列表
- });
- const ruleFormRef = ref<RefType>();
- const storesUserInfo = useUserInfo();
- const { userInfos } = storeToRefs(storesUserInfo); // 用户信息
- const visitCount = ref<number>(0); // 回访次数
- const seatEvaluate = ref<EmptyArrayType>(); // 话务员评价
- const viceEvaluate = ref<EmptyArrayType>(); // 语音评价
- const dissatisfiedReason = ref<EmptyArrayType>(); // 不满意原因
- const visitManner = ref<EmptyArrayType>(); // 部门办件态度
- const visitSatisfaction = ref<EmptyArrayType>(); // 部门办件结果
- const visitId = ref<string>(''); // 回访id
- const dialogTitle = ref<string>('回访'); // 弹窗标题
- const aiVisitVoiceBaseUrl = ref(''); // 智能回访录音前缀
- const storesThemeConfig = useThemeConfig();
- const { themeConfig } = storeToRefs(storesThemeConfig);
- const getBaseData = async (id: string) => {
- state.loading = true;
- try {
- const { result } = await visitDetailBaseData(id);
- visitCount.value = result?.visitCount ?? 0;
- seatEvaluate.value = result?.seatEvaluate ?? [];
- viceEvaluate.value = result?.viceEvaluate ?? [];
- dissatisfiedReason.value = result?.dissatisfiedReason ?? [];
- visitManner.value = result?.visitManner ?? [];
- visitSatisfaction.value = result?.visitSatisfaction ?? [];
- visitId.value = result?.orderVisitModel?.id ?? '';
- state.orderDetail = result?.orderVisitModel?.order ?? {};
- state.orderVisitModel = result?.orderVisitModel ?? {};
- state.recordingAbsolutePath = result?.recordingAbsolutePath ?? '';
- state.smartRecord = result?.orderVisitModel.recordUrl ?? '';
- aiVisitVoiceBaseUrl.value = result.aiVisitVoiceBaseUrl;
- if (result?.orderVisitModel?.isPutThrough !== null) {
- state.ruleForm.isPutThrough = !result?.orderVisitModel?.isPutThrough ?? false;
- } else {
- state.ruleForm.isPutThrough = false;
- }
- state.ruleForm.visitDetails = result?.orderVisitModel?.orderVisitDetails ?? {};
- for (let i of state.ruleForm.visitDetails) {
- if (i.visitTarget === 20) {
- if (i.orgProcessingResults) {
- i.orgProcessingResults = {
- ...i.orgProcessingResults,
- dicDataName: i.orgProcessingResults.value,
- dicDataValue: i.orgProcessingResults.key,
- };
- }
- if (i.orgNoSatisfiedReason) {
- i.orgNoSatisfiedReason = i.orgNoSatisfiedReason.map((item: any) => {
- return {
- ...item,
- dicDataName: item.value,
- dicDataValue: item.key,
- };
- });
- } else {
- i.orgNoSatisfiedReason = [];
- }
- if (i.orgHandledAttitude) {
- i.orgHandledAttitude = {
- ...i.orgHandledAttitude,
- dicDataName: i.orgHandledAttitude.value,
- dicDataValue: i.orgHandledAttitude.key,
- };
- }
- }
- }
- state.loading = false;
- } catch (error) {
- console.log(error);
- state.loading = false;
- }
- };
- const notGetThrough = ref(false);
- watch(
- () => state.ruleForm.isPutThrough,
- (val) => {
- notGetThrough.value = !val;
- },
- { immediate: true, deep: true }
- );
- // 判断当前工单是否是电话来源
- const isTelSource = computed(() => {
- return state.orderDetail?.sourceChannelCode === 'RGDH';
- });
- // 打开弹窗
- const openDialog = (row: any, type: string = '回访') => {
- if (!row.id || !row) {
- ElMessage.warning('传入回访ID不正确');
- return;
- }
- state.dialogVisible = true;
- getBaseData(row.id);
- dialogTitle.value = type;
- };
- const disabled = computed(() => {
- return ['回访明细', '回访详情'].includes(dialogTitle.value);
- });
- // 设置抽屉
- const dialogRef = ref<RefType>(); // 弹窗ref
- const mouseup = () => {
- state.transform = dialogRef.value.dialogContentRef.$el.style.transform;
- };
- // 关闭弹窗
- const closeDialog = () => {
- state.dialogVisible = false;
- };
- // 查看人工回访录音文件
- const playRecordRef = ref<RefType>();
- const recordFile = () => {
- playRecordRef.value.openDialog(state.orderDetail.callId)
- };
- // 查看智能回访录音
- const onSmartRecord = () => {
- playRecordRef.value.playRecord(aiVisitVoiceBaseUrl.value + state.smartRecord);
- };
- // 呼叫
- const onCall = (phoneNumber: string) => {
- callCenterOutbound(phoneNumber);
- };
- // 选择不满意原因
- const selectReason = (val: any, index: number | string) => {
- state.ruleForm.visitDetails[index].orgNoSatisfiedReason = val.map((item: any) => {
- return {
- ...item,
- value: item.dicDataName,
- key: item.dicDataValue,
- };
- });
- };
- const close = () => {
- ruleFormRef.value?.clearValidate();
- ruleFormRef.value?.resetFields();
- };
- // 提交
- const onSubmit = (formEl: FormInstance | undefined) => {
- if (!formEl) return;
- formEl.validate((valid: boolean) => {
- if (!valid) return;
- state.loading = true;
- let request = {
- ...state.ruleForm,
- isPutThrough: !state.ruleForm.isPutThrough,
- ...state.visitDetails,
- id: visitId.value,
- };
- if (callId.value) {
- request.callId = callId.value;
- }
- visitOrder(request)
- .then(() => {
- ElMessage.success('操作成功');
- state.loading = false;
- closeDialog();
- emit('updateList');
- })
- .catch(() => {
- state.loading = false;
- });
- });
- };
- // 选中常用意见
- const chooseAdvice = (item: any, index: number | string) => {
- if (state.ruleForm.visitDetails[index].visitContent === null) {
- state.ruleForm.visitDetails[index].visitContent = '';
- }
- state.ruleForm.visitDetails[index].visitContent += item.content;
- }
- // 重办
- const visitRedoRef = ref<RefType>();
- const onRedo = ()=>{
- visitRedoRef.value.openDialog(state.orderDetail)
- }
- const queryList = ()=>{
- }
- // 表格配置项
- const columns = ref<any[]>([
- { prop: 'order.no', label: '语音评价' },
- { prop: 'order.isProvinceText', label: '话务员评价'},
- { prop: 'order.title', label: '部门名称'},
- { prop: 'order.sourceChannel', label: '部门办件结果' },
- { prop: 'visitStateText', label: '部门办件态度' },
- { prop: 'visitTypeText', label: '部门评价内容'},
- {
- prop: 'visitTime',
- label: '回访时间',
- minWidth: 160,
- render: (scope) => {
- return <span>{formatDate(scope.row.visitTime, 'YYYY-mm-dd HH:MM:SS')}</span>;
- },
- },
- ]);
- const callId = ref<string>('');
- onMounted(() => {
- mittBus.on('outboundConnect', (data) => {
- console.log(data, '外呼已经接通辣');
- if (data.callNumber === state.orderDetail.contact) callId.value = data.callId;
- });
- });
- onBeforeUnmount(() => {
- mittBus.off('outboundConnect');
- });
- defineExpose({
- openDialog,
- closeDialog,
- });
- </script>
- <style lang="scss" scoped>
- .collapse-box {
- :deep(.el-collapse-item__header) {
- background-color: var(--hotline-bg-main-color);
- height: 40px;
- border-radius: var(--el-border-radius-base);
- }
- :deep(.el-collapse-item__content) {
- padding-bottom: 10px !important;
- }
- .collapse-container {
- padding: 10px;
- .plug-container {
- border: var(--el-border);
- border-radius: var(--el-border-radius-base);
- margin-bottom: 15px;
- &:last-child {
- margin-bottom: 0;
- }
- .plug-container-title {
- padding: 10px 15px;
- font-weight: bold;
- border-bottom: var(--el-border);
- font-size: var(--el-font-size-medium);
- }
- }
- }
- }
- </style>
- <style lang="scss">
- .demo-tabs-form {
- .title {
- font-size: var(--el-font-size-medium);
- padding: 10px 15px 20px 15px;
- }
- }
- </style>
|