Smart-visit-Detail.vue 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. <template>
  2. <el-dialog v-model="state.dialogVisible" width="60%" draggable title="回访明细" append-to-body destroy-on-close @close="close" @opened="opened">
  3. <el-form :model="state.queryParams" ref="queryParamsRef" inline @submit.native.prevent>
  4. <el-form-item label="关键词" prop="Keyword">
  5. <el-input v-model="state.queryParams.Keyword" placeholder="工单标题/工单编码" clearable @keyup.enter="handleQuery" />
  6. </el-form-item>
  7. <el-form-item label="任务状态" prop="AiOrderVisitState">
  8. <el-select v-model="state.queryParams.AiOrderVisitState" placeholder="请选择任务状态" @change="handleQuery" clearable>
  9. <el-option v-for="item in aiOrderVisitState" :value="item.key" :key="item.key" :label="item.value" />
  10. </el-select>
  11. </el-form-item>
  12. <el-form-item>
  13. <el-button type="primary" @click="handleQuery" :loading="state.loading"> <SvgIcon name="ele-Search" class="mr5" />查询 </el-button>
  14. <el-button @click="resetQuery(queryParamsRef)" :loading="state.loading" class="default-button">
  15. <SvgIcon name="ele-Refresh" class="mr5" />重置
  16. </el-button>
  17. </el-form-item>
  18. </el-form>
  19. <vxe-toolbar
  20. ref="toolbarRef"
  21. :loading="state.loading"
  22. custom
  23. :refresh="{
  24. queryMethod: handleQuery,
  25. }"
  26. :tools="[{ toolRender: { name: 'exportCurrent' } }, { toolRender: { name: 'exportAll' } }]"
  27. >
  28. </vxe-toolbar>
  29. <vxe-table
  30. border
  31. :loading="state.loading"
  32. :data="state.tableData"
  33. :column-config="{ resizable: true }"
  34. :row-config="{ isCurrent: true, isHover: true, height: 30 }"
  35. ref="tableRef"
  36. show-overflow
  37. :scrollY="{ enabled: true, gt: 0 }"
  38. id="smartVisitDetail"
  39. :custom-config="{ storage: true }"
  40. :params="{ exportMethod: getSmartVisitDetailExport, exportParams: requestParams }"
  41. showHeaderOverflow
  42. max-height="300px"
  43. >
  44. <vxe-column field="no" title="工单编码" width="140"></vxe-column>
  45. <vxe-column field="title" title="工单标题" width="200">
  46. <template #default="{ row }">
  47. <order-detail :order="row.order" @updateList="queryList">{{ row.order?.title }}</order-detail>
  48. </template>
  49. </vxe-column>
  50. <vxe-column field="aiOrderVisitStateText" title="外呼状态" width="120"></vxe-column>
  51. <vxe-column field="isSuccessText" title="是否成功" width="120"></vxe-column>
  52. <vxe-column field="outerNo" title="外呼电话" width="120"></vxe-column>
  53. <vxe-column field="fromName" title="姓名" width="120"></vxe-column>
  54. <vxe-column field="fromGenderText" title="性别" width="120"></vxe-column>
  55. <vxe-column field="callTimes" title="重拨次数" width="120"></vxe-column>
  56. <vxe-column field="callTime" title="外呼时间" width="160">
  57. <template #default="{ row }">
  58. {{ formatDate(row.callTime, 'YYYY-mm-dd HH:MM:SS') }}
  59. </template>
  60. </vxe-column>
  61. <vxe-column field="startTime" title="受理时间" width="160">
  62. <template #default="{ row }">
  63. {{ formatDate(row.startTime, 'YYYY-mm-dd HH:MM:SS') }}
  64. </template>
  65. </vxe-column>
  66. <vxe-column field="filedTime" title="办结时间" width="160">
  67. <template #default="{ row }">
  68. {{ formatDate(row.filedTime, 'YYYY-mm-dd HH:MM:SS') }}
  69. </template>
  70. </vxe-column>
  71. <vxe-column field="seatEvaluateText" title="话务员评价" width="110"></vxe-column>
  72. <vxe-column field="orgProcessingResults" title="部门办件结果" width="140"></vxe-column>
  73. <vxe-column field="isContact" title="部门是否联系" width="120"></vxe-column>
  74. <vxe-column field="volved" title="处理结果" width="120"></vxe-column>
  75. </vxe-table>
  76. <pagination
  77. @pagination="queryList"
  78. :total="state.total"
  79. v-model:current-page="state.queryParams.PageIndex"
  80. v-model:page-size="state.queryParams.PageSize"
  81. :disabled="state.loading"
  82. />
  83. </el-dialog>
  84. </template>
  85. <script setup lang="tsx">
  86. import { formatDate } from '@/utils/formatTime';
  87. import { FormInstance } from 'element-plus';
  88. import { defineAsyncComponent, reactive, ref } from 'vue';
  89. import { getSmartVisitBaseData, getSmartVisitDetail, getSmartVisitDetailExport } from '@/api/smartVisit';
  90. import { exportOrder } from '@/api/business/order';
  91. const OrderDetail = defineAsyncComponent(() => import('@/components/OrderDetail/index.vue')); // 工单详情
  92. const pagination = defineAsyncComponent(() => import('@/components/ProTable/components/Pagination.vue')); // 分页
  93. const state = reactive({
  94. queryParams: {
  95. // 查询条件
  96. PageIndex: 1,
  97. PageSize: 10,
  98. Keyword: null, // 关键字
  99. id: '',
  100. AiOrderVisitState: null,
  101. },
  102. tableData: [], //表格
  103. loading: false, // 加载
  104. total: 0, // 总数
  105. dialogVisible: false, // 弹窗
  106. });
  107. // 页面基础数据
  108. const aiOrderVisitState = ref([]);
  109. const getBaseData = async () => {
  110. try {
  111. const { result } = await getSmartVisitBaseData();
  112. aiOrderVisitState.value = result.aiOrderVisitState;
  113. } catch (e) {
  114. console.log(e);
  115. }
  116. };
  117. // 打开弹窗
  118. const openDialog = (row?: any) => {
  119. if (row) {
  120. state.dialogVisible = true;
  121. getBaseData();
  122. state.queryParams.id = row.id;
  123. queryList();
  124. }
  125. };
  126. // 手动查询,将页码设置为1
  127. const handleQuery = () => {
  128. state.queryParams.PageIndex = 1;
  129. queryList();
  130. };
  131. // 查询智能回访明细表
  132. const requestParams = ref({});
  133. const queryList = async () => {
  134. state.loading = true;
  135. try {
  136. state.tableData = [];
  137. requestParams.value = state.queryParams;
  138. const res = await getSmartVisitDetail(state.queryParams);
  139. state.tableData = res.result.items ?? [];
  140. state.total = res.result.total ?? 0;
  141. state.loading = false;
  142. } catch (e) {
  143. console.log(e);
  144. state.loading = false;
  145. state.tableData = [];
  146. }
  147. };
  148. const close = () => {
  149. queryParamsRef.value?.resetFields();
  150. queryParamsRef.value?.resetFields();
  151. };
  152. // 重置所有工单列表
  153. const queryParamsRef = ref<RefType>();
  154. const resetQuery = (formEl: FormInstance | undefined) => {
  155. if (!formEl) return;
  156. formEl.resetFields();
  157. queryList();
  158. };
  159. const toolbarRef = ref<RefType>();
  160. const tableRef = ref<RefType>();
  161. const opened = () => {
  162. if (tableRef.value && toolbarRef.value) {
  163. tableRef.value.connect(toolbarRef.value);
  164. }
  165. };
  166. defineExpose({
  167. openDialog,
  168. });
  169. </script>