|
@@ -11,7 +11,7 @@
|
|
|
@opened="opened"
|
|
|
>
|
|
|
<splitpanes Vertical>
|
|
|
- <pane min-size="60" max-size="60" size="60" style="max-height: calc(80vh - 111px); overflow-y: auto">
|
|
|
+ <pane min-size="60" max-size="60" size="60" style="max-height: calc(84vh - 111px); overflow-y: auto">
|
|
|
<p class="border-title mb10">工单详情</p>
|
|
|
<el-form :model="state.orderDetail" label-width="90px" v-loading="state.loading" class="show-info-form">
|
|
|
<el-row :gutter="10">
|
|
@@ -106,15 +106,47 @@
|
|
|
<!-- 受理质检才有质检录音撰写 -->
|
|
|
<template v-if="state.source === 1">
|
|
|
<p class="border-title mb10 mt20">录音转写</p>
|
|
|
- <!-- 未转写 -->
|
|
|
+ <!-- 未转写 -->
|
|
|
<template v-if="!state.qualityDetail.transferState">
|
|
|
<el-empty description="无录音转写内容" :image-size="100" style="padding: 0">
|
|
|
<el-button type="primary" @click="onTransfer">录音转写</el-button>
|
|
|
</el-empty>
|
|
|
</template>
|
|
|
- <!-- 转写中 -->
|
|
|
+ <!-- 转写中 -->
|
|
|
<el-empty description="录音转写中,请稍后" :image-size="100" style="padding: 0" v-if="state.qualityDetail.transferState === 1"> </el-empty>
|
|
|
- <!-- 转写完成 -->
|
|
|
+ <!-- 转写完成 -->
|
|
|
+ <template v-if="state.qualityDetail.transferState === 2">
|
|
|
+ <template v-if="transformContent && transformContent.length">
|
|
|
+ <template v-if="editMode">
|
|
|
+ <el-scrollbar class="transfer-content" v-loading="contentLoading">
|
|
|
+ <div v-for="(item, index) in transformContent" :key="index" class="transfer-content-item">
|
|
|
+ <div>
|
|
|
+ <span>{{ item.type === 0 ? '坐席:' : '市民:' }}</span
|
|
|
+ ><el-input v-model="item.reviseContent"></el-input>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </el-scrollbar>
|
|
|
+ <el-button type="primary" @click="saveTransferContent" class="ml20">保存并应用</el-button>
|
|
|
+ </template>
|
|
|
+ <template v-else>
|
|
|
+ <el-scrollbar class="transfer-content" v-loading="contentLoading">
|
|
|
+ <div v-for="(item, index) in transformContent" :key="index" class="transfer-content-item">
|
|
|
+ <div>
|
|
|
+ <span>{{ item.type === 0 ? '坐席:' : '市民:' }}</span>
|
|
|
+ <div v-html="showKeyWord(item.reviseContent, item.prohibited)" class="formatted-text"></div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </el-scrollbar>
|
|
|
+ <el-button type="primary" @click="editTransferContent" class="ml20">编辑转写内容</el-button>
|
|
|
+ </template>
|
|
|
+ </template>
|
|
|
+ <el-empty description="无录音转写内容" :image-size="100" style="padding: 0" v-else>
|
|
|
+ </el-empty>
|
|
|
+ </template>
|
|
|
+ <!-- 转写失败 -->
|
|
|
+ <template v-if="state.qualityDetail.transferState === 3">
|
|
|
+ <el-empty description="录音转写失败" :image-size="100" style="padding: 0"> </el-empty>
|
|
|
+ </template>
|
|
|
</template>
|
|
|
</pane>
|
|
|
<pane style="max-height: calc(80vh - 111px); overflow-y: auto">
|
|
@@ -209,7 +241,7 @@ import { ElMessage, ElMessageBox, FormInstance } from 'element-plus';
|
|
|
import { formatDate, formatDuration } from '@/utils/formatTime';
|
|
|
import { templateList } from '@/api/quality/template';
|
|
|
import Other from '@/utils/other';
|
|
|
-import { qualityUpdate, qualityDetail, qualityRecordTransfer } from '@/api/quality';
|
|
|
+import { qualityUpdate, qualityDetail, qualityRecordTransfer, qualityContentUpdate } from '@/api/quality';
|
|
|
import { useThemeConfig } from '@/stores/themeConfig';
|
|
|
import { storeToRefs } from 'pinia';
|
|
|
import { useUserInfo } from '@/stores/userInfo';
|
|
@@ -255,6 +287,10 @@ const openDialog = (row: any, source?: string | number | undefined) => {
|
|
|
getQualityDetail(row.id, source);
|
|
|
};
|
|
|
// 获取质检详情
|
|
|
+// 转写内容
|
|
|
+const transformContent = ref<EmptyArrayType>([]);
|
|
|
+// 编辑模式
|
|
|
+const editMode = ref<boolean>(false);
|
|
|
const getQualityDetail = async (id: string, source?: string | number | undefined) => {
|
|
|
try {
|
|
|
if (source) {
|
|
@@ -269,6 +305,7 @@ const getQualityDetail = async (id: string, source?: string | number | undefined
|
|
|
multipleSelection.value = tableData.value.filter((v: any) => v.check === true);
|
|
|
state.orderDetail = qualityRes.result?.order ?? {};
|
|
|
state.visit = qualityRes.result?.visit ?? {};
|
|
|
+ transformContent.value = Other.deepClone(qualityRes.result.transfer);
|
|
|
state.loading = false;
|
|
|
switch (source) {
|
|
|
case 1:
|
|
@@ -391,12 +428,12 @@ const onTransfer = () => {
|
|
|
autofocus: false,
|
|
|
})
|
|
|
.then(() => {
|
|
|
- state.loading = true;
|
|
|
- qualityRecordTransfer([{id:qualityId.value}])
|
|
|
+ state.loading = true;
|
|
|
+ qualityRecordTransfer([{ id: qualityId.value }])
|
|
|
.then(() => {
|
|
|
ElMessage.success('转写任务创建成功');
|
|
|
getQualityDetail(qualityId.value, state.source);
|
|
|
- emit('updateList');
|
|
|
+ emit('updateList');
|
|
|
})
|
|
|
.catch((err) => {
|
|
|
console.log(err);
|
|
@@ -465,6 +502,47 @@ const getEnableAcceptType = () => {
|
|
|
});
|
|
|
}
|
|
|
};
|
|
|
+// 高亮关键词
|
|
|
+const showKeyWord = (val: string[], keywordString: string) => {
|
|
|
+ if (!keywordString) return val;
|
|
|
+ console.log(keywordString, '111');
|
|
|
+ const keywordArr = keywordString.split(':');
|
|
|
+ console.log(keywordArr, '1111');
|
|
|
+ let str: any = val;
|
|
|
+ if (keywordArr && keywordArr.length) {
|
|
|
+ // 2.定制关键词对应正则
|
|
|
+ keywordArr.forEach((e) => {
|
|
|
+ let regStr = '' + `(${e})`;
|
|
|
+ let reg = new RegExp(regStr, 'g');
|
|
|
+ // 3.正则替换,关键词飘红
|
|
|
+ str = str.replace(reg, '<span class="color-danger font-bold"">' + e + '</span>');
|
|
|
+ });
|
|
|
+ }
|
|
|
+ return str;
|
|
|
+};
|
|
|
+// 编辑转写内容
|
|
|
+const editTransferContent = () => {
|
|
|
+ editMode.value = !editMode.value;
|
|
|
+};
|
|
|
+// 修改录音转写内容保存
|
|
|
+const contentLoading = ref(false);
|
|
|
+const saveTransferContent = () => {
|
|
|
+ const request = {
|
|
|
+ id: qualityId.value,
|
|
|
+ transfer: transformContent.value,
|
|
|
+ };
|
|
|
+ contentLoading.value = true;
|
|
|
+ qualityContentUpdate(request)
|
|
|
+ .then(() => {
|
|
|
+ ElMessage.success('保存成功');
|
|
|
+ editMode.value = !editMode.value;
|
|
|
+ contentLoading.value = false;
|
|
|
+ })
|
|
|
+ .catch((err) => {
|
|
|
+ console.log(err);
|
|
|
+ contentLoading.value = false;
|
|
|
+ });
|
|
|
+};
|
|
|
// 保存
|
|
|
const onSubmit = (formEl: FormInstance | undefined) => {
|
|
|
if (!formEl) return;
|
|
@@ -509,3 +587,26 @@ defineExpose({
|
|
|
closeDialog,
|
|
|
});
|
|
|
</script>
|
|
|
+<style scoped lang="scss">
|
|
|
+.transfer-content {
|
|
|
+ border: var(--el-border);
|
|
|
+ padding: 10px;
|
|
|
+ margin: 10px 20px;
|
|
|
+ max-height: 300px;
|
|
|
+ overflow: auto;
|
|
|
+ &-item {
|
|
|
+ margin-bottom: 5px;
|
|
|
+ div {
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ width: 100%;
|
|
|
+ span {
|
|
|
+ width: 50px;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ &:last-child {
|
|
|
+ margin-bottom: 0;
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+</style>
|