index.vue 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  1. <template>
  2. <!-- 搜索 -->
  3. <ContentWrap>
  4. <el-form
  5. class="-mb-15px"
  6. :model="queryParams"
  7. ref="queryFormRef"
  8. :inline="true"
  9. label-width="80px"
  10. >
  11. <el-form-item label="内容摘要" prop="summary">
  12. <el-input
  13. @keyup.enter="handleQuery"
  14. v-model="queryParams.summary"
  15. placeholder="请输入工单内容摘要"
  16. class="!w-240px"
  17. clearable
  18. />
  19. </el-form-item>
  20. <el-form-item label="状态" prop="status">
  21. <el-select
  22. v-model="queryParams.status"
  23. placeholder="请选择状态"
  24. clearable
  25. style="width: 160px"
  26. >
  27. <el-option v-for="s in statusOptions" :key="s" :label="s" :value="s" />
  28. </el-select>
  29. </el-form-item>
  30. <el-form-item>
  31. <el-button @click="handleQuery">
  32. <Icon icon="ep:search" class="mr-5px" /> 搜索
  33. </el-button>
  34. <el-button @click="resetQuery">
  35. <Icon icon="ep:refresh" class="mr-5px" /> 重置
  36. </el-button>
  37. </el-form-item>
  38. </el-form>
  39. </ContentWrap>
  40. <!-- 列表 -->
  41. <ContentWrap>
  42. <Table2
  43. v-loading="loading"
  44. :data="list"
  45. :columns="ComplaintManagementColumns"
  46. :queryParams="queryParams"
  47. :op-width="110"
  48. :show-edit-condition="() => false"
  49. :show-detail-condition="() => false"
  50. :show-delete-condition="() => false"
  51. >
  52. <template #next="{ scope }">
  53. <el-button link type="primary" @click="handleDetail(scope)">详情</el-button>
  54. </template>
  55. </Table2>
  56. <!-- 分页 -->
  57. <Pagination
  58. :total="total"
  59. v-model:page="queryParams.pageNo"
  60. v-model:limit="queryParams.pageSize"
  61. @pagination="getList"
  62. />
  63. </ContentWrap>
  64. </template>
  65. <script lang="ts" setup>
  66. import { ComplaintManagementColumns } from './columns'
  67. defineOptions({ name: 'SystemComplaintManagement' })
  68. const message = useMessage()
  69. const loading = ref(true)
  70. const total = ref(0)
  71. const list = ref<any[]>([])
  72. const statusOptions = ['已解决', '处理中', '撤销工单']
  73. const queryParams = reactive({
  74. pageNo: 1,
  75. pageSize: 10,
  76. summary: undefined as string | undefined,
  77. status: undefined as string | undefined
  78. })
  79. const queryFormRef = ref()
  80. /** 写死的投诉管理数据(暂未对接接口) */
  81. const allList: any[] = [
  82. {
  83. date: '2026-04-10',
  84. source: '12345',
  85. category: '服务流程',
  86. summary: '家属反映院内蚊虫较多,要求加强灭蚊工作',
  87. relatedParty: '院内长者家属',
  88. status: '已解决'
  89. },
  90. {
  91. date: '2026-03-31',
  92. source: '12345',
  93. category: '服务流程',
  94. summary: '周边居民反映清晨6-8点有广播体操噪音扰民',
  95. relatedParty: '周边居民',
  96. status: '已解决'
  97. },
  98. {
  99. date: '2026-03-18',
  100. source: '12345',
  101. category: '服务流程',
  102. summary: '居民投诉厨房排风系统不定时发出巨大噪音',
  103. relatedParty: '周边居民',
  104. status: '已解决'
  105. },
  106. {
  107. date: '2026-03-17',
  108. source: '12345',
  109. category: '服务流程',
  110. summary: '长者外出就医期间,除床位费外仍收取护理费',
  111. relatedParty: '董卫红',
  112. status: '撤销工单'
  113. },
  114. {
  115. date: '2026-03-02',
  116. source: '12345',
  117. category: '服务流程',
  118. summary: '再次投诉午休12-14时仍听到洗衣房噪音',
  119. relatedParty: '周边居民',
  120. status: '已解决'
  121. },
  122. {
  123. date: '2026-02-21',
  124. source: '12345',
  125. category: '服务流程',
  126. summary: '投诉建筑背面排风机转动噪音,每日多个时段频发',
  127. relatedParty: '周边居民',
  128. status: '已解决'
  129. },
  130. {
  131. date: '2026-02-13',
  132. source: '12345',
  133. category: '服务流程',
  134. summary: '投诉4楼洗衣房洗衣机不定时发出噪音扰民',
  135. relatedParty: '周边居民',
  136. status: '已解决'
  137. },
  138. {
  139. date: '2026-02-13',
  140. source: '12345',
  141. category: '服务流程',
  142. summary: '家属投诉机构老人探视流程及时间安排问题',
  143. relatedParty: '宁迎明',
  144. status: '已解决'
  145. },
  146. {
  147. date: '2025-12-28',
  148. source: '12345',
  149. category: '环境卫生',
  150. summary: '家属反映老人房间卫生间渗水,地面长期湿滑存在安全隐患',
  151. relatedParty: '院内长者家属',
  152. status: '已解决'
  153. },
  154. {
  155. date: '2025-12-15',
  156. source: '12345',
  157. category: '设施设备',
  158. summary: '长者反映楼道照明灯损坏多日未维修,夜间出行不便',
  159. relatedParty: '院内长者',
  160. status: '已解决'
  161. },
  162. {
  163. date: '2025-12-03',
  164. source: '12345',
  165. category: '服务态度',
  166. summary: '家属投诉护理人员沟通态度生硬,缺乏耐心',
  167. relatedParty: '院内长者家属',
  168. status: '已解决'
  169. },
  170. {
  171. date: '2025-11-20',
  172. source: '12345',
  173. category: '餐饮照护',
  174. summary: '长者反映午餐菜品温度偏低,老年人肠胃不适应',
  175. relatedParty: '院内长者',
  176. status: '已解决'
  177. }
  178. ]
  179. /** 查询列表 */
  180. const getList = async () => {
  181. loading.value = true
  182. try {
  183. const kw = (queryParams.summary || '').trim()
  184. const st = queryParams.status
  185. const filtered = allList.filter((item) => {
  186. if (kw && !item.summary.includes(kw)) return false
  187. if (st && item.status !== st) return false
  188. return true
  189. })
  190. total.value = filtered.length
  191. const start = (queryParams.pageNo - 1) * queryParams.pageSize
  192. list.value = filtered.slice(start, start + queryParams.pageSize)
  193. } finally {
  194. loading.value = false
  195. }
  196. }
  197. /** 搜索按钮操作 */
  198. const handleQuery = () => {
  199. queryParams.pageNo = 1
  200. getList()
  201. }
  202. /** 重置按钮操作 */
  203. const resetQuery = () => {
  204. queryFormRef.value?.resetFields()
  205. queryParams.pageNo = 1
  206. getList()
  207. }
  208. /** 详情(暂无详情数据,仅占位) */
  209. const handleDetail = (row: any) => {
  210. message.info('详情功能开发中')
  211. }
  212. getList()
  213. </script>