index.vue 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364
  1. <template>
  2. <div class="business-delay-container layout-pd">
  3. <!-- 搜索 -->
  4. <el-card shadow="never">
  5. <el-form :model="state.queryParams" ref="ruleFormRef" @submit.native.prevent class="mt15" label-width="100px">
  6. <el-row :gutter="10">
  7. <el-col :span="8">
  8. <el-form-item label="发布状态" prop="AcceptType">
  9. <el-select v-model="state.queryParams.AcceptType" placeholder="请选择发布状态" multiple clearable class="w100">
  10. <el-option v-for="item in state.acceptTypeOptions" :value="item.key" :key="item.key" :label="item.value" />
  11. </el-select>
  12. </el-form-item>
  13. </el-col>
  14. <el-col :span="8">
  15. <el-form-item label="工单标题" prop="Keyword">
  16. <el-input v-model="state.queryParams.Keyword" placeholder="工单编码/标题" clearable @keyup.enter="queryList" />
  17. </el-form-item>
  18. </el-col>
  19. <transition name="el-zoom-in-top">
  20. <el-col :span="8" v-show="!searchCol">
  21. <el-form-item label="发布人" prop="Content">
  22. <el-input v-model="state.queryParams.Content" placeholder="姓名/工号" clearable @keyup.enter="queryList" />
  23. </el-form-item>
  24. </el-col>
  25. </transition>
  26. <transition name="el-zoom-in-top">
  27. <el-col :span="8" v-show="!searchCol">
  28. <el-form-item label="发布范围" prop="AcceptType">
  29. <el-select v-model="state.queryParams.AcceptType" placeholder="请选择发布范围" multiple clearable class="w100">
  30. <el-option v-for="item in state.acceptTypeOptions" :value="item.key" :key="item.key" :label="item.value" />
  31. </el-select>
  32. </el-form-item>
  33. </el-col>
  34. </transition>
  35. <transition name="el-zoom-in-top">
  36. <el-col :span="8" v-show="!searchCol">
  37. <el-form-item label="受理类型" prop="Channel">
  38. <el-select v-model="state.queryParams.Channel" placeholder="请选择受理类型" multiple clearable class="w100">
  39. <el-option v-for="item in state.channelOptions" :value="item.dicDataValue" :key="item.dicDataValue" :label="item.dicDataName" />
  40. </el-select>
  41. </el-form-item>
  42. </el-col>
  43. </transition>
  44. <transition name="el-zoom-in-top">
  45. <el-col :span="8" v-show="!searchCol">
  46. <el-form-item label="热点分类" prop="HotspotId">
  47. <el-tree-select
  48. class="w100"
  49. v-model="state.queryParams.HotspotId"
  50. filterable
  51. clearable
  52. multiple
  53. :render-after-expand="false"
  54. show-checkbox
  55. placeholder="请选择热点分类"
  56. :props="HotspotProps"
  57. lazy
  58. :load="load"
  59. node-key="id"
  60. check-strictly
  61. />
  62. </el-form-item>
  63. </el-col>
  64. </transition>
  65. <transition name="el-zoom-in-top">
  66. <el-col :span="8" v-show="!searchCol">
  67. <el-form-item label="受理时间" prop="crTime">
  68. <el-date-picker
  69. v-model="state.queryParams.crTime"
  70. type="datetimerange"
  71. unlink-panels
  72. range-separator="至"
  73. start-placeholder="开始时间"
  74. end-placeholder="结束时间"
  75. :shortcuts="shortcuts"
  76. @change="timeStartChangeCr"
  77. value-format="YYYY-MM-DD[T]HH:mm:ss"
  78. />
  79. </el-form-item>
  80. </el-col>
  81. </transition>
  82. <transition name="el-zoom-in-top">
  83. <el-col :span="8" v-show="!searchCol">
  84. <el-form-item label="归档时间" prop="exTime">
  85. <el-date-picker
  86. v-model="state.queryParams.exTime"
  87. type="datetimerange"
  88. unlink-panels
  89. range-separator="至"
  90. start-placeholder="开始时间"
  91. end-placeholder="结束时间"
  92. :shortcuts="shortcuts"
  93. @change="timeStartChangeEx"
  94. value-format="YYYY-MM-DD[T]HH:mm:ss"
  95. />
  96. </el-form-item>
  97. </el-col>
  98. </transition>
  99. <el-col :span="8">
  100. <div class="flex-end w100">
  101. <el-button type="primary" @click="queryList" :loading="state.loading"> <SvgIcon name="ele-Search" class="mr5" />查询 </el-button>
  102. <el-button @click="resetQuery(ruleFormRef)" v-waves class="default-button" :loading="state.loading">
  103. <SvgIcon name="ele-Refresh" class="mr5" />重置
  104. </el-button>
  105. <el-button link type="primary" @click="closeSearch">
  106. {{ searchCol ? '展开' : '收起' }}
  107. <SvgIcon :class="{ 'is-reverse': searchCol }" name="ele-ArrowUp" class="mr5 arrow" size="18px" />
  108. </el-button>
  109. </div>
  110. </el-col>
  111. </el-row>
  112. </el-form>
  113. </el-card>
  114. <el-card shadow="never">
  115. <!-- 功能按钮 -->
  116. <div class="mb20">
  117. <el-button type="primary" @click="onExport" v-auth="'business:delay:export'" :disabled="!multipleSelection.length">
  118. <SvgIcon name="iconfont icon-daochu" class="mr5" />导出
  119. </el-button>
  120. </div>
  121. <!-- 表格 -->
  122. <el-table :data="state.tableList" v-loading="state.loading" row-key="id" ref="multipleTableRef" @selection-change="handleSelectionChange">
  123. <el-table-column type="selection" width="55" />
  124. <el-table-column prop="no" label="工单编号" show-overflow-tooltip></el-table-column>
  125. <el-table-column prop="acceptTypeText" label="省/市工单" show-overflow-tooltip></el-table-column>
  126. <el-table-column label="工单标题" show-overflow-tooltip width="400">
  127. <template #default="{ row }">
  128. <el-button link type="primary">{{ row.title }}</el-button>
  129. </template>
  130. </el-table-column>
  131. <el-table-column prop="expiredTime" label="受理时间" show-overflow-tooltip width="170">
  132. <template #default="{ row }">
  133. <span>{{ formatDate(row.expiredTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
  134. </template>
  135. </el-table-column>
  136. <el-table-column prop="employeeName" label="受理人" show-overflow-tooltip width="170">
  137. <template #default="{ row }">
  138. <span>{{ row.employeeName + '[' + row.employeeStaffNo + ']' }}</span>
  139. </template>
  140. </el-table-column>
  141. <el-table-column prop="hotspotName" label="热点分类" show-overflow-tooltip></el-table-column>
  142. <el-table-column prop="acceptTypeText" label="受理类型" show-overflow-tooltip></el-table-column>
  143. <el-table-column prop="acceptTypeText" label="接办部门" show-overflow-tooltip></el-table-column>
  144. <el-table-column prop="expiredTime" label="接办时间" show-overflow-tooltip width="170">
  145. <template #default="{ row }">
  146. <span>{{ formatDate(row.expiredTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
  147. </template>
  148. </el-table-column>
  149. <el-table-column prop="acceptTypeText" label="延期申请状态" show-overflow-tooltip></el-table-column>
  150. <el-table-column prop="expiredTime" label="延期申请时间" show-overflow-tooltip width="170">
  151. <template #default="{ row }">
  152. <span>{{ formatDate(row.expiredTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
  153. </template>
  154. </el-table-column>
  155. <el-table-column prop="acceptTypeText" label="延期申请人" show-overflow-tooltip></el-table-column>
  156. <el-table-column prop="acceptTypeText" label="延期申请部门" show-overflow-tooltip></el-table-column>
  157. <el-table-column prop="acceptTypeText" label="延期申请时限" show-overflow-tooltip></el-table-column>
  158. <el-table-column prop="acceptTypeText" label="延期申请单位" show-overflow-tooltip></el-table-column>
  159. <el-table-column prop="acceptTypeText" label="申请理由" show-overflow-tooltip></el-table-column>
  160. <el-table-column prop="expiredTime" label="申请前期满时间" show-overflow-tooltip width="170">
  161. <template #default="{ row }">
  162. <span>{{ formatDate(row.expiredTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
  163. </template>
  164. </el-table-column>
  165. <el-table-column prop="expiredTime" label="通过后期满时间" show-overflow-tooltip width="170">
  166. <template #default="{ row }">
  167. <span>{{ formatDate(row.expiredTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
  168. </template>
  169. </el-table-column>
  170. <el-table-column label="操作" width="150" fixed="right" align="center">
  171. <template #default="{ row }">
  172. <el-button link type="primary" @click="onOrderDetail(row)" title="查看延期详情" v-auth="'business:delay:detail'"> 延期详情 </el-button>
  173. <el-button link type="primary" @click="processDetail(row)" title="查看流程明细" v-auth="'business:delay:processDetail'">
  174. 流程明细
  175. </el-button>
  176. <el-button link type="primary" @click="revocation(row)" title="撤销延期申请" v-auth="'business:delay:revocation'"> 撤销 </el-button>
  177. </template>
  178. </el-table-column>
  179. <template #empty>
  180. <Empty />
  181. </template>
  182. </el-table>
  183. <!-- 分页 -->
  184. <pagination
  185. :total="state.total"
  186. v-model:page="state.queryParams.PageIndex"
  187. v-model:limit="state.queryParams.PageSize"
  188. @pagination="queryList"
  189. />
  190. </el-card>
  191. <!-- 工单详情 -->
  192. <order-detail ref="OrderDetailRef" @updateList="queryList" />
  193. <!-- 工单延期 -->
  194. <order-delay ref="OrderDelayRef" @updateList="queryList" />
  195. </div>
  196. </template>
  197. <script setup lang="ts" name="orderDelay">
  198. import { defineAsyncComponent, onMounted, reactive, ref } from 'vue';
  199. import { hotSpotType, listBaseData } from '/@/api/business/order';
  200. import { ElButton, ElMessage, ElMessageBox, FormInstance } from 'element-plus';
  201. import { auth } from '/@/utils/authFunction';
  202. import { throttle } from '/@/utils/tools';
  203. import { shortcuts } from '/@/utils/constants';
  204. import { formatDate } from '/@/utils/formatTime';
  205. import { useRouter } from 'vue-router';
  206. // 引入组件
  207. const OrderDetail = defineAsyncComponent(() => import('/@/views/business/order/components/Order-detail.vue')); // 工单详情
  208. const OrderDelay = defineAsyncComponent(() => import('/@/views/business/delay/components/Order-delay.vue')); // 工单延期
  209. // 定义变量内容
  210. const state = reactive(<any>{
  211. queryParams: {
  212. // 查询条件
  213. PageIndex: 1,
  214. PageSize: 10,
  215. Keyword: '', // 关键字
  216. Content: '', // 工单内容
  217. AcceptType: '', // 受理类型
  218. Channel: '', // 渠道
  219. HotspotId: [], // 热点
  220. OrgCode: [], // 机构
  221. NameOrNo: '', // 受理坐席
  222. crTime: [], // 创建时间
  223. CreationTimeStart: '', // 创建时间 开始
  224. CreationTimeEnd: '', // 创建时间 结束
  225. TransferPhone: '', // 转派人
  226. EmergencyLevel: [], // 紧急程度
  227. exTime: [], // 办理期限
  228. ExpiredTimeStart: '', //办理期限 开始
  229. ExpiredTimeEnd: '', //办理期限 结束
  230. PhoneNo: '', // 手机号
  231. Status: [], // 状态
  232. pushTypeOptions: '', //
  233. PushTypeCode: '', //推送类型
  234. },
  235. tableList: [{}], //表单
  236. loading: false, // 加载
  237. total: 0, // 总数
  238. acceptTypeOptions: [], //受理类型
  239. channelOptions: [], // 来源频道
  240. emergencyLevelOptions: [], // 紧急程度
  241. orderStatusOptions: [], // 工单状态
  242. orgsOptions: [], // 部门
  243. pushTypeOptions: [], //推送分类
  244. orgData: [], // 机构数据
  245. });
  246. const ruleFormRef = ref<RefType>(); // 表单ref
  247. const searchCol = ref(true); // 展开/收起
  248. const OrderDetailRef = ref<RefType>(); // 工单详情ref
  249. const router = useRouter(); // 路由
  250. // 热点分类远程搜索
  251. const HotspotProps = {
  252. label: 'hotSpotName',
  253. children: 'children',
  254. isLeaf: 'isLeaf',
  255. };
  256. // 热点分类远程搜索
  257. const load = async (node: any, resolve: any) => {
  258. if (node.isLeaf) return resolve([]);
  259. let res: any = await hotSpotType({ id: node.data.id ? node.data.id : '' });
  260. resolve(res.result);
  261. };
  262. // 展开/收起
  263. const closeSearch = () => {
  264. searchCol.value = !searchCol.value;
  265. };
  266. const handleTimeChange = (val: string[], startKey: string, endKey: string) => {
  267. if (val) {
  268. state.queryParams[startKey] = val[0];
  269. state.queryParams[endKey] = val[1];
  270. } else {
  271. state.queryParams[startKey] = '';
  272. state.queryParams[endKey] = '';
  273. }
  274. };
  275. // 受理时间
  276. const timeStartChangeCr = (val: string[]) => {
  277. handleTimeChange(val, 'CreationTimeStart', 'CreationTimeEnd');
  278. };
  279. // 过期时间
  280. const timeStartChangeEx = (val: string[]) => {
  281. handleTimeChange(val, 'ExpiredTimeStart', 'ExpiredTimeEnd');
  282. };
  283. // 获取查询条件基础信息
  284. const getBaseData = async () => {
  285. const res: any = await listBaseData();
  286. state.acceptTypeOptions = res.result?.acceptTypeOptions ?? [];
  287. state.channelOptions = res.result?.channelOptions ?? [];
  288. state.emergencyLevelOptions = res.result?.emergencyLevelOptions ?? [];
  289. state.orgsOptions = res.result?.orgsOptions ?? [];
  290. state.pushTypeOptions = res.result?.pushTypeOptions ?? [];
  291. state.orderStatusOptions = res.result?.orderStatusOptions ?? [];
  292. };
  293. /** 获取列表 */
  294. const queryList = throttle(() => {
  295. if (!auth('business:backlog:query')) ElMessage.error('抱歉,您没有权限查看工单待办!');
  296. else {
  297. }
  298. }, 500);
  299. /** 重置按钮操作 */
  300. const resetQuery = throttle((formEl: FormInstance | undefined) => {
  301. if (!formEl) return;
  302. formEl.resetFields();
  303. state.queryParams.CreationTimeStart = '';
  304. state.queryParams.CreationTimeEnd = '';
  305. state.queryParams.ExpiredTimeStart = '';
  306. state.queryParams.ExpiredTimeStart = '';
  307. queryList();
  308. }, 500);
  309. // 导出
  310. const onExport = () => {
  311. console.log('导出');
  312. };
  313. const OrderDelayRef = ref<RefType>();
  314. // 查看延期详情
  315. const onOrderDetail = (row: any) => {
  316. console.log(row, '查看延期详情');
  317. OrderDelayRef.value.openDialog();
  318. };
  319. // 流程明细
  320. const processDetail = () => {};
  321. // 撤销
  322. const revocation = (row: any) => {
  323. ElMessageBox.confirm(`确认撤销【${row.no}】?`, '提示', {
  324. confirmButtonText: '确认',
  325. cancelButtonText: '取消',
  326. type: 'warning',
  327. draggable: true,
  328. cancelButtonClass: 'default-button',
  329. autofocus: false,
  330. })
  331. .then(() => {
  332. // orderDelete(row.id).then(() => {
  333. // ElMessage.success('操作成功');
  334. // queryList();
  335. // });
  336. })
  337. .catch(() => {});
  338. };
  339. // 表格多选
  340. const multipleTableRef = ref<RefType>();
  341. const multipleSelection = ref<any>([]);
  342. const handleSelectionChange = (val: any[]) => {
  343. multipleSelection.value = val;
  344. };
  345. onMounted(async () => {
  346. await getBaseData();
  347. queryList();
  348. });
  349. </script>
  350. <style scoped lang="scss">
  351. .business-delay-container {
  352. .arrow {
  353. transition: transform var(--el-transition-duration);
  354. cursor: pointer;
  355. }
  356. .arrow.is-reverse {
  357. transform: rotateZ(-180deg);
  358. }
  359. }
  360. </style>