order.vue 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436
  1. <template>
  2. <div class="province-order-container layout-padding">
  3. <div class="layout-padding-auto layout-padding-view pd20">
  4. <el-form :model="state.queryParams" ref="ruleFormRef" @submit.native.prevent inline>
  5. <el-form-item label="省编码" prop="ReceiveProvinceNo">
  6. <el-input v-model="state.queryParams.ReceiveProvinceNo" placeholder="省编码" clearable @keyup.enter="handleQuery" class="keyword-input"/>
  7. </el-form-item>
  8. <el-form-item label="工单标题" prop="Keyword">
  9. <el-input v-model="state.queryParams.Keyword" placeholder="工单标题" clearable @keyup.enter="handleQuery" class="keyword-input"/>
  10. </el-form-item>
  11. <el-form-item label="生成时间" prop="crTime">
  12. <el-date-picker
  13. v-model="state.queryParams.crTime"
  14. type="datetimerange"
  15. unlink-panels
  16. range-separator="至"
  17. start-placeholder="开始时间"
  18. end-placeholder="结束时间"
  19. :shortcuts="shortcuts"
  20. @change="handleQuery"
  21. value-format="YYYY-MM-DD[T]HH:mm:ss"
  22. :default-time="defaultTimeStartEnd"
  23. />
  24. </el-form-item>
  25. <el-form-item label="">
  26. <el-button type="primary" @click="handleQuery" :loading="state.loading"> <SvgIcon name="ele-Search" class="mr5" />查询 </el-button>
  27. <el-button @click="drawer = true" class="default-button"> <SvgIcon name="ele-Search" class="mr5" />更多查询</el-button>
  28. </el-form-item>
  29. </el-form>
  30. <vxe-toolbar
  31. ref="toolbarRef"
  32. :loading="state.loading"
  33. custom
  34. :refresh="{
  35. queryMethod: handleQuery,
  36. }"
  37. :tools="[{ toolRender: { name: 'exportCurrent' } }, { toolRender: { name: 'exportAll' } }]"
  38. >
  39. </vxe-toolbar>
  40. <div style="overflow: hidden; width: 100%; height: 100%; flex: 1">
  41. <vxe-table
  42. border
  43. :loading="state.loading"
  44. :data="state.tableData"
  45. :column-config="{ resizable: true }"
  46. :row-config="{ isCurrent: true, isHover: true, height: 30, useKey: true }"
  47. ref="tableRef"
  48. height="auto"
  49. auto-resize
  50. show-overflow
  51. :print-config="{}"
  52. :scrollY="{ enabled: true, gt: 100 }"
  53. id="provinceOrder"
  54. :custom-config="{
  55. storage: true,
  56. }"
  57. showHeaderOverflow
  58. :params="{ exportMethod: exportOrder, exportParams: requestParams }"
  59. >
  60. <vxe-column field="expiredStatusText" title="超期状态" width="90" align="center">
  61. <template #default="{ row }">
  62. <span :class="'overdue-status-' + row.expiredStatus" :title="row.expiredStatusText"></span>
  63. </template>
  64. </vxe-column>
  65. <vxe-column field="receiveProvinceNo" title="省编码" width="240"></vxe-column>
  66. <vxe-column field="no" title="工单编码" width="140"></vxe-column>
  67. <vxe-column field="reTransactNum" title="重办次数" width="90"></vxe-column>
  68. <vxe-column field="isUrgentText" title="是否紧急" width="90">
  69. <template #default="{ row }">
  70. <span class="color-danger font-bold">{{ row.isUrgentText }}</span>
  71. </template>
  72. </vxe-column>
  73. <vxe-column field="currentStepName" title="当前节点" width="120"></vxe-column>
  74. <vxe-column field="statusText" title="工单状态" width="100">
  75. <template #default="{ row }">
  76. <el-text type="danger" tag="b" v-if="[1, 2, 3, 9, 101, 102, 103, 104, 105, 200].includes(row.status)">{{ row.statusText }}</el-text>
  77. <span v-else>{{ row.statusText }}</span>
  78. </template>
  79. </vxe-column>
  80. <vxe-column field="title" title="工单标题" width="200">
  81. <template #default="{ row }">
  82. <order-detail :order="row" @updateList="queryList">{{ row.title }}</order-detail>
  83. </template>
  84. </vxe-column>
  85. <vxe-column field="startTime" title="受理时间" width="160">
  86. <template #default="{ row }">
  87. {{ formatDate(row.startTime, 'YYYY-mm-dd HH:MM:SS') }}
  88. </template>
  89. </vxe-column>
  90. <vxe-column field="expiredTime" title="工单期满时间" width="160">
  91. <template #default="{ row }">
  92. {{ formatDate(row.expiredTime, 'YYYY-mm-dd HH:MM:SS') }}
  93. </template>
  94. </vxe-column>
  95. <vxe-column field="filedTime" title="办结时间" width="160">
  96. <template #default="{ row }">
  97. {{ formatDate(row.filedTime, 'YYYY-mm-dd HH:MM:SS') }}
  98. </template>
  99. </vxe-column>
  100. <vxe-column field="orgLevelOneName" title="一级部门" width="140"></vxe-column>
  101. <vxe-column field="actualHandleOrgName" title="接办部门" width="140"></vxe-column>
  102. <vxe-column field="acceptType" title="受理类型" width="110"></vxe-column>
  103. <vxe-column field="counterSignTypeText" title="是否会签" width="110"></vxe-column>
  104. <vxe-column field="sourceChannel" title="来源渠道" width="110"></vxe-column>
  105. <vxe-column field="hotspotSpliceName" title="热点全称" width="150"></vxe-column>
  106. <vxe-column field="hotspotName" title="热点分类" width="150"></vxe-column>
  107. <vxe-column field="acceptorName" title="受理人" width="120"></vxe-column>
  108. <vxe-column title="操作" fixed="right" width="80" align="center">
  109. <template #default="{ row }">
  110. <!-- 省工单退回条件 是省工单(工单未归档且当前节点处于热线中心办理节点时)工单状态为办理中(归档之前) 9代表有退回申请 -->
  111. <el-button
  112. link
  113. type="danger"
  114. @click="onReturn(row)"
  115. title="省工单退回"
  116. v-auth="'province:order:return'"
  117. v-if="
  118. row.isProvince &&
  119. (row.actualHandleOrgCode === '001' || row.actualHandleOrgCode === null || row.actualHandleOrgCode === '' || row.status === 0) &&
  120. row.status < 300 && row.status !== 9 && !row.provinceSendBack
  121. "
  122. >
  123. 退回</el-button>
  124. </template>
  125. </vxe-column>
  126. </vxe-table>
  127. </div>
  128. <pagination
  129. @pagination="queryList"
  130. :total="state.total"
  131. v-model:current-page="state.queryParams.PageIndex"
  132. v-model:page-size="state.queryParams.PageSize"
  133. :disabled="state.loading"
  134. />
  135. </div>
  136. <!-- 更多查询 -->
  137. <el-drawer v-model="drawer" title="更多查询" size="500px">
  138. <el-form :model="state.queryParams" ref="drawerRuleFormRef" @submit.native.prevent label-width="100px">
  139. <el-form-item label="工单编码" prop="No">
  140. <el-input v-model="state.queryParams.No" placeholder="工单编码" clearable @keyup.enter="handleQuery" />
  141. </el-form-item>
  142. <el-form-item label="来电人姓名" prop="FromName">
  143. <el-input v-model="state.queryParams.FromName" placeholder="来电人姓名" clearable @keyup.enter="handleQuery" />
  144. </el-form-item>
  145. <el-form-item label="事发地址" prop="AreaCode">
  146. <el-cascader
  147. :options="state.areaOptions"
  148. filterable
  149. :props="{ checkStrictly: true, value: 'id', label: 'areaName', emitPath: false }"
  150. placeholder="请选择事发地址"
  151. clearable
  152. class="w100"
  153. v-model="state.queryParams.AreaCode"
  154. @change="handleQuery"
  155. >
  156. </el-cascader>
  157. </el-form-item>
  158. <el-form-item label="是否紧急" prop="IsUrgent">
  159. <el-select v-model="state.queryParams.IsUrgent" placeholder="请选择是否紧急" clearable class="w100" @change="handleQuery">
  160. <el-option :value="true" label="紧急" />
  161. <el-option :value="false" label="不紧急" />
  162. </el-select>
  163. </el-form-item>
  164. <el-form-item label="转接来源" prop="TransferPhone">
  165. <el-input v-model="state.queryParams.TransferPhone" placeholder="转接来源" clearable @keyup.enter="handleQuery" />
  166. </el-form-item>
  167. <el-form-item label="工单状态" prop="Status">
  168. <el-select v-model="state.queryParams.Status" placeholder="请选择工单状态" clearable class="w100" @change="handleQuery">
  169. <el-option v-for="item in state.orderStatusOptions" :value="item.key" :key="item.key" :label="item.value" />
  170. </el-select>
  171. </el-form-item>
  172. <el-form-item label="受理类型" prop="AcceptType">
  173. <el-select v-model="state.queryParams.AcceptType" placeholder="请选择受理类型" clearable class="w100" @change="handleQuery">
  174. <el-option v-for="item in state.acceptTypeOptions" :value="item.dicDataValue" :key="item.dicDataValue" :label="item.dicDataName" />
  175. </el-select>
  176. </el-form-item>
  177. <el-form-item label="来源渠道" prop="Channel">
  178. <el-select v-model="state.queryParams.Channel" placeholder="请选择来源渠道" clearable class="w100" @change="handleQuery">
  179. <el-option v-for="item in state.channelOptions" :value="item.dicDataValue" :key="item.dicDataValue" :label="item.dicDataName" />
  180. </el-select>
  181. </el-form-item>
  182. <el-form-item label="热点分类" prop="Hotspot">
  183. <el-input v-model="state.queryParams.Hotspot" placeholder="热点分类名称" clearable @keyup.enter="handleQuery" />
  184. </el-form-item>
  185. <el-form-item label="接办部门" prop="OrgId">
  186. <el-cascader
  187. :options="state.orgsOptions"
  188. filterable
  189. :props="{ checkStrictly: true, value: 'id', label: 'name', emitPath: false }"
  190. placeholder="请选择接办部门"
  191. clearable
  192. class="w100"
  193. v-model="state.queryParams.OrgId"
  194. ref="cascadeRef"
  195. @change="handleQuery"
  196. >
  197. </el-cascader>
  198. </el-form-item>
  199. <el-form-item label="受理人" prop="NameOrNo">
  200. <el-input v-model="state.queryParams.NameOrNo" placeholder="受理人/坐席工号" clearable @keyup.enter="handleQuery" />
  201. </el-form-item>
  202. <el-form-item label="来电号码" prop="FromPhone">
  203. <el-input v-model="state.queryParams.FromPhone" placeholder="来电号码" clearable @keyup.enter="handleQuery" />
  204. </el-form-item>
  205. <el-form-item label="联系电话" prop="PhoneNo">
  206. <el-input v-model="state.queryParams.PhoneNo" placeholder="联系电话" clearable @keyup.enter="handleQuery" />
  207. </el-form-item>
  208. <el-form-item label="推送分类" prop="PushTypeCode">
  209. <el-select v-model="state.queryParams.PushTypeCode" placeholder="请选择推送分类" clearable class="w100" @change="handleQuery">
  210. <el-option v-for="item in state.pushTypeOptions" :value="item.dicDataValue" :key="item.dicDataValue" :label="item.dicDataName" />
  211. </el-select>
  212. </el-form-item>
  213. <el-form-item label="期满时间" prop="exTime">
  214. <el-date-picker
  215. v-model="state.queryParams.exTime"
  216. type="datetimerange"
  217. unlink-panels
  218. range-separator="至"
  219. start-placeholder="开始时间"
  220. end-placeholder="结束时间"
  221. :shortcuts="shortcuts"
  222. @change="handleQuery"
  223. value-format="YYYY-MM-DD[T]HH:mm:ss"
  224. :default-time="defaultTimeStartEnd"
  225. />
  226. </el-form-item>
  227. <el-form-item label="接办人" prop="ActualHandlerName">
  228. <el-input v-model="state.queryParams.ActualHandlerName" placeholder="接办人" clearable @keyup.enter="handleQuery" />
  229. </el-form-item>
  230. <el-form-item label="是否甄别" prop="IsScreen">
  231. <el-select v-model="state.queryParams.IsScreen" placeholder="请选择是否甄别" class="w100" clearable @change="handleQuery">
  232. <el-option label="是" :value="true" />
  233. <el-option label="否" :value="false" />
  234. </el-select>
  235. </el-form-item>
  236. <el-form-item label="当前节点" prop="CurrentStepCode">
  237. <el-select v-model="state.queryParams.CurrentStepCode" placeholder="请选择当前节点" clearable class="w100" @change="handleQuery">
  238. <el-option v-for="item in state.currentStepOptions" :value="item.key" :key="item.key" :label="item.value" />
  239. </el-select>
  240. </el-form-item>
  241. <el-form-item label="办结时间" prop="doneTime">
  242. <el-date-picker
  243. v-model="state.queryParams.doneTime"
  244. type="datetimerange"
  245. unlink-panels
  246. range-separator="至"
  247. start-placeholder="开始时间"
  248. end-placeholder="结束时间"
  249. :shortcuts="shortcuts"
  250. @change="handleQuery"
  251. value-format="YYYY-MM-DD[T]HH:mm:ss"
  252. :default-time="defaultTimeStartEnd"
  253. />
  254. </el-form-item>
  255. <el-form-item label="是否超期" prop="IsOverTime">
  256. <el-select v-model="state.queryParams.IsOverTime" placeholder="请选择是否超期" class="w100" clearable @change="handleQuery">
  257. <el-option label="是" :value="true" />
  258. <el-option label="否" :value="false" />
  259. </el-select>
  260. </el-form-item>
  261. <el-form-item label="来电主体" prop="IdentityType">
  262. <el-select v-model="state.queryParams.IdentityType" placeholder="请选择来电主体" clearable class="w100" @change="handleQuery">
  263. <el-option v-for="item in state.identityTypeOptions" :value="item.key" :key="item.key" :label="item.value" />
  264. </el-select>
  265. </el-form-item>
  266. <el-form-item label="省来源分类 " prop="ProvinceChannel">
  267. <el-select v-model="state.queryParams.ProvinceChannel" placeholder="请选择省来源分类 " class="w100" clearable @change="handleQuery">
  268. <el-option label="政民互动直派" value="1" />
  269. <el-option label="政民互动" value="2" />
  270. <el-option label="省12345" value="3" />
  271. </el-select>
  272. </el-form-item>
  273. </el-form>
  274. <template #footer>
  275. <el-button type="primary" @click="handleQuery" :loading="state.loading"> <SvgIcon name="ele-Search" class="mr5" />查询 </el-button>
  276. <el-button @click="resetQuery(drawerRuleFormRef)" class="default-button"> <SvgIcon name="ele-Refresh" class="mr5" />重置 </el-button>
  277. </template>
  278. </el-drawer>
  279. <!-- 工单省退回 -->
  280. <order-return ref="orderReturnRef" @updateList="queryList" />
  281. </div>
  282. </template>
  283. <script setup lang="tsx" name="provinceOrder">
  284. import { computed, defineAsyncComponent, onMounted, reactive, ref } from 'vue';
  285. import type { FormInstance } from 'element-plus';
  286. import { defaultTimeStartEnd, shortcuts } from '@/utils/constants';
  287. import { formatDate } from '@/utils/formatTime';
  288. import { exportOrder, listBaseData, orderList, orderListCount } from '@/api/business/order';
  289. import { treeArea } from '@/api/auxiliary/area';
  290. import Other from '@/utils/other';
  291. import { exportAssignment } from '@/utils/tools';
  292. // 引入组件
  293. const OrderDetail = defineAsyncComponent(() => import('@/components/OrderDetail/index.vue')); // 工单详情
  294. const OrderReturn = defineAsyncComponent(() => import('@/views/business/return/components/Apply.vue')); // 工单退回
  295. const pagination = defineAsyncComponent(() => import('@/components/ProTable/components/Pagination.vue')); // 分页
  296. // 定义变量内容
  297. const state = reactive<any>({
  298. queryParams: {
  299. PageIndex: 1, // 当前页
  300. PageSize: 20, // 每页条数
  301. // 查询条件
  302. No: null, // 工单编码
  303. ReceiveProvinceNo: null, // 省编码
  304. ActualHandlerName: null, // 接办人
  305. IsScreen: null, // 是否甄别
  306. CurrentStepCode: null, // 办理节点
  307. IsOverTime: null, // 是否超期
  308. FromName: null, // 来电人姓名
  309. AreaCode: null, // 事发地址
  310. FromPhone: null, // 来电号码
  311. Keyword: null, // 关键字
  312. Content: null, // 工单内容
  313. AcceptType: null, // 受理类型
  314. Channels: null, // 渠道
  315. Hotspot: null, // 热点分类名称
  316. OrgId: null, // 接办部门
  317. NameOrNo: null, // 受理坐席
  318. crTime: [], // 生成时间
  319. CreationTimeStart: null, // 创建时间 开始
  320. CreationTimeEnd: null, // 创建时间 结束
  321. Status: null, // 工单状态
  322. TransferPhone: null, // 转接来源
  323. exTime: [], // 过期时间
  324. ExpiredTimeStart: null, //办理期限 开始
  325. ExpiredTimeEnd: null, //办理期限 结束
  326. PhoneNo: null, // 手机号
  327. doneTime: [], // 办结时间
  328. ActualHandleTimeStart: null,
  329. ActualHandleTimeEnd: null,
  330. PushTypeCode: null, //推送类型
  331. IsProvinceOrder: true, // 省市工单
  332. IsUrgent: null, // 是否加急
  333. ProvinceChannel: null, //省来源分类
  334. },
  335. tableData: [], //表单
  336. loading: false, // 加载
  337. total: 0, // 总数
  338. acceptTypeOptions: [], //受理类型
  339. channelOptions: [], // 来源频道
  340. orderStatusOptions: [], // 工单状态
  341. currentStepOptions: [], // 办理节点
  342. identityTypeOptions: [], // 来电主体
  343. orgsOptions: [], // 部门
  344. pushTypeOptions: [], //推送分类
  345. orgData: [], // 机构数据
  346. areaOptions: [], // 省市区数据
  347. });
  348. // 获取查询条件基础信息
  349. const getBaseData = async () => {
  350. try {
  351. const res: any = await listBaseData();
  352. const mappings: any = {
  353. acceptTypeOptions: 'acceptTypeOptions',
  354. channelOptions: 'channelOptions',
  355. orgsOptions: 'orgsOptions',
  356. pushTypeOptions: 'pushTypeOptions',
  357. orderStatusOptions: 'orderStatusOptions',
  358. identityTypeOptions: 'identityTypeOptions',
  359. currentStepOptions: 'currentStepOptions',
  360. };
  361. for (const key in mappings) {
  362. state[key] = res.result?.[mappings[key]] ?? [];
  363. }
  364. const area = await treeArea();
  365. state.areaOptions = area?.result ?? []; //省市区数据
  366. } catch (error) {
  367. console.log(error);
  368. }
  369. };
  370. // 手动查询,将页码设置为1
  371. const handleQuery = () => {
  372. state.queryParams.PageIndex = 1;
  373. queryList();
  374. getTotal();
  375. };
  376. /** 获取列表 */
  377. const requestParams = ref<EmptyObjectType>({});
  378. const queryList = () => {
  379. requestParams.value = Other.deepClone(state.queryParams);
  380. requestParams.value.CreationTimeStart = state.queryParams.crTime === null ? null : state.queryParams.crTime[0]; // 生成时间
  381. requestParams.value.CreationTimeEnd = state.queryParams.crTime === null ? null : state.queryParams.crTime[1];
  382. Reflect.deleteProperty(requestParams.value, 'crTime'); // 删除无用的参数
  383. requestParams.value.ExpiredTimeStart = state.queryParams.exTime === null ? null : state.queryParams.exTime[0]; // 期满时间
  384. requestParams.value.ExpiredTimeEnd = state.queryParams.exTime === null ? null : state.queryParams.exTime[1];
  385. Reflect.deleteProperty(requestParams.value, 'exTime'); // 删除无用的参数
  386. requestParams.value.ActualHandleTimeStart = state.queryParams.doneTime === null ? null : state.queryParams.doneTime[0]; // 办结时间
  387. requestParams.value.ActualHandleTimeEnd = state.queryParams.doneTime === null ? null : state.queryParams.doneTime[1];
  388. Reflect.deleteProperty(requestParams.value, 'doneTime'); // 删除无用的参数
  389. state.loading = true;
  390. orderList(requestParams.value)
  391. .then((response: any) => {
  392. state.tableData = response?.result ?? [];
  393. state.loading = false;
  394. })
  395. .catch(() => {
  396. state.loading = false;
  397. });
  398. };
  399. // 查询总数
  400. const getTotal = () => {
  401. orderListCount(requestParams.value)
  402. .then((res) => {
  403. state.total = res.result ?? 0;
  404. })
  405. .catch(() => {
  406. });
  407. };
  408. /** 重置按钮操作 */
  409. const drawerRuleFormRef = ref();
  410. const ruleFormRef = ref<RefType>(); // 表单ref
  411. const drawer = ref(false);
  412. const resetQuery = (formEl: FormInstance | undefined) => {
  413. if (!formEl) return;
  414. formEl.resetFields();
  415. ruleFormRef.value?.resetFields();
  416. queryList();
  417. getTotal();
  418. };
  419. // 工单省退回
  420. const orderReturnRef = ref<RefType>(); // 工单退回ref
  421. const onReturn = (row: any) => {
  422. orderReturnRef.value.openDialog(row);
  423. };
  424. const tableRef = ref<RefType>();
  425. const toolbarRef = ref<RefType>();
  426. onMounted(() => {
  427. queryList();
  428. if (tableRef.value && toolbarRef.value) {
  429. tableRef.value.connect(toolbarRef.value);
  430. }
  431. getBaseData();
  432. getTotal();
  433. });
  434. </script>