Browse Source

reactor:对接智能应答转工单;修复工单保存问题;退回如果在审核中不能退回提示;

zhangchong 9 tháng trước cách đây
mục cha
commit
5b3dec257d

+ 3 - 3
.env.development

@@ -3,11 +3,11 @@ VITE_MODE_NAME=development
 # 防止部署多套系统到同一域名不同目录时,变量共用的问题 设置不同的前缀
 VITE_STORAGE_NAME=dev
 # 基础请求地址
-VITE_API_URL=http://110.188.24.28:50300
+VITE_API_URL=http://110.188.24.28:50100
 # 数据共享平台请求地址
 VITE_DATASHARE_API_YRL=http://ds.12345lm.cn
 # socket API
-VITE_API_SOCKET_URL=http://110.188.24.28:50300/hubs/hotline
+VITE_API_SOCKET_URL=http://110.188.24.28:50100/hubs/hotline
 # 上传 API
 VITE_API_UPLOAD_URL=http://110.188.24.28:50120
 # 文件上传地址前缀
@@ -25,4 +25,4 @@ VITE_JTHS_API_URL=http://118.121.58.161:19021
 # 捷通华声AppKey
 VITE_JTHS_APPKEY=MTAwMDAx
 # 当前地州市
-VITE_CURRENT_CITY=zigong
+VITE_CURRENT_CITY=yibin

+ 12 - 0
src/api/tels/callLog.ts

@@ -61,3 +61,15 @@ export const callLogLink = (data: object) => {
 		data,
 	});
 };
+/**
+ * @description 通话记录转写工单 智能应答
+ * @param {object} data
+ * @return {*}
+ */
+export const callLogTranscription = (data: object) => {
+	return request({
+		url: `/api/v1/Call/calls/transliteration`,
+		method: 'post',
+		data,
+	});
+};

+ 18 - 10
src/components/ProTable/index.vue

@@ -611,18 +611,26 @@ const height = computed(() => {
 	flex-direction: column;
 	height: v-bind(height);
 	flex: 1;
+
+	.table-header {
+		margin-bottom: 10px;
+		display: flex;
+		justify-content: space-between;
+
+		.header-button-lf {
+			flex: 1;
+		}
+
+		.header-button-ri {
+		}
+	}
+
 	.el-table {
 		flex: 1;
 	}
-}
-.table-header {
-	margin-bottom: 10px;
-	display: flex;
-	justify-content: space-between;
-}
-.header-button-lf {
-	flex: 1;
-}
-.header-button-ri {
+
+	.table-search-content {
+		flex-shrink: 0;
+	}
 }
 </style>

+ 55 - 54
src/views/business/visit/index.vue

@@ -54,64 +54,11 @@
 										<el-button @click="resetQuery(ruleFormRef)" class="default-button" :loading="state.loading">
 											<SvgIcon name="ele-Refresh" class="mr5" />重置
 										</el-button>
-										<el-button @click="drawer = true" class="default-button"> <SvgIcon name="ele-Search" class="mr5" />高级查询</el-button>
+										<el-button @click="drawer = true" class="default-button"> <SvgIcon name="ele-Search" class="mr5" />更多查询</el-button>
 								</el-form-item>
 							</el-col>
 						</el-row>
 					</el-form>
-					<el-drawer v-model="drawer" title="高级查询" size="500px">
-						<el-form :model="state.queryParams" ref="drawerRuleFormRef" @submit.native.prevent label-width="100px">
-							<el-form-item label="归档类型" prop="FiledType">
-								<el-select v-model="state.queryParams.FiledType" placeholder="请选择归档类型" @change="handleQuery" clearable>
-									<el-option label="中心归档" value="10" />
-									<el-option label="部门归档" value="20" />
-								</el-select>
-							</el-form-item>
-							<el-form-item label="是否会签" prop="IsCountersign">
-								<el-select v-model="state.queryParams.IsCountersign" placeholder="请选择是否会签" @change="handleQuery" clearable>
-									<el-option label="是" value="true" />
-									<el-option label="否" value="false" />
-								</el-select>
-							</el-form-item>
-							<el-form-item label="回访状态" prop="VisitState">
-								<el-select v-model="state.queryParams.VisitState" placeholder="请选择回访状态" @change="handleQuery" clearable>
-									<el-option v-for="item in state.visitStateOptions" :value="item.value" :key="item.value" :label="item.label" />
-								</el-select>
-							</el-form-item>
-							<el-form-item label="回访方式" prop="VisitType">
-								<el-select v-model="state.queryParams.VisitType" placeholder="请选择回访方式" @change="handleQuery" clearable>
-									<el-option v-for="item in state.visitTypeOptions" :value="item.key" :key="item.key" :label="item.value" />
-								</el-select>
-							</el-form-item>
-              <el-form-item label="回访人" prop="EmployeeName">
-                <el-input v-model="state.queryParams.EmployeeName" placeholder="回访人" clearable @keyup.enter="handleQuery" />
-              </el-form-item>
-              <el-form-item label="回访时间" prop="crTime">
-                <el-date-picker
-                    v-model="state.queryParams.crTime"
-                    type="datetimerange"
-                    unlink-panels
-                    range-separator="至"
-                    start-placeholder="开始时间"
-                    end-placeholder="结束时间"
-                    :shortcuts="shortcuts"
-                    @change="handleQuery"
-                    value-format="YYYY-MM-DD[T]HH:mm:ss"
-                    :default-time="defaultTimeStartEnd"
-                />
-              </el-form-item>
-              <el-form-item label="有效智能回访" prop="IsEffectiveAiVisit">
-                <el-select v-model="state.queryParams.IsEffectiveAiVisit" placeholder="请选择有效智能回访" @change="handleQuery" clearable>
-                  <el-option label="是" value="true" />
-                  <el-option label="否" value="false" />
-                </el-select>
-              </el-form-item>
-						</el-form>
-						<template #footer>
-              <el-button type="primary" @click="handleQuery" :loading="state.loading"> <SvgIcon name="ele-Search" class="mr5" />查询 </el-button>
-							<el-button @click="resetQuery(drawerRuleFormRef)" class="default-button"> <SvgIcon name="ele-Refresh" class="mr5" />重置 </el-button>
-						</template>
-					</el-drawer>
 				</template>
 				<template #title="{ row }">
 					<order-detail :order="row.order" @updateList="queryList">{{ row.order?.title }}</order-detail>
@@ -133,6 +80,60 @@
 				</template>
 			</ProTable>
 		</div>
+		<!--	更多查询	-->
+		<el-drawer v-model="drawer" title="更多查询" size="500px">
+			<el-form :model="state.queryParams" ref="drawerRuleFormRef" @submit.native.prevent label-width="100px">
+				<el-form-item label="归档类型" prop="FiledType">
+					<el-select v-model="state.queryParams.FiledType" placeholder="请选择归档类型" @change="handleQuery" clearable>
+						<el-option label="中心归档" value="10" />
+						<el-option label="部门归档" value="20" />
+					</el-select>
+				</el-form-item>
+				<el-form-item label="是否会签" prop="IsCountersign">
+					<el-select v-model="state.queryParams.IsCountersign" placeholder="请选择是否会签" @change="handleQuery" clearable>
+						<el-option label="是" value="true" />
+						<el-option label="否" value="false" />
+					</el-select>
+				</el-form-item>
+				<el-form-item label="回访状态" prop="VisitState">
+					<el-select v-model="state.queryParams.VisitState" placeholder="请选择回访状态" @change="handleQuery" clearable>
+						<el-option v-for="item in state.visitStateOptions" :value="item.value" :key="item.value" :label="item.label" />
+					</el-select>
+				</el-form-item>
+				<el-form-item label="回访方式" prop="VisitType">
+					<el-select v-model="state.queryParams.VisitType" placeholder="请选择回访方式" @change="handleQuery" clearable>
+						<el-option v-for="item in state.visitTypeOptions" :value="item.key" :key="item.key" :label="item.value" />
+					</el-select>
+				</el-form-item>
+				<el-form-item label="回访人" prop="EmployeeName">
+					<el-input v-model="state.queryParams.EmployeeName" placeholder="回访人" clearable @keyup.enter="handleQuery" />
+				</el-form-item>
+				<el-form-item label="回访时间" prop="crTime">
+					<el-date-picker
+						v-model="state.queryParams.crTime"
+						type="datetimerange"
+						unlink-panels
+						range-separator="至"
+						start-placeholder="开始时间"
+						end-placeholder="结束时间"
+						:shortcuts="shortcuts"
+						@change="handleQuery"
+						value-format="YYYY-MM-DD[T]HH:mm:ss"
+						:default-time="defaultTimeStartEnd"
+					/>
+				</el-form-item>
+				<el-form-item label="有效智能回访" prop="IsEffectiveAiVisit">
+					<el-select v-model="state.queryParams.IsEffectiveAiVisit" placeholder="请选择有效智能回访" @change="handleQuery" clearable>
+						<el-option label="是" value="true" />
+						<el-option label="否" value="false" />
+					</el-select>
+				</el-form-item>
+			</el-form>
+			<template #footer>
+				<el-button type="primary" @click="handleQuery" :loading="state.loading"> <SvgIcon name="ele-Search" class="mr5" />查询 </el-button>
+				<el-button @click="resetQuery(drawerRuleFormRef)" class="default-button"> <SvgIcon name="ele-Refresh" class="mr5" />重置 </el-button>
+			</template>
+		</el-drawer>
 		<!-- 回访详情 -->
 		<visit-detail-com ref="visitDetailRef" @updateList="queryList" />
 	</div>

+ 51 - 51
src/views/business/visit/smart.vue

@@ -27,59 +27,9 @@
 						<el-form-item>
 							<el-button type="primary" @click="handleQuery" :loading="state.loading"> <SvgIcon name="ele-Search" class="mr5" />查询 </el-button>
 							<el-button @click="resetQuery(ruleFormRef)" class="default-button"> <SvgIcon name="ele-Refresh" class="mr5" />重置 </el-button>
-							<el-button @click="drawer = true" class="default-button"> <SvgIcon name="ele-Search" class="mr5" />高级查询</el-button>
+							<el-button @click="drawer = true" class="default-button"> <SvgIcon name="ele-Search" class="mr5" />更多查询</el-button>
 						</el-form-item>
 					</el-form>
-          <el-drawer v-model="drawer" title="高级查询" size="500px">
-            <el-form :model="state.queryParams" ref="drawerRuleFormRef" @submit.native.prevent label-width="90px">
-              <el-form-item label="创建时间" prop="crTime">
-                <el-date-picker
-                    v-model="state.queryParams.crTime"
-                    type="datetimerange"
-                    unlink-panels
-                    range-separator="至"
-                    start-placeholder="开始时间"
-                    end-placeholder="结束时间"
-                    :shortcuts="shortcuts"
-                    @change="handleQuery"
-                    value-format="YYYY-MM-DD[T]HH:mm:ss"
-                    :default-time="defaultTimeStartEnd"
-                />
-              </el-form-item>
-              <el-form-item label="开始时间" prop="startTime">
-                <el-date-picker
-                    v-model="state.queryParams.startTime"
-                    type="datetimerange"
-                    unlink-panels
-                    range-separator="至"
-                    start-placeholder="开始时间"
-                    end-placeholder="结束时间"
-                    :shortcuts="shortcuts"
-                    @change="handleQuery"
-                    value-format="YYYY-MM-DD[T]HH:mm:ss"
-                    :default-time="defaultTimeStartEnd"
-                />
-              </el-form-item>
-              <el-form-item label="结束时间" prop="endTime">
-                <el-date-picker
-                    v-model="state.queryParams.endTime"
-                    type="datetimerange"
-                    unlink-panels
-                    range-separator="至"
-                    start-placeholder="开始时间"
-                    end-placeholder="结束时间"
-                    :shortcuts="shortcuts"
-                    @change="handleQuery"
-                    value-format="YYYY-MM-DD[T]HH:mm:ss"
-                    :default-time="defaultTimeStartEnd"
-                />
-              </el-form-item>
-            </el-form>
-            <template #footer>
-              <el-button type="primary" @click="handleQuery" :loading="state.loading"> <SvgIcon name="ele-Search" class="mr5" />查询 </el-button>
-              <el-button @click="resetQuery(drawerRuleFormRef)" class="default-button"> <SvgIcon name="ele-Refresh" class="mr5" />重置 </el-button>
-            </template>
-          </el-drawer>
 				</template>
 				<template #tableHeader="scope">
 					<el-button type="primary" @click="onAddVisit" v-auth="'business:visit:smart:add'" :loading="state.loading">
@@ -122,6 +72,56 @@
 				</template>
 			</ProTable>
 		</div>
+		<el-drawer v-model="drawer" title="更多查询" size="500px">
+			<el-form :model="state.queryParams" ref="drawerRuleFormRef" @submit.native.prevent label-width="90px">
+				<el-form-item label="创建时间" prop="crTime">
+					<el-date-picker
+						v-model="state.queryParams.crTime"
+						type="datetimerange"
+						unlink-panels
+						range-separator="至"
+						start-placeholder="开始时间"
+						end-placeholder="结束时间"
+						:shortcuts="shortcuts"
+						@change="handleQuery"
+						value-format="YYYY-MM-DD[T]HH:mm:ss"
+						:default-time="defaultTimeStartEnd"
+					/>
+				</el-form-item>
+				<el-form-item label="开始时间" prop="startTime">
+					<el-date-picker
+						v-model="state.queryParams.startTime"
+						type="datetimerange"
+						unlink-panels
+						range-separator="至"
+						start-placeholder="开始时间"
+						end-placeholder="结束时间"
+						:shortcuts="shortcuts"
+						@change="handleQuery"
+						value-format="YYYY-MM-DD[T]HH:mm:ss"
+						:default-time="defaultTimeStartEnd"
+					/>
+				</el-form-item>
+				<el-form-item label="结束时间" prop="endTime">
+					<el-date-picker
+						v-model="state.queryParams.endTime"
+						type="datetimerange"
+						unlink-panels
+						range-separator="至"
+						start-placeholder="开始时间"
+						end-placeholder="结束时间"
+						:shortcuts="shortcuts"
+						@change="handleQuery"
+						value-format="YYYY-MM-DD[T]HH:mm:ss"
+						:default-time="defaultTimeStartEnd"
+					/>
+				</el-form-item>
+			</el-form>
+			<template #footer>
+				<el-button type="primary" @click="handleQuery" :loading="state.loading"> <SvgIcon name="ele-Search" class="mr5" />查询 </el-button>
+				<el-button @click="resetQuery(drawerRuleFormRef)" class="default-button"> <SvgIcon name="ele-Refresh" class="mr5" />重置 </el-button>
+			</template>
+		</el-drawer>
 		<!--  选择需要智能回访的工单  -->
 		<smart-visit-add ref="smartVisitAddRef" @updateList="queryList" />
 		<!--  回访明细  -->

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 40 - 960
src/views/tels/callLog/ybCallLog.vue


+ 46 - 16
src/views/todo/seats/accept/ybAccept.vue

@@ -72,7 +72,7 @@
 										</el-form-item>
 									</template>
 									<!-- 来电弹单 -->
-									<template v-if="state.createBy === 'tel'">
+									<template v-if="['tel', 'transfer'].includes(state.createBy)">
 										<el-form-item label="来源渠道" prop="channel">
 											<el-select v-model="state.ruleForm.channel" placeholder="请选择来源渠道" class="w100" value-key="dicDataValue" disabled>
 												<el-option v-for="item in state.channelOptions" :value="item" :key="item.dicDataValue" :label="item.dicDataName" />
@@ -94,7 +94,7 @@
 										<el-form-item label="转接来源" prop="transferPhone"> 暂无 </el-form-item>
 									</template>
 									<!-- 来电弹单 -->
-									<template v-if="state.createBy === 'tel'">
+									<template v-if="['tel', 'transfer'].includes(state.createBy)">
 										<el-form-item label="转接来源" prop="transferPhone">
 											<span>[{{ state.ruleForm.transferPhone }}]</span>
 										</el-form-item>
@@ -115,7 +115,7 @@
 										</el-form-item>
 									</template>
 									<!-- 来电弹单 -->
-									<template v-if="state.createBy === 'tel'">
+									<template v-if="['tel', 'transfer'].includes(state.createBy)">
 										<el-form-item label="来电号码" prop="fromPhone">
 											<el-input v-model="state.ruleForm.fromPhone" placeholder="请填写来电号码" disabled> </el-input>
 										</el-form-item>
@@ -135,7 +135,7 @@
 											<span>{{ state.ruleForm.acceptorName }}</span>
 										</template>
 										<!-- 来电弹单 -->
-										<template v-if="state.createBy === 'tel'">
+										<template v-if="['tel', 'transfer'].includes(state.createBy)">
 											<span>{{ state.ruleForm.acceptorName }}</span>
 										</template>
 										<!-- 互联网来信 -->
@@ -283,7 +283,7 @@
 											multiple
 											@change="changeFocusEvent"
 										>
-                      <el-option v-for="item in state.focusOnEvents" :key="item.dicDataValue" :label="item.dicDataName" :value="item.dicDataValue" />
+											<el-option v-for="item in state.focusOnEvents" :key="item.dicDataValue" :label="item.dicDataName" :value="item.dicDataValue" />
 										</el-select>
 									</el-form-item>
 								</el-col>
@@ -485,15 +485,15 @@
 								<el-col :xs="24" :sm="12" :md="24" :lg="24" :xl="24">
 									<el-form-item>
 										<el-button class="default-button" @click="onCancel" :loading="buttonLoading"> 取消 </el-button>
-                    <!--                    <el-button class="default-button" @click="save(ruleFormRef)" :loading="buttonLoading" :disabled="isSaveSuccess"> 保存 </el-button>
+										<!--                    <el-button class="default-button" @click="save(ruleFormRef)" :loading="buttonLoading" :disabled="isSaveSuccess"> 保存 </el-button>
                     <el-button type="primary" @click="submit(ruleFormRef)" :loading="buttonLoading" v-if="canHandle" :disabled="!isSaveSuccess">
                       办理
                     </el-button>-->
-                    <el-button class="default-button" @click="save(ruleFormRef)" :loading="buttonLoading" v-if="!isSaveSuccess"> 保存 </el-button>
-                    <el-button type="primary" @click="submit(ruleFormRef)" :loading="buttonLoading" v-if="canHandle && isSaveSuccess">
-                      办理
-                    </el-button>
-                    <el-text class="ml12" type="danger" tag="b">注意:工单内容填写或者修改后请先保存再办理。</el-text>
+										<el-button class="default-button" @click="save(ruleFormRef)" :loading="buttonLoading" v-if="!isSaveSuccess"> 保存 </el-button>
+										<el-button type="primary" @click="submit(ruleFormRef)" :loading="buttonLoading" v-if="canHandle && isSaveSuccess">
+											办理
+										</el-button>
+										<el-text class="ml12" type="danger" tag="b">注意:工单内容填写或者修改后请先保存再办理。</el-text>
 									</el-form-item>
 								</el-col>
 							</el-row>
@@ -549,7 +549,7 @@
 </template>
 
 <script setup lang="ts" name="orderAccept">
-import { computed, defineAsyncComponent, onMounted, reactive, ref, watch } from 'vue';
+import { computed, defineAsyncComponent, onBeforeUnmount, onMounted, reactive, ref, watch } from 'vue';
 import type { FormInstance } from 'element-plus';
 import { ElMessage, ElMessageBox, ElNotification } from 'element-plus';
 import { storeToRefs } from 'pinia';
@@ -565,7 +565,7 @@ import { treeArea } from '@/api/auxiliary/area';
 import mittBus from '@/utils/mitt';
 import { orderRepeatEvent } from '@/api/business/repeatEvent';
 import { removeDuplicate } from '@/utils/arrayOperation';
-import { Session } from '@/utils/storage';
+import { Local, Session } from '@/utils/storage';
 import { watchPausable } from '@vueuse/core';
 
 // 引入组件
@@ -1163,7 +1163,7 @@ const loadForm = async () => {
 			//  route.query.createBy  createBy 代表来源  tel:来电弹单  letter:互联网来信 默认表示手动创建
 			state.createBy = route.query.createBy;
 			if (route.query.createBy === 'tel') {
-				//通话
+				// 来电弹单
 				state.ruleForm.sourceChannel = '电话'; //电话
 				state.ruleForm.sourceChannelCode = 'RGDH'; //电话
 				state.ruleForm.fromPhone = route.query.fromTel; // 来电号码
@@ -1183,13 +1183,35 @@ const loadForm = async () => {
 					state.ruleForm.identityType = 1;
 				}
 			}
+			if (route.query.createBy === 'transfer') {
+				// 通话转写
+				state.ruleForm.sourceChannel = '电话'; //电话
+				state.ruleForm.sourceChannelCode = 'RGDH'; //电话
+				state.ruleForm.fromPhone = route.query.fromTel; // 来电号码
+				state.ruleForm.contact = route.query.fromTel; // 联系电话
+				state.ruleForm.callId = route.query.callId; // 通话id
+				state.ruleForm.transferPhone = route.query.transfer; // 转接来源
+				state.ruleForm.channel = {
+					// 来源渠道
+					dicDataValue: state.ruleForm.sourceChannelCode,
+					dicDataName: state.ruleForm.sourceChannel,
+				};
+				state.ruleForm.acceptTypeCode = '10';
+				state.ruleForm.acceptType = '咨询';
+				state.ruleForm.acceptTypeObj = {
+					// 受理类型
+					dicDataValue: state.ruleForm.acceptTypeCode,
+					dicDataName: state.ruleForm.acceptType,
+				};
+				state.ruleForm.content = Local.get(`${route.query.callId}`);
+			}
 		}
 
 		if (route.query.id) {
 			// 如果 有id
 			const response = await orderDetail(route.query.id);
 			// 如果获取到id 调用查询详情
-			state.ruleForm = response.result;
+			state.ruleForm = Object.assign(state.ruleForm, response.result);
 			state.ruleForm.files = transformFile(response.result.files);
 			if (response.result.duplicateIds && response.result.duplicateIds.length) {
 				// 是否重复
@@ -1257,7 +1279,10 @@ const loadForm = async () => {
 
 			state.formLoading = false;
 
-      isSaveSuccess.value = true; // 如果是修改进入 可以直接办理
+			isSaveSuccess.value = true; // 如果是修改进入 可以直接办理
+			setTimeout(() => {
+				watchPauseAbleFn.resume();
+			}, 300);
 		} else {
 			state.formLoading = false;
 		}
@@ -1316,4 +1341,9 @@ onMounted(async () => {
 	await loadForm();
 	state.tagsViewList = await Session.get('tagsViewList');
 });
+onBeforeUnmount(() => {
+	if (route.query.createBy && route.query.createBy === 'transfer') {
+		Local.remove(`${route.query.callId}`);
+	}
+});
 </script>

+ 4 - 1
src/views/todo/seats/accept/zgAccept.vue

@@ -1087,7 +1087,7 @@ const loadForm = async () => {
 			state.orderId = route.query.id;
 			const response = await orderDetail(route.query.id);
 			// 如果获取到id 调用查询详情
-			state.ruleForm = response.result;
+			state.ruleForm =   Object.assign(state.ruleForm, response.result);
 			state.ruleForm.files = transformFile(response.result.files);
 			if (response.result.duplicateIds && response.result.duplicateIds.length) {
 				// 是否重复
@@ -1160,6 +1160,9 @@ const loadForm = async () => {
 				};
 			}
 			isSaveSuccess.value = true; // 如果是修改进入 可以直接办理
+			setTimeout(() => {
+				watchPauseAbleFn.resume();
+			}, 300);
 			state.formLoading = false;
 		} else {
 			state.formLoading = false;

Một số tệp đã không được hiển thị bởi vì quá nhiều tập tin thay đổi trong này khác