index.vue 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. <template>
  2. <div class="supervision-dashboard">
  3. <el-card class="supervision-list">
  4. <h3>案件跟踪监督</h3>
  5. <el-row :gutter="20">
  6. <el-col :span="8">
  7. <el-input v-model="searchInput" placeholder="搜索案件..." clearable @keyup.enter="searchCases"></el-input>
  8. </el-col>
  9. <el-col :span="16">
  10. <el-form :inline="true" :model="filterForm" @submit.native.prevent>
  11. <el-form-item label="案件编号">
  12. <el-input v-model="filterForm.caseNumber" placeholder="案件编号"></el-input>
  13. </el-form-item>
  14. <el-form-item label="案件名称">
  15. <el-input v-model="filterForm.caseName" placeholder="案件名称"></el-input>
  16. </el-form-item>
  17. <el-form-item label="案件地址">
  18. <el-input v-model="filterForm.address" placeholder="案件地址"></el-input>
  19. </el-form-item>
  20. <el-form-item label="案件级别">
  21. <el-select v-model="filterForm.level" placeholder="请选择案件级别">
  22. <el-option label="紧急" value="紧急"></el-option>
  23. <el-option label="普通" value="普通"></el-option>
  24. </el-select>
  25. </el-form-item>
  26. <el-form-item label="报警类型">
  27. <el-select v-model="filterForm.type" placeholder="请选择报警类型">
  28. <el-option label="损坏" value="损坏"></el-option>
  29. <el-option label="丢失" value="丢失"></el-option>
  30. </el-select>
  31. </el-form-item>
  32. <el-form-item label="开始日期">
  33. <el-date-picker
  34. v-model="filterForm.startDate"
  35. type="date"
  36. placeholder="选择日期"
  37. format="yyyy-MM-dd"
  38. value-format="yyyy-MM-dd"
  39. ></el-date-picker>
  40. </el-form-item>
  41. <el-form-item label="结束日期">
  42. <el-date-picker
  43. v-model="filterForm.endDate"
  44. type="date"
  45. placeholder="选择日期"
  46. format="yyyy-MM-dd"
  47. value-format="yyyy-MM-dd"
  48. ></el-date-picker>
  49. </el-form-item>
  50. <el-form-item>
  51. <el-button type="primary" @click="searchCases">查询</el-button>
  52. </el-form-item>
  53. </el-form>
  54. </el-col>
  55. </el-row>
  56. <el-table :data="filteredCases" style="width: 100%" @row-click="handleRowClick">
  57. <el-table-column prop="caseNumber" label="案件编号"></el-table-column>
  58. <el-table-column prop="alarmLevel" label="报警级别"></el-table-column>
  59. <el-table-column prop="alarmType" label="报警类型"></el-table-column>
  60. <el-table-column prop="status" label="案件状态"></el-table-column>
  61. <el-table-column prop="description" label="报警描述"></el-table-column>
  62. <el-table-column prop="assignedTo" label="指派给"></el-table-column>
  63. <el-table-column prop="assignedDate" label="指派日期"></el-table-column>
  64. <el-table-column prop="lastUpdate" label="最后更新时间"></el-table-column>
  65. </el-table>
  66. </el-card>
  67. <el-card v-if="selectedCase" class="case-details">
  68. <h3>案件详情</h3>
  69. <el-descriptions :column="1" border>
  70. <el-descriptions-item label="案件编号">{{ selectedCase.caseNumber }}</el-descriptions-item>
  71. <el-descriptions-item label="报警类型">{{ selectedCase.alarmType }}</el-descriptions-item>
  72. <el-descriptions-item label="案件状态">{{ selectedCase.status }}</el-descriptions-item>
  73. <el-descriptions-item label="报警描述">{{ selectedCase.description }}</el-descriptions-item>
  74. <el-descriptions-item label="指派给">{{ selectedCase.assignedTo }}</el-descriptions-item>
  75. <el-descriptions-item label="指派日期">{{ selectedCase.assignedDate }}</el-descriptions-item>
  76. <el-descriptions-item label="最后更新时间">{{ selectedCase.lastUpdate }}</el-descriptions-item>
  77. <el-descriptions-item label="案件流转">
  78. <p>{{ selectedCase.flow }}</p>
  79. </el-descriptions-item>
  80. <el-descriptions-item label="办理经过">
  81. <p>{{ selectedCase.process }}</p>
  82. </el-descriptions-item>
  83. <el-descriptions-item label="结案信息">
  84. <p>{{ selectedCase.conclusion }}</p>
  85. </el-descriptions-item>
  86. </el-descriptions>
  87. </el-card>
  88. </div>
  89. </template>
  90. <script setup>
  91. import { ref, onMounted } from 'vue';
  92. import { ElMessage } from 'element-plus';
  93. // 模拟数据
  94. const cases = ref([
  95. {
  96. caseNumber: 'C20230915001',
  97. alarmLevel: '紧急',
  98. alarmType: '损坏',
  99. status: '处理中',
  100. description: '井盖破损严重,存在安全隐患。',
  101. assignedTo: '张三',
  102. assignedDate: '2023-09-15',
  103. lastUpdate: '2023-09-17',
  104. flow: '案件已分配给水务局,正在处理中...',
  105. process: '已收到工单,正在处理中...',
  106. conclusion: '案件已结案'
  107. },
  108. {
  109. caseNumber: 'C20230915002',
  110. alarmLevel: '普通',
  111. alarmType: '丢失',
  112. status: '已结案',
  113. description: '井盖丢失,行人通行不便。',
  114. assignedTo: '李四',
  115. assignedDate: '2023-09-15',
  116. lastUpdate: '2023-09-16',
  117. flow: '案件已分配给市政工程局,正在处理中...',
  118. process: '已收到工单,正在处理中...',
  119. conclusion: '案件已结案'
  120. }
  121. ]);
  122. const selectedCase = ref(null);
  123. const searchInput = ref('');
  124. const filterForm = ref({});
  125. // 筛选案件
  126. const filteredCases = computed(() => {
  127. let filtered = [...cases.value];
  128. if (searchInput.value) {
  129. filtered = filtered.filter((caseItem) =>
  130. Object.values(caseItem).some((value) => value.toString().includes(searchInput.value))
  131. );
  132. }
  133. if (filterForm.value.caseNumber) {
  134. filtered = filtered.filter((caseItem) => caseItem.caseNumber.includes(filterForm.value.caseNumber));
  135. }
  136. if (filterForm.value.caseName) {
  137. filtered = filtered.filter((caseItem) => caseItem.description.includes(filterForm.value.caseName));
  138. }
  139. if (filterForm.value.address) {
  140. filtered = filtered.filter((caseItem) => caseItem.description.includes(filterForm.value.address));
  141. }
  142. if (filterForm.value.level) {
  143. filtered = filtered.filter((caseItem) => caseItem.alarmLevel === filterForm.value.level);
  144. }
  145. if (filterForm.value.type) {
  146. filtered = filtered.filter((caseItem) => caseItem.alarmType === filterForm.value.type);
  147. }
  148. if (filterForm.value.startDate && filterForm.value.endDate) {
  149. const startDate = new Date(filterForm.value.startDate);
  150. const endDate = new Date(filterForm.value.endDate);
  151. filtered = filtered.filter((caseItem) => {
  152. const assignedDate = new Date(caseItem.assignedDate);
  153. return assignedDate >= startDate && assignedDate <= endDate;
  154. });
  155. }
  156. return filtered;
  157. });
  158. // 案件列表点击事件
  159. const handleRowClick = (row) => {
  160. selectedCase.value = row;
  161. };
  162. // 搜索案件
  163. const searchCases = () => {
  164. // 实现逻辑:根据输入的案件信息搜索相关案件
  165. console.log('搜索案件:', searchInput.value, filterForm.value);
  166. };
  167. // 初始化
  168. onMounted(() => {
  169. // 初始化逻辑
  170. });
  171. </script>
  172. <style scoped>
  173. .supervision-dashboard {
  174. padding: 20px;
  175. }
  176. .supervision-list,
  177. .case-details {
  178. margin-bottom: 20px;
  179. }
  180. </style>