reply.vue 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333
  1. <template>
  2. <div class="business-observations-Reply-container layout-padding">
  3. <div class="layout-padding-auto layout-padding-view pd20">
  4. <el-tabs v-model="state.queryParams.Type" @tab-change="handleQuery">
  5. <el-tab-pane name="0" label="待回复" :disabled="state.loading"></el-tab-pane>
  6. <el-tab-pane name="1" label="已回复" :disabled="state.loading"></el-tab-pane>
  7. </el-tabs>
  8. <el-form :model="state.queryParams" ref="ruleFormRef" @submit.native.prevent inline :disabled="state.loading">
  9. <el-form-item label="数据范围" prop="DataSoure">
  10. <el-segmented
  11. :options="[
  12. {
  13. value: '0',
  14. label: '全部',
  15. },
  16. {
  17. value: '1',
  18. label: '本级',
  19. },
  20. ]"
  21. v-model="state.queryParams.DataSoure"
  22. @change="handleQuery"
  23. :disabled="state.loading"
  24. />
  25. </el-form-item>
  26. <el-form-item label="工单编码" prop="No">
  27. <el-input v-model.trim="state.queryParams.No" placeholder="工单编码" clearable @keyup.enter="handleQuery" class="keyword-input" />
  28. </el-form-item>
  29. <el-form-item label="工单标题" prop="Title">
  30. <el-input v-model.trim="state.queryParams.Title" placeholder="工单标题" clearable @keyup.enter="handleQuery" class="keyword-input" />
  31. </el-form-item>
  32. <el-form-item>
  33. <el-button type="primary" @click="handleQuery" :loading="state.loading"> <SvgIcon name="ele-Search" class="mr5" />查询 </el-button>
  34. <el-button @click="drawer = true" class="default-button"> <SvgIcon name="ele-Search" class="mr5" />更多查询</el-button>
  35. </el-form-item>
  36. </el-form>
  37. <vxe-toolbar
  38. ref="toolbarRef"
  39. :loading="state.loading"
  40. custom
  41. :refresh="{
  42. queryMethod: handleQuery,
  43. }"
  44. :tools="[{ toolRender: { name: 'exportCurrent' } }, { toolRender: { name: 'exportAll' } }]"
  45. >
  46. </vxe-toolbar>
  47. <div style="overflow: hidden; width: 100%; height: 100%; flex: 1">
  48. <vxe-table
  49. border
  50. :loading="state.loading"
  51. :data="state.tableData"
  52. :column-config="{ resizable: true }"
  53. :row-config="{ isCurrent: true, isHover: true, height: 30, useKey: true }"
  54. ref="tableRef"
  55. height="auto"
  56. auto-resize
  57. show-overflow
  58. :scrollY="{ enabled: true, gt: 100 }"
  59. id="businessObservationsReply"
  60. :custom-config="{ storage: true }"
  61. showHeaderOverflow
  62. :params="{ exportMethod: exportObservationsReplyList, exportParams: requestParams }"
  63. @sort-change="sortChange"
  64. >
  65. <vxe-column field="no" title="工单编码" width="140"></vxe-column>
  66. <vxe-column field="title" title="工单标题" min-width="200">
  67. <template #default="{ row }">
  68. <order-detail :order="{ id: row.orderId }" @updateList="queryList">{{ row.title }}</order-detail>
  69. </template>
  70. </vxe-column>
  71. <vxe-column field="acceptType" title="受理类型" width="110"></vxe-column>
  72. <vxe-column field="hotspotName" title="热点分类" width="150"></vxe-column>
  73. <vxe-column field="acceptanceTime" title="受理时间" width="160" sortable>
  74. <template #default="{ row }">
  75. {{ formatDate(row.acceptanceTime, 'YYYY-mm-dd HH:MM:SS') }}
  76. </template>
  77. </vxe-column>
  78. <vxe-column field="expiredTime" title="期满时间" width="160" sortable>
  79. <template #default="{ row }">
  80. {{ formatDate(row.expiredTime, 'YYYY-mm-dd HH:MM:SS') }}
  81. </template>
  82. </vxe-column>
  83. <vxe-column field="actualHandleOrgName" title="接办部门" width="140"></vxe-column>
  84. <vxe-column field="filedTime" title="办结时间" width="160" sortable>
  85. <template #default="{ row }">
  86. {{ formatDate(row.filedTime, 'YYYY-mm-dd HH:MM:SS') }}
  87. </template>
  88. </vxe-column>
  89. <template v-if="state.queryParams.Type === '1'">
  90. <vxe-column field="replyUserName" title="回复人" width="140"></vxe-column>
  91. <vxe-column field="replyTime" title="回复时间" width="160" sortable>
  92. <template #default="{ row }">
  93. {{ formatDate(row.replyTime, 'YYYY-mm-dd HH:MM:SS') }}
  94. </template>
  95. </vxe-column>
  96. </template>
  97. <vxe-column title="操作" fixed="right" width="90" align="center" :show-overflow="false">
  98. <template #default="{ row }">
  99. <el-button
  100. link
  101. type="primary"
  102. @click="onReply(row)"
  103. title="回复"
  104. v-auth="'business:observations:reply'"
  105. v-if="state.queryParams.Type === '0'"
  106. >
  107. 回复
  108. </el-button>
  109. <el-button link type="primary" @click="onDetail(row)" title="查看回复" v-else> 查看回复 </el-button>
  110. </template>
  111. </vxe-column>
  112. </vxe-table>
  113. </div>
  114. <pagination
  115. @pagination="queryList"
  116. :total="state.total"
  117. v-model:current-page="state.queryParams.PageIndex"
  118. v-model:page-size="state.queryParams.PageSize"
  119. :disabled="state.loading"
  120. />
  121. </div>
  122. <!-- 更多查询 -->
  123. <el-drawer v-model="drawer" title="更多查询" size="500px">
  124. <el-form :model="state.queryParams" ref="drawerRuleFormRef" @submit.native.prevent label-width="100px" :disabled="state.loading">
  125. <el-form-item label="受理类型" prop="AcceptType">
  126. <el-select v-model="state.queryParams.AcceptType" placeholder="请选择受理类型" clearable @change="handleQuery">
  127. <el-option v-for="item in acceptTypeOptions" :value="item.dicDataValue" :key="item.dicDataValue" :label="item.dicDataName" />
  128. </el-select>
  129. </el-form-item>
  130. <el-form-item label="受理时间" prop="slTime">
  131. <el-date-picker
  132. v-model="state.queryParams.slTime"
  133. type="datetimerange"
  134. unlink-panels
  135. range-separator="至"
  136. start-placeholder="开始时间"
  137. end-placeholder="结束时间"
  138. :shortcuts="shortcuts"
  139. @change="handleQuery"
  140. value-format="YYYY-MM-DD[T]HH:mm:ss"
  141. :default-time="defaultTimeStartEnd"
  142. />
  143. </el-form-item>
  144. <el-form-item label="期满时间" prop="exTime">
  145. <el-date-picker
  146. v-model="state.queryParams.exTime"
  147. type="datetimerange"
  148. unlink-panels
  149. range-separator="至"
  150. start-placeholder="开始时间"
  151. end-placeholder="结束时间"
  152. :shortcuts="shortcuts"
  153. @change="handleQuery"
  154. value-format="YYYY-MM-DD[T]HH:mm:ss"
  155. :default-time="defaultTimeStartEnd"
  156. />
  157. </el-form-item>
  158. <el-form-item label="接办部门" prop="ActualHandleOrgName">
  159. <el-input v-model="state.queryParams.ActualHandleOrgName" placeholder="请填写接办部门名称" clearable @keyup.enter="handleQuery" />
  160. </el-form-item>
  161. <el-form-item label="热点分类" prop="Hotspot">
  162. <el-input v-model="state.queryParams.Hotspot" placeholder="热点分类名称" clearable @keyup.enter="handleQuery" />
  163. </el-form-item>
  164. <el-form-item label="办结时间" prop="bjTime">
  165. <el-date-picker
  166. v-model="state.queryParams.bjTime"
  167. type="datetimerange"
  168. unlink-panels
  169. range-separator="至"
  170. start-placeholder="开始时间"
  171. end-placeholder="结束时间"
  172. :shortcuts="shortcuts"
  173. @change="handleQuery"
  174. value-format="YYYY-MM-DD[T]HH:mm:ss"
  175. :default-time="defaultTimeStartEnd"
  176. />
  177. </el-form-item>
  178. <template v-if="state.queryParams.Type === '1'">
  179. <el-form-item label="回复人" prop="ReplyUserName">
  180. <el-input v-model="state.queryParams.ReplyUserName" placeholder="回复人" clearable @keyup.enter="handleQuery" />
  181. </el-form-item>
  182. <el-form-item label="回复时间" prop="hfTime">
  183. <el-date-picker
  184. v-model="state.queryParams.hfTime"
  185. type="datetimerange"
  186. unlink-panels
  187. range-separator="至"
  188. start-placeholder="开始时间"
  189. end-placeholder="结束时间"
  190. :shortcuts="shortcuts"
  191. @change="handleQuery"
  192. value-format="YYYY-MM-DD[T]HH:mm:ss"
  193. :default-time="defaultTimeStartEnd"
  194. />
  195. </el-form-item>
  196. </template>
  197. </el-form>
  198. <template #footer>
  199. <el-button type="primary" @click="handleQuery" :loading="state.loading"> <SvgIcon name="ele-Search" class="mr5" />查询 </el-button>
  200. <el-button @click="resetQuery(drawerRuleFormRef)" class="default-button"> <SvgIcon name="ele-Refresh" class="mr5" />重置 </el-button>
  201. </template>
  202. </el-drawer>
  203. <!-- 回复 -->
  204. <observe-reply ref="observeReplyRef" @updateList="queryList" />
  205. <!-- 回复详情 -->
  206. <observe-detail ref="observeDetailRef" @updateList="queryList" />
  207. </div>
  208. </template>
  209. <script setup lang="tsx" name="businessObservationsReply">
  210. import { defineAsyncComponent, onMounted, reactive, ref } from 'vue';
  211. import { FormInstance } from 'element-plus';
  212. import { formatDate } from '@/utils/formatTime';
  213. import { observeBaseData } from '@/api/query/observe';
  214. import { defaultTimeStartEnd, shortcuts } from '@/utils/constants';
  215. import Other from '@/utils/other';
  216. import { exportObservationsReplyList, getObservationsReplyList } from '@/api/business/observations';
  217. // 引入组件
  218. const OrderDetail = defineAsyncComponent(() => import('@/components/OrderDetail/index.vue')); // 工单详情
  219. const pagination = defineAsyncComponent(() => import('@/components/ProTable/components/Pagination.vue')); // 分页
  220. const ObserveReply = defineAsyncComponent(() => import('@/views/business/observations/components/Observe-reply.vue')); // 回复
  221. const ObserveDetail = defineAsyncComponent(() => import('@/views/business/observations/components/Observe-detail.vue')); // 回复详情
  222. // 定义变量内容
  223. const ruleFormRef = ref<RefType>(); // 表单ref
  224. const state = reactive<any>({
  225. queryParams: {
  226. // 查询条件
  227. PageIndex: 1,
  228. PageSize: 20,
  229. Keyword: null, // 关键字
  230. No: null,
  231. Title: null,
  232. slTime: [], // 受理时间
  233. AcceptanceStartTime: null,
  234. AcceptanceEndTime: null,
  235. exTime: [], // 期满时间
  236. ExpiredStartTime: null,
  237. ExpiredEndTime: null,
  238. ActualHandleOrgName: null, // 接办部门
  239. AcceptType: null, //受理类型
  240. Hotspot: null, // 热点分类
  241. DataSoure: '0', // 数据范围 0:全部 ,1:本级
  242. Type: '0', // 0:待回复 1:已回复
  243. bjTime: [], // 办结时间
  244. FiledStartTime: null,
  245. FiledEndTime: null,
  246. ReplyUserName: null, // 回复人
  247. hfTime: [], // 回复时间
  248. ReplyStartTime: null,
  249. ReplyEndTime: null,
  250. },
  251. tableData: [], //表单
  252. loading: false, // 加载
  253. total: 0, // 总数
  254. });
  255. // 手动查询,将页码设置为1
  256. const handleQuery = () => {
  257. state.queryParams.PageIndex = 1;
  258. queryList();
  259. };
  260. /** 获取列表 */
  261. const requestParams = ref<EmptyObjectType>({});
  262. const queryList = () => {
  263. state.loading = true;
  264. requestParams.value = Other.deepClone(state.queryParams);
  265. requestParams.value.AcceptanceStartTime = state.queryParams.slTime === null ? null : state.queryParams.slTime[0]; // 受理时间
  266. requestParams.value.AcceptanceEndTime = state.queryParams.slTime === null ? null : state.queryParams.slTime[1];
  267. Reflect.deleteProperty(requestParams.value, 'slTime'); // 删除无用的参数
  268. requestParams.value.ExpiredStartTime = state.queryParams.exTime === null ? null : state.queryParams.exTime[0]; // 期满时间
  269. requestParams.value.ExpiredEndTime = state.queryParams.exTime === null ? null : state.queryParams.exTime[1];
  270. Reflect.deleteProperty(requestParams.value, 'exTime'); // 删除无用的参数
  271. requestParams.value.FiledStartTime = state.queryParams.bjTime === null ? null : state.queryParams.bjTime[0]; // 办结时间
  272. requestParams.value.FiledEndTime = state.queryParams.bjTime === null ? null : state.queryParams.bjTime[1];
  273. Reflect.deleteProperty(requestParams.value, 'bjTime'); // 删除无用的参数
  274. requestParams.value.ReplyStartTime = state.queryParams.hfTime === null ? null : state.queryParams.hfTime[0]; // 回复时间
  275. requestParams.value.ReplyEndTime = state.queryParams.hfTime === null ? null : state.queryParams.hfTime[1];
  276. Reflect.deleteProperty(requestParams.value, 'hfTime'); // 删除无用的参数
  277. getObservationsReplyList(requestParams.value)
  278. .then((res) => {
  279. state.tableData = res?.result.items ?? [];
  280. state.total = res?.result.total;
  281. state.loading = false;
  282. })
  283. .finally(() => {
  284. state.loading = false;
  285. });
  286. };
  287. // 排序
  288. const sortChange = (val: any) => {
  289. state.queryParams.SortField = val.order ? val.field : null;
  290. // 0 升序 1 降序
  291. state.queryParams.SortRule = val.order ? (val.order == 'desc' ? 1 : 0) : null;
  292. queryList();
  293. };
  294. /** 重置按钮操作 */
  295. const drawerRuleFormRef = ref();
  296. const drawer = ref(false);
  297. const resetQuery = (formEl: FormInstance | undefined) => {
  298. if (!formEl) return;
  299. formEl.resetFields();
  300. ruleFormRef.value?.resetFields();
  301. queryList();
  302. };
  303. // 回复
  304. const observeReplyRef = ref<RefType>();
  305. const onReply = (row: any) => {
  306. observeReplyRef.value.openDialog(row);
  307. };
  308. // 回复详情
  309. const observeDetailRef = ref<RefType>();
  310. const onDetail = (row: any) => {
  311. observeDetailRef.value.openDialog(row);
  312. };
  313. // 获取基础信息
  314. const acceptTypeOptions = ref<EmptyArrayType>([]); // 受理类型
  315. const getBaseInfo = async () => {
  316. // 获取基础信息
  317. try {
  318. const { result } = await observeBaseData();
  319. acceptTypeOptions.value = result.acceptTypeOptions;
  320. } catch (e) {
  321. console.log(e);
  322. }
  323. };
  324. const tableRef = ref<RefType>();
  325. const toolbarRef = ref<RefType>();
  326. onMounted(() => {
  327. queryList();
  328. if (tableRef.value && toolbarRef.value) {
  329. tableRef.value.connect(toolbarRef.value);
  330. }
  331. getBaseInfo();
  332. });
  333. </script>