Browse Source

reactor:智能回访和回访调整;

zhangchong 9 months ago
parent
commit
fa6f188012

+ 1 - 0
src/theme/app.scss

@@ -28,6 +28,7 @@
 	// 主题字体颜色淡色
 	--hotline-color-text-main-light: #666;
 	--hotline-overlay-color-lighter-4: rgba(0, 0, 0, 0.4);
+	--hotline-overlay-color-lighter-3: rgba(0, 0, 0, 0.3);
 	--hotline-color-popover: #667aed;
 	// 列表操作图标的字体的大小
 	--hotline-table-icon-font-size: 16px;

+ 16 - 7
src/views/business/visit/component/Smart-visit-Detail.vue

@@ -71,7 +71,7 @@ const columns = ref<any[]>([
 	{ prop: 'order.no', label: '工单编码', width: 140 },
 	{
 		label: '标题',
-		prop: 'order.title',
+		prop: 'title',
 		width: 200,
 	},
 	{ prop: 'aiOrderVisitStateText', label: '外呼状态' },
@@ -80,22 +80,31 @@ const columns = ref<any[]>([
 		prop: 'isSuccessText',
 	},
 	{ prop: 'outerNo', label: '外呼电话',minWidth: 120 },
-	{ prop: 'order.fromName', label: '姓名' },
-	{ prop: 'order.fromGenderText', label: '性别' },
+	{ prop: 'fromName', label: '姓名' },
+	{ prop: 'fromGenderText', label: '性别' },
+  { prop: 'callTimes', label: '外呼次数' },
+  {
+    label: '外呼时间',
+    prop: 'callTime',
+    width: 160,
+    render: (scope: any) => {
+      return <span>{formatDate(scope.row.callTime, 'YYYY-mm-dd HH:MM:SS')}</span>;
+    },
+  },
 	{
 		label: '受理时间',
-		prop: 'order.startTime',
+		prop: 'startTime',
 		width: 160,
 		render: (scope: any) => {
-			return <span>{formatDate(scope.row.order?.startTime, 'YYYY-mm-dd HH:MM:SS')}</span>;
+			return <span>{formatDate(scope.row.startTime, 'YYYY-mm-dd HH:MM:SS')}</span>;
 		},
 	},
 	{
 		label: '办结时间',
-		prop: 'order.filedTime',
+		prop: 'filedTime',
 		width: 160,
 		render: (scope: any) => {
-			return <span>{formatDate(scope.row.order?.filedTime, 'YYYY-mm-dd HH:MM:SS')}</span>;
+			return <span>{formatDate(scope.row.filedTime, 'YYYY-mm-dd HH:MM:SS')}</span>;
 		},
 	},
 	{

+ 18 - 16
src/views/business/visit/component/Visit-detail.vue

@@ -484,27 +484,29 @@ const visitManner = ref<EmptyArrayType>(); // 部门办件态度
 const visitSatisfaction = ref<EmptyArrayType>(); // 部门办件结果
 const visitId = ref<string>(''); // 回访id
 const dialogTitle = ref<string>('回访'); // 弹窗标题
+const aiVisitVoiceBaseUrl = ref(''); // 智能回访录音前缀
 const getBaseData = async (id: string) => {
 	state.loading = true;
 	try {
-		const res = await visitDetailBaseData(id);
-		visitCount.value = res.result?.visitCount ?? 0;
-		seatEvaluate.value = res.result?.seatEvaluate ?? [];
-		viceEvaluate.value = res.result?.viceEvaluate ?? [];
-		dissatisfiedReason.value = res.result?.dissatisfiedReason ?? [];
-		visitManner.value = res.result?.visitManner ?? [];
-		visitSatisfaction.value = res.result?.visitSatisfaction ?? [];
-		visitId.value = res.result?.orderVisitModel?.id ?? '';
-		state.orderDetail = res.result?.orderVisitModel?.order ?? {};
-		state.orderVisitModel = res.result?.orderVisitModel ?? {};
-		state.recordingAbsolutePath = res.result?.recordingAbsolutePath ?? '';
-		state.smartRecord = res.result?.orderVisitModel.recordUrl ?? '';
-		if (res.result?.orderVisitModel?.isPutThrough !== null) {
-			state.ruleForm.isPutThrough = !res.result?.orderVisitModel?.isPutThrough ?? false;
+		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 = res.result?.orderVisitModel?.orderVisitDetails ?? {};
+		state.ruleForm.visitDetails = result?.orderVisitModel?.orderVisitDetails ?? {};
 		for (let i of state.ruleForm.visitDetails) {
 			if (i.visitTarget === 20) {
 				if (i.orgProcessingResults) {
@@ -584,7 +586,7 @@ const recordFile = (obj: any) => {
 // 查看智能回访录音
 const onSmartRecord = () => {
 	const fileName = `工单编号-${state.orderDetail?.no} 智能回访录音文件`;
-	playRecordRef.value.openDialog(state.smartRecord, fileName);
+	playRecordRef.value.openDialog(aiVisitVoiceBaseUrl.value + state.smartRecord, fileName);
 };
 // 呼叫
 const onCall = (phoneNumber: string) => {

+ 121 - 92
src/views/business/visit/index.vue

@@ -1,6 +1,6 @@
 <template>
 	<div class="business-visit-container layout-padding">
-    <div class="layout-padding-auto layout-padding-view pd20">
+		<div class="layout-padding-auto layout-padding-view pd20">
 			<ProTable
 				ref="proTableRef"
 				:columns="columns"
@@ -11,94 +11,108 @@
 				v-model:page-index="state.queryParams.PageIndex"
 				v-model:page-size="state.queryParams.PageSize"
 			>
-        <template #table-search>
-          <el-form :model="state.queryParams" ref="ruleFormRef" @submit.native.prevent label-width="100px">
-            <el-row :gutter="20">
-              <el-col>
-                <el-form-item label="数据范围" prop="IsProvince">
-                  <el-segmented
-                      :options="[
-									{
-										value: 'all',
-										label: '全部',
-									},
-									{
-										value: 'city',
-										label: '市工单',
-									},
-									{
-										value: 'province',
-										label: '省工单',
-									},
-								]"
-                      v-model="fastSearch"
-                      @change="fastSearchChange"
-                  />
-                </el-form-item>
-              </el-col>
-              <el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6">
-                <el-form-item label="工单标题" prop="Keyword">
-                  <el-input v-model="state.queryParams.Keyword" placeholder="工单标题" clearable @keyup.enter="handleQuery" />
-                </el-form-item>
-              </el-col>
-              <el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6">
-                <el-form-item label="工单编码" prop="No">
-                  <el-input v-model="state.queryParams.No" placeholder="工单编码" clearable @keyup.enter="handleQuery" />
-                </el-form-item>
-              </el-col>
-              <el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6">
-                <el-form-item label="归档类型" prop="FiledType">
-                  <el-select v-model="state.queryParams.FiledType" placeholder="请选择归档类型" @change="handleQuery" class="w100">
-                    <el-option label="中心归档" value="10" />
-                    <el-option label="部门归档" value="20" />
-                  </el-select>
-                </el-form-item>
-              </el-col>
-              <transition name="el-zoom-in-top">
-                <el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6" v-show="!searchCol">
-                  <el-form-item label="是否会签" prop="IsCountersign">
-                    <el-select v-model="state.queryParams.IsCountersign" placeholder="请选择是否会签" @change="handleQuery" class="w100">
-                      <el-option label="是" value="true" />
-                      <el-option label="否" value="false" />
-                    </el-select>
-                  </el-form-item>
-                </el-col>
-              </transition>
-              <transition name="el-zoom-in-top">
-                <el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6" v-show="!searchCol">
-                  <el-form-item label="回访状态" prop="VisitState">
-                    <el-select v-model="state.queryParams.VisitState" placeholder="请选择回访状态" @change="handleQuery" class="w100">
-                      <el-option v-for="item in state.visitStateOptions" :value="item.value" :key="item.value" :label="item.label" />
-                    </el-select>
-                  </el-form-item>
-                </el-col>
-              </transition>
-              <transition name="el-zoom-in-top">
-                <el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6" v-show="!searchCol">
-                  <el-form-item label="回访方式" prop="VisitType">
-                    <el-select v-model="state.queryParams.VisitType" placeholder="请选择回访方式" @change="handleQuery" class="w100">
-                      <el-option v-for="item in state.visitTypeOptions" :value="item.key" :key="item.key" :label="item.value" />
-                    </el-select>
-                  </el-form-item>
-                </el-col>
-              </transition>
-              <el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6">
-                <el-form-item label="">
-                  <div class="flex-end w100">
-                    <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" :loading="state.loading">
-                      <SvgIcon name="ele-Refresh" class="mr5" />重置
-                    </el-button>
-                    <el-button link type="primary" @click="closeSearch" :loading="state.loading">
-                      {{ searchCol ? '展开' : '收起' }}
-                      <SvgIcon :class="{ 'is-reverse': searchCol }" name="ele-ArrowUp" class="mr5 arrow" size="18px" />
-                    </el-button>
-                  </div>
-                </el-form-item>
-              </el-col>
-            </el-row>
-          </el-form>
-        </template>
+				<template #table-search>
+					<el-form :model="state.queryParams" ref="ruleFormRef" @submit.native.prevent label-width="100px">
+						<el-row :gutter="20">
+							<el-col>
+								<el-form-item label="数据范围" prop="IsProvince">
+									<el-segmented
+										:options="[
+											{
+												value: 'all',
+												label: '全部',
+											},
+											{
+												value: 'city',
+												label: '市工单',
+											},
+											{
+												value: 'province',
+												label: '省工单',
+											},
+										]"
+										v-model="fastSearch"
+										@change="fastSearchChange"
+									/>
+								</el-form-item>
+							</el-col>
+							<el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6">
+								<el-form-item label="工单标题" prop="Keyword">
+									<el-input v-model="state.queryParams.Keyword" placeholder="工单标题" clearable @keyup.enter="handleQuery" />
+								</el-form-item>
+							</el-col>
+							<el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6">
+								<el-form-item label="工单编码" prop="No">
+									<el-input v-model="state.queryParams.No" placeholder="工单编码" clearable @keyup.enter="handleQuery" />
+								</el-form-item>
+							</el-col>
+							<el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6">
+								<el-form-item label="" label-width="0">
+										<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" :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-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>
 				</template>
@@ -130,13 +144,14 @@ import { FormInstance } from 'element-plus';
 import { formatDate } from '@/utils/formatTime';
 import { useRouter } from 'vue-router';
 import { visitList, visitSearchBaseData } from '@/api/business/visit';
+import { defaultTimeStartEnd, shortcuts } from '@/utils/constants';
+import Other from "@/utils/other";
 
 // 引入组件
 const VisitDetailCom = defineAsyncComponent(() => import('@/views/business/visit/component/Visit-detail.vue')); // 回访
 const OrderDetail = defineAsyncComponent(() => import('@/components/OrderDetail/index.vue')); // 工单详情
 
 // 定义变量内容
-const ruleFormRef = ref<RefType>(); // 表单ref
 const router = useRouter(); // 路由
 const proTableRef = ref<RefType>(); // 表格ref
 const searchCol = ref(true); // 展开/收起
@@ -168,6 +183,7 @@ const columns = ref<any[]>([
 	{ prop: 'order.sourceChannel', label: '来源渠道', minWidth: 100 },
 	{ prop: 'visitStateText', label: '回访状态', minWidth: 100 },
 	{ prop: 'visitTypeText', label: '回访方式', minWidth: 100 },
+  {prop: 'isEffectiveAiVisitText', label: '有效智能回访', minWidth: 110 },
 	{ prop: 'order.acceptType', label: '受理类型', minWidth: 100 },
 	{ prop: 'order.hotspotName', label: '热点分类', minWidth: 150 },
 	{ prop: 'order.acceptorName', label: '受理人', minWidth: 120 },
@@ -231,6 +247,11 @@ const state = reactive<any>({
 		IsCountersign: null, // 是否会签
 		FiledType: null, // 归档类型
 		IsProvince: null,
+    employeeName:null,
+    crTime:[],
+    StartTime:null,
+    EndTime:null,
+    IsEffectiveAiVisit:null,
 	},
 	tableData: [], //表单
 	loading: false, // 加载
@@ -259,9 +280,14 @@ const handleQuery = () => {
 	queryList();
 };
 /** 获取列表 */
+const requestParams = ref({});
 const queryList = () => {
 	state.loading = true;
-	visitList(state.queryParams)
+  requestParams.value = Other.deepClone(state.queryParams);
+  requestParams.value.StartTime = state.queryParams.crTime === null ? null : state.queryParams.crTime[0];
+  requestParams.value.EndTime = state.queryParams.crTime === null ? null : state.queryParams.crTime[1];
+  Reflect.deleteProperty(requestParams.value, 'crTime');
+	visitList(requestParams.value)
 		.then((res: any) => {
 			state.tableData = res.result?.items ?? [];
 			state.total = res.result?.total ?? 0;
@@ -273,11 +299,13 @@ const queryList = () => {
 };
 
 /** 重置按钮操作 */
+const drawerRuleFormRef = ref();
+const ruleFormRef = ref<RefType>(); // 表单ref
 const resetQuery = (formEl: FormInstance | undefined) => {
 	if (!formEl) return;
 	formEl.resetFields();
 	state.queryParams.IsProvince = null;
-  fastSearch.value = 'all';
+	fastSearch.value = 'all';
 	queryList();
 };
 // 回访详情
@@ -285,6 +313,7 @@ const visitDetailRef = ref<RefType>();
 const visitDetail = (row: any) => {
 	visitDetailRef.value.openDialog(row, '回访详情');
 };
+const drawer = ref(false);
 onMounted(() => {
 	getBaseData();
 	queryList();

+ 115 - 56
src/views/business/visit/smart.vue

@@ -1,6 +1,6 @@
 <template>
 	<div class="business-visit-smart-container layout-padding">
-    <div class="layout-padding-auto layout-padding-view pd20">
+		<div class="layout-padding-auto layout-padding-view pd20">
 			<ProTable
 				ref="proTableRef"
 				:columns="columns"
@@ -11,41 +11,78 @@
 				v-model:page-index="state.queryParams.PageIndex"
 				v-model:page-size="state.queryParams.PageSize"
 				:toolButton="['refresh', 'setting', 'exportCurrent', 'exportAll']"
-        :exportMethod="getSmartVisitExport"
-        :exportParams="requestParams"
+				:exportMethod="getSmartVisitExport"
+				:exportParams="requestParams"
 			>
-        <template #table-search>
-          <el-form :model="state.queryParams" ref="ruleFormRef" inline @submit.native.prevent>
-            <el-form-item label="任务名称" prop="Keyword">
-              <el-input v-model="state.queryParams.Keyword" placeholder="回访任务名称" clearable @keyup.enter="handleQuery" class="keyword-input" />
-            </el-form-item>
-            <el-form-item label="任务状态" prop="AiOrderVisitTaskState">
-              <el-select v-model="state.queryParams.AiOrderVisitTaskState" placeholder="请选择任务状态" @change="handleQuery" clearable>
-                <el-option v-for="item in aiOrderVisitTaskState" :value="item.key" :key="item.key" :label="item.value" />
-              </el-select>
-            </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>
+				<template #table-search>
+					<el-form :model="state.queryParams" ref="ruleFormRef" inline @submit.native.prevent>
+						<el-form-item label="任务名称" prop="Keyword">
+							<el-input v-model="state.queryParams.Keyword" placeholder="回访任务名称" clearable @keyup.enter="handleQuery" class="keyword-input" />
+						</el-form-item>
+						<el-form-item label="任务状态" prop="AiOrderVisitTaskState">
+							<el-select v-model="state.queryParams.AiOrderVisitTaskState" placeholder="请选择任务状态" @change="handleQuery" clearable>
+								<el-option v-for="item in aiOrderVisitTaskState" :value="item.key" :key="item.key" :label="item.value" />
+							</el-select>
+						</el-form-item>
+						<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-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(ruleFormRef)" class="default-button"> <SvgIcon name="ele-Refresh" class="mr5" />重置 </el-button>
-            </el-form-item>
-          </el-form>
-        </template>
+              <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'">
+					<el-button type="primary" @click="onAddVisit" v-auth="'business:visit:smart:add'" :loading="state.loading">
 						<SvgIcon name="ele-Plus" class="mr5" /> 创建任务
 					</el-button>
 				</template>
@@ -96,11 +133,10 @@
 import { defineAsyncComponent, onMounted, reactive, ref } from 'vue';
 import { ElMessage, ElMessageBox, FormInstance } from 'element-plus';
 import { formatDate } from '@/utils/formatTime';
-import {getSmartVisitBaseData, getSmartVisitExport, getSmartVisitList} from "@/api/smartVisit";
-import { smartCallOutTaskPause, smartCallOutTaskStart, smartCallOutTaskStop } from "@/api/auxiliary/smartCallOut";
+import { getSmartVisitBaseData, getSmartVisitExport, getSmartVisitList } from '@/api/smartVisit';
+import { smartCallOutTaskPause, smartCallOutTaskStart, smartCallOutTaskStop } from '@/api/auxiliary/smartCallOut';
 import { defaultTimeStartEnd, shortcuts } from '@/utils/constants';
 import Other from '@/utils/other';
-import { downloadFileByStream } from '@/utils/tools';
 
 // 引入组件
 const SmartVisitAdd = defineAsyncComponent(() => import('@/views/business/visit/component/Smart-visit-add.vue')); // 选择需要智能回访的工单
@@ -109,20 +145,28 @@ const SmartVisitDetail = defineAsyncComponent(() => import('@/views/business/vis
 const proTableRef = ref<RefType>(); // 表格ref
 // 表格配置项
 const columns = ref<any[]>([
-	{ prop: 'name', label: '回访任务名称',minWidth:200 },
-  {
-    prop: 'creationTime',
-    label: '智能回访时间段',
-    width: 160,
-    render: (scope: any) => {
-      return <span>{formatDate(scope.row.creationTime, 'YYYY-mm-dd HH:MM:SS')}</span>;
-    },
-  },
-	{ prop: 'hasVisitCount', label: '回访任务总数量' },
-	{ prop: 'visitedCount', label: '回访任务成功数量' },
-	{ prop: 'visitedFailCount', label: '回访任务失败数量' },
-	{ prop: 'taskStateText', label: '任务完成状态' },
-	{ prop: 'creatorName', label: '创建人',minWidth:120},
+	{ prop: 'name', label: '回访任务名称', minWidth: 200 },
+	{
+		prop: 'beginTime',
+		label: '开始时间',
+		width: 160,
+		render: (scope: any) => {
+			return <span>{formatDate(scope.row.beginTime, 'YYYY-mm-dd HH:MM:SS')}</span>;
+		},
+	},
+	{
+		prop: 'endTime',
+		label: '结束时间',
+		width: 160,
+		render: (scope: any) => {
+			return <span>{formatDate(scope.row.endTime, 'YYYY-mm-dd HH:MM:SS')}</span>;
+		},
+	},
+	{ prop: 'hasVisitCount', label: '回访任务总数量', minWidth: 120 },
+	{ prop: 'visitedCount', label: '回访任务成功数量', minWidth: 120 },
+	{ prop: 'visitedFailCount', label: '回访任务失败数量', minWidth: 120 },
+	{ prop: 'taskStateText', label: '任务完成状态', minWidth: 110 },
+	{ prop: 'creatorName', label: '创建人', minWidth: 120 },
 	{
 		prop: 'creationTime',
 		label: '创建时间',
@@ -145,11 +189,16 @@ const state = reactive<any>({
 		crTime: [],
 		StartTime: null,
 		EndTime: null,
+    startTime:[],
+    AiVisitTimeBeginStart:null,
+    AiVisitTimeBeginEnd:null,
+    endTime:[],
+    AiVisitTimeEndStart:null,
+    AiVisitTimeEndEnd:null
 	},
 	total: 0, // 总条数
 	tableData: [], // 表格数据
 });
-const ruleFormRef = ref<RefType>(null); // 表单ref
 // 手动查询,将页码设置为1
 const handleQuery = () => {
 	state.queryParams.PageIndex = 1;
@@ -159,11 +208,17 @@ const requestParams = ref({});
 // 获取参数列表
 const queryList = () => {
 	state.loading = true;
-  requestParams.value = Other.deepClone(state.queryParams);
-  requestParams.value.StartTime = state.queryParams.crTime === null ? null : state.queryParams.crTime[0];
-  requestParams.value.EndTime = state.queryParams.crTime === null ? null : state.queryParams.crTime[1];
-	Reflect.deleteProperty( requestParams.value, 'crTime');
-	getSmartVisitList( requestParams.value)
+	requestParams.value = Other.deepClone(state.queryParams);
+	requestParams.value.StartTime = state.queryParams.crTime === null ? null : state.queryParams.crTime[0];
+	requestParams.value.EndTime = state.queryParams.crTime === null ? null : state.queryParams.crTime[1];
+	Reflect.deleteProperty(requestParams.value, 'crTime');
+  requestParams.value.AiVisitTimeBeginStart = state.queryParams.startTime === null ? null : state.queryParams.startTime[0];
+  requestParams.value.AiVisitTimeBeginEnd = state.queryParams.startTime === null ? null : state.queryParams.startTime[1];
+  Reflect.deleteProperty(requestParams.value, 'startTime');
+  requestParams.value.AiVisitTimeEndStart = state.queryParams.endTime === null ? null : state.queryParams.endTime[0];
+  requestParams.value.AiVisitTimeEndEnd = state.queryParams.endTime === null ? null : state.queryParams.endTime[1];
+  Reflect.deleteProperty(requestParams.value, 'endTime');
+	getSmartVisitList(requestParams.value)
 		.then((res) => {
 			state.loading = false;
 			state.tableData = res.result.items ?? [];
@@ -184,6 +239,8 @@ const getBaseData = async () => {
 	}
 };
 // 重置表单
+const drawerRuleFormRef = ref();
+const ruleFormRef = ref<RefType>(null); // 表单ref
 const resetQuery = (formEl: FormInstance | undefined) => {
 	if (!formEl) return;
 	formEl.resetFields();
@@ -285,6 +342,8 @@ const onPause = (row: any) => {
 			// 取消
 		});
 };
+const drawer = ref(false);
+
 // 页面加载时
 onMounted(() => {
 	getBaseData();

+ 3 - 3
src/views/home/component/Entrance.vue

@@ -47,7 +47,7 @@
 								<div class="entrance-list-box-item" :title="item.element.pageName">
 									<SvgIcon :name="item.element.icon" class="my-handle" size="28px" />
 									<p class="entrance-list-box-item-name text-no-wrap">{{ item.element.pageName }}</p>
-									<SvgIcon name="ele-RemoveFilled" class="plus-icon location" color="#ccc" size="24px" @click="removeOne(item.element)" />
+									<SvgIcon name="ele-RemoveFilled" class="plus-icon location" color="#ccc" size="20px" @click="removeOne(item.element)" />
 								</div>
 							</template>
 						</draggable>
@@ -83,7 +83,7 @@
 									name="ele-CirclePlusFilled"
 									class="remove-icon location"
 									color="var(--el-color-primary)"
-									size="24px"
+									size="20px"
 									@click="plusOne(item)"
 								/>
 							</li>
@@ -317,7 +317,7 @@ onMounted(() => {
 					display: inline-block;
           width: 30px;
           height: 30px;
-					margin-bottom: 10px;
+					margin-bottom: 15px;
 					cursor: grab;
 					margin-top: 5px;
 				}