RelateElderDialog.vue 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. <template>
  2. <Dialog v-model="dialogVisible" title="关联长者设置" width="56vw">
  3. <!-- 搜索栏 -->
  4. <el-form :model="queryParams" ref="queryFormRef" :inline="true" class="mb-4">
  5. <el-form-item label="长者姓名:">
  6. <el-input v-model="queryParams.elderName" placeholder="请输入" clearable style="width: 20vw"/>
  7. </el-form-item>
  8. <el-form-item label="关联状态:">
  9. <el-select v-model="queryParams.relationStatus" placeholder="请选择" clearable style="width: 20vw">
  10. <el-option label="未关联" value="未关联" />
  11. <el-option label="已关联" value="已关联" />
  12. </el-select>
  13. </el-form-item>
  14. <el-form-item label="居住地址:">
  15. <el-cascader
  16. v-model="queryParams.areaCode"
  17. :options="areaTree"
  18. :props="defaultProps"
  19. placeholder="请选择省/市/街道"
  20. clearable
  21. style="width: 20vw;"
  22. />
  23. </el-form-item>
  24. <el-form-item>
  25. <el-button type="primary" @click="handleQuery">查询</el-button>
  26. <el-button @click="resetQuery">重置</el-button>
  27. </el-form-item>
  28. </el-form>
  29. <!-- 批量关联按钮 -->
  30. <div class="mb-4">
  31. <el-button type="primary" @click="handleBatchRelate" :disabled="!selectedIds.length">
  32. 批量关联长者
  33. </el-button>
  34. </div>
  35. <!-- 长者列表 -->
  36. <el-table
  37. v-loading="loading"
  38. :data="list"
  39. @selection-change="handleSelectionChange"
  40. >
  41. <el-table-column type="selection" width="55" />
  42. <el-table-column type="index" label="序号" width="80" />
  43. <el-table-column prop="elderName" label="长者姓名" />
  44. <el-table-column prop="sex" label="性别" width="80" >
  45. <template #default="scope">
  46. {{scope.row.sex=="1"?"男":"女"}}
  47. </template>
  48. </el-table-column>
  49. <el-table-column prop="age" label="年龄" width="80" />
  50. <el-table-column prop="phone" label="联系方式" />
  51. <el-table-column prop="currentLiveAddress" label="居住地址" show-overflow-tooltip/>
  52. <el-table-column label="操作" align="center" width="120">
  53. <template #default="scope">
  54. <el-button link type="primary" @click="handleRelate(scope.row)">
  55. 关联长者
  56. </el-button>
  57. </template>
  58. </el-table-column>
  59. </el-table>
  60. <!-- 分页 -->
  61. <div class="flex justify-end mt-4">
  62. <el-pagination
  63. v-model:current-page="queryParams.pageNo"
  64. v-model:page-size="queryParams.pageSize"
  65. :total="total"
  66. :page-sizes="[10, 20, 30, 50]"
  67. layout="total, sizes, prev, pager, next, jumper"
  68. @size-change="getList"
  69. @current-change="getList"
  70. />
  71. </div>
  72. </Dialog>
  73. </template>
  74. <script lang="ts" setup>
  75. import * as ElderApi from '@/api/living-home/elderly'
  76. import * as AreaApi from '@/api/system/area'
  77. import { defaultProps, handleTree } from '@/utils/tree'
  78. import {getHomeElderlyList} from "@/api/living-home/elderly";
  79. defineOptions({ name: 'RelateElderDialog' })
  80. const message = useMessage() // 消息弹窗
  81. const defaultProps = {
  82. children: 'children',
  83. label: 'name',
  84. value: 'id',
  85. isLeaf: 'leaf',
  86. emitPath: false,
  87. checkStrictly: true,
  88. }
  89. const dialogVisible = ref(false) // 弹窗显示状态
  90. const loading = ref(false) // 加载状态
  91. const list = ref<any[]>([]) // 长者列表
  92. const total = ref(0) // 总数
  93. const selectedIds = ref<number[]>([]) // 选中的长者ID
  94. const servicePersonId = ref<number>() // 当前服务人员ID
  95. // 查询参数
  96. const queryParams = reactive({
  97. pageNo: 1,
  98. pageSize: 20,
  99. elderName: '',
  100. relationStatus: '',
  101. areaCode: [],
  102. currentLiveAddress: ''
  103. })
  104. const queryFormRef = ref()
  105. const areaTree = ref<any[]>([]) // 地区树数据
  106. /** 加载地区树 */
  107. const loadAreaTree = async () => {
  108. try {
  109. areaTree.value = await AreaApi.getAreaTree()
  110. //areaTree.value = handleTree(data)
  111. } catch (error) {
  112. console.error('加载地区树失败:', error)
  113. }
  114. }
  115. /** 打开弹窗 */
  116. const open = async (id: number) => {
  117. servicePersonId.value = id
  118. dialogVisible.value = true
  119. await loadAreaTree()
  120. await getList()
  121. }
  122. defineExpose({ open })
  123. /** 查询长者列表 */
  124. const getList = async () => {
  125. loading.value = true
  126. try {
  127. const params = {
  128. ...queryParams,
  129. servicePersonId: servicePersonId.value
  130. }
  131. const data = await ElderApi.getHomeElderlyList(params)
  132. list.value = data.list || []
  133. total.value = data.total || 0
  134. } finally {
  135. loading.value = false
  136. }
  137. }
  138. /** 搜索 */
  139. const handleQuery = () => {
  140. queryParams.pageNo = 1
  141. getList()
  142. }
  143. /** 重置 */
  144. const resetQuery = () => {
  145. queryFormRef.value?.resetFields()
  146. queryParams.pageNo = 1
  147. getList()
  148. }
  149. /** 多选 */
  150. const handleSelectionChange = (selection: any[]) => {
  151. selectedIds.value = selection.map((item) => item.id)
  152. }
  153. /** 单个关联 */
  154. const handleRelate = async (row: any) => {
  155. try {
  156. await ElderApi.relateElder({
  157. servicePersonId: servicePersonId.value,
  158. elderId: row.id
  159. })
  160. message.success('关联成功')
  161. getList()
  162. } catch (error) {
  163. console.error('关联失败:', error)
  164. }
  165. }
  166. /** 批量关联 */
  167. const handleBatchRelate = async () => {
  168. if (selectedIds.value.length === 0) {
  169. message.warning('请选择要关联的长者')
  170. return
  171. }
  172. try {
  173. await ElderApi.batchRelateElder({
  174. servicePersonId: servicePersonId.value,
  175. elderIds: selectedIds.value
  176. })
  177. message.success('批量关联成功')
  178. getList()
  179. } catch (error) {
  180. console.error('批量关联失败:', error)
  181. }
  182. }
  183. </script>