index.vue 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417
  1. <template>
  2. <ContentWrap>
  3. <!-- 跌倒风险评估表 -->
  4. <el-form
  5. class="-mb-15px"
  6. :model="queryParams"
  7. ref="queryFormRef"
  8. :inline="true"
  9. label-width="110px"
  10. >
  11. <TenantSelect v-model="queryParams.tenantIds" placeholder="请选择机构名称" prop="tenantIds" />
  12. <el-form-item label="长者姓名">
  13. <el-input
  14. v-model="queryParams.elderName"
  15. placeholder="长者姓名"
  16. class="!w-240px"
  17. clearable
  18. />
  19. </el-form-item>
  20. <el-form-item label="风险等级">
  21. <el-select v-model="queryParams.risk" class="!w-240px">
  22. <el-option
  23. v-for="(item, index) in [
  24. { label: '无风险', value: 'none' },
  25. { label: '低风险', value: 'low' },
  26. { label: '中风险', value: 'medium' },
  27. { label: '高风险', value: 'high' }
  28. ]"
  29. :key="index"
  30. placeholder="请选择"
  31. :label="item.label"
  32. :value="item.value"
  33. />
  34. </el-select>
  35. </el-form-item>
  36. <el-form-item label="评估人">
  37. <el-input v-model="queryParams.assessor" placeholder="评估人" class="!w-240px" clearable />
  38. </el-form-item>
  39. <el-form-item label="记录日期">
  40. <el-date-picker
  41. size="default"
  42. ref="selectRef"
  43. class="!w-240px"
  44. v-model="queryParams.assessDate"
  45. type="daterange"
  46. :clearable="true"
  47. :editable="false"
  48. placeholder="选择记录日期"
  49. value-format="YYYY-MM-DD"
  50. format="YYYY-MM-DD"
  51. date-format="YYYY-MM-DD"
  52. />
  53. </el-form-item>
  54. <el-form-item>
  55. <el-button @click="handleQuery" style="margin-left: 2vw"
  56. ><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button
  57. >
  58. <el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
  59. </el-form-item>
  60. </el-form>
  61. </ContentWrap>
  62. <!-- 列表 -->
  63. <ContentWrap>
  64. <div class="mb-10px">
  65. <ButtonAdd @click="openForm(undefined)" />
  66. <ButtonImport @click="handleImportCard" />
  67. </div>
  68. <el-table v-loading="loading" :data="list" :header-cell-style="tableHeaderColor">
  69. <el-table-column header-align="center" align="center" label="序号" width="60">
  70. <template #default="scope">
  71. {{
  72. scope.$index + (queryParams.pageNo * queryParams.pageSize - queryParams.pageSize) + 1
  73. }}
  74. </template>
  75. </el-table-column>
  76. <el-table-column
  77. label="机构名称"
  78. v-if="userStore.getUser.id == 1"
  79. type="index"
  80. width="150"
  81. align="center"
  82. >
  83. <template #default="{ row }">
  84. {{ findLabelById(userStore.getOrgTenant.options, row.tenantId) }}
  85. </template>
  86. </el-table-column>
  87. <el-table-column
  88. prop="elderName"
  89. header-align="center"
  90. align="center"
  91. label="长者姓名"
  92. min-width="150"
  93. show-overflow-tooltip
  94. />
  95. <el-table-column
  96. prop="bedName"
  97. header-align="center"
  98. align="center"
  99. label="床位号"
  100. min-width="150"
  101. show-overflow-tooltip
  102. />
  103. <el-table-column
  104. prop="assessor"
  105. header-align="center"
  106. align="center"
  107. label="评估人"
  108. min-width="150"
  109. show-overflow-tooltip
  110. />
  111. <el-table-column
  112. prop="assessDate"
  113. header-align="center"
  114. align="center"
  115. label="记录日期"
  116. min-width="150"
  117. show-overflow-tooltip
  118. />
  119. <el-table-column
  120. prop="assessScore"
  121. header-align="center"
  122. align="center"
  123. label="评估总得分"
  124. min-width="120"
  125. show-overflow-tooltip
  126. />
  127. <el-table-column
  128. prop="riskLevel"
  129. header-align="center"
  130. align="center"
  131. label="风险等级"
  132. min-width="120"
  133. show-overflow-tooltip
  134. >
  135. <template #default="scope">
  136. <el-tag :type="getRiskLevelType(scope.row.riskLevel)">
  137. {{ getRiskLevelText(scope.row.riskLevel) }}
  138. </el-tag>
  139. </template>
  140. </el-table-column>
  141. <el-table-column
  142. prop="creator"
  143. header-align="center"
  144. align="center"
  145. label="记录人"
  146. min-width="150"
  147. show-overflow-tooltip
  148. />
  149. <el-table-column label="操作" align="center" width="200">
  150. <template #default="scope">
  151. <el-button link type="primary" @click="openFormEdit(scope.row, scope.row.id)">
  152. 编辑
  153. </el-button>
  154. <el-button link type="warning" @click="openFormDetail(scope.row, scope.row.id)">
  155. 详情
  156. </el-button>
  157. <el-button link type="danger" @click="openClose(scope.row)"> 删除 </el-button>
  158. </template>
  159. </el-table-column>
  160. </el-table>
  161. <!-- 分页 -->
  162. <Pagination
  163. :total="total"
  164. v-model:page="queryParams.pageNo"
  165. v-model:limit="queryParams.pageSize"
  166. @pagination="getList"
  167. />
  168. </ContentWrap>
  169. <AddForm ref="formRef" @success="getList" />
  170. </template>
  171. <script setup lang="ts">
  172. import AddForm from './AddForm.vue'
  173. import ButtonAdd from '@/components/ButtonAdd/src/ButtonAdd.vue'
  174. import ButtonImport from '@/components/ButtonImport/src/ButtonImport.vue'
  175. import { useUserStore } from '@/store/modules/user'
  176. import { getCurrentMonthRange } from '@/utils/dateUtil'
  177. import { fallDownDelete, fallDownPage } from '@/api/social-work'
  178. import { exportWithExpandedObjectArrays } from '@/utils/excel-export'
  179. import { findLabelById } from '@/utils/dict'
  180. const message = useMessage()
  181. const { t } = useI18n()
  182. const userStore = useUserStore()
  183. const loading = ref(true)
  184. const total = ref(0)
  185. const list = ref([])
  186. const exportLoading = ref(false)
  187. let queryParams = reactive({
  188. pageNo: 1,
  189. pageSize: 10,
  190. elderName: '',
  191. assessor: '',
  192. risk: '',
  193. // assessDate: getCurrentMonthRange(),
  194. assessDate: [],
  195. tenantIds: userStore.orgTenantId
  196. })
  197. const queryFormRef = ref()
  198. // 打开导出弹窗
  199. const handleImportCard = async () => {
  200. exportLoading.value = true
  201. try {
  202. const queryP = {
  203. pageNo: 1,
  204. pageSize: 9999,
  205. elderName: queryParams.elderName,
  206. risk: queryParams.risk,
  207. assessor: queryParams.assessor,
  208. assessDate: queryParams.assessDate,
  209. tenantIds: queryParams.tenantIds
  210. }
  211. const data = await fallDownPage(queryP)
  212. const exportData = data.list || []
  213. if (exportData.length === 0) {
  214. message.warning('暂无数据可导出')
  215. return
  216. }
  217. const processedData = exportData.map((item) => {
  218. const row: any = {
  219. orgName: findLabelById(userStore.getOrgTenant.options, item.tenantId) || '',
  220. elderName: item.elderName || '',
  221. assessor: item.assessor || '',
  222. assessDate: item.assessDate || '',
  223. assessScore: item.assessScore ?? '',
  224. creator: item.creator || ''
  225. }
  226. row.riskLevelText = getRiskLevelText(item.riskLevel) || '-'
  227. return row
  228. })
  229. const headers = [
  230. {
  231. key: 'orgName',
  232. title: '机构名称'
  233. },
  234. {
  235. key: 'elderName',
  236. title: '长者姓名'
  237. },
  238. {
  239. key: 'assessor',
  240. title: '评估人'
  241. },
  242. {
  243. key: 'assessDate',
  244. title: '记录日期'
  245. },
  246. {
  247. key: 'assessScore',
  248. title: '评估总得分'
  249. },
  250. {
  251. key: 'riskLevelText',
  252. title: '风险等级'
  253. },
  254. {
  255. key: 'creator',
  256. title: '记录人'
  257. }
  258. ]
  259. await exportWithExpandedObjectArrays(
  260. processedData,
  261. headers,
  262. `跌倒风险评估_${new Date().getTime()}.xlsx`,
  263. '跌倒风险评估'
  264. )
  265. message.success('导出成功')
  266. } catch (error) {
  267. console.error('导出失败:', error)
  268. message.error('导出失败,请重试')
  269. } finally {
  270. exportLoading.value = false
  271. }
  272. }
  273. /** 查询列表 */
  274. const getList = async () => {
  275. loading.value = true
  276. try {
  277. const data = await fallDownPage(queryParams)
  278. list.value = data.list
  279. total.value = data.total
  280. } finally {
  281. loading.value = false
  282. }
  283. }
  284. /** 搜索按钮操作 */
  285. const handleQuery = async () => {
  286. if (!queryFormRef.value) return
  287. const valid = await queryFormRef.value.validate()
  288. if (!valid) return
  289. queryParams.pageNo = 1
  290. await getList()
  291. }
  292. /** 重置按钮操作 */
  293. const resetQuery = () => {
  294. queryParams.elderName = ''
  295. queryParams.assessor = ''
  296. queryParams.risk = ''
  297. queryParams.tenantIds = userStore.orgTenantId
  298. // queryParams.assessDate = getCurrentMonthRange()
  299. queryParams.assessDate = []
  300. queryFormRef.value.resetFields()
  301. handleQuery()
  302. }
  303. /** 添加/修改操作 */
  304. const formRef = ref()
  305. const openForm = (id?: number) => {
  306. if (queryParams.tenantIds.length == 0 || queryParams.tenantIds.length > 1) {
  307. message.error('新增只能选择一个机构')
  308. return
  309. }
  310. formRef.value.open(queryParams.tenantIds[0], id, false)
  311. }
  312. const openFormEdit = (row: any = {}, id?: number) => {
  313. formRef.value.open(row.tenantId, id, false)
  314. }
  315. const openFormDetail = (row: any = {}, id?: number) => {
  316. formRef.value.open(row.tenantId, id, true)
  317. }
  318. const openClose = async (item: any) => {
  319. try {
  320. const res = await message.confirm('确定要删除吗?', '提示')
  321. if (res == 'confirm') {
  322. try {
  323. const res = await fallDownDelete(item.id)
  324. if (res) {
  325. message.success(t('common.updateSuccess'))
  326. await getList()
  327. }
  328. } catch (err) {}
  329. }
  330. } catch {}
  331. }
  332. /** 取消按钮操作 */
  333. const cancelDelete = async (id: number) => {
  334. try {
  335. await message.cancelConfirm()
  336. message.success(t('common.delSuccess'))
  337. await getList()
  338. } catch {}
  339. }
  340. const route = useRoute()
  341. /** 初始化 **/
  342. onMounted(() => {
  343. if (route.query && route.query.elderName) {
  344. queryParams.elderName = route.query.elderName as string
  345. }
  346. getList()
  347. })
  348. // 表头格式
  349. const tableHeaderColor = ({ rowIndex }: any) => {
  350. if (rowIndex === 0) {
  351. return {
  352. backgroundColor: '#f8f8f9',
  353. color: '#666666',
  354. fontWeight: 'bold'
  355. }
  356. }
  357. }
  358. // 获取风险等级类型
  359. const getRiskLevelType = (riskLevel: string) => {
  360. switch (riskLevel) {
  361. case 'none':
  362. return 'success'
  363. case 'low':
  364. return 'info'
  365. case 'medium':
  366. return 'warning'
  367. case 'high':
  368. return 'danger'
  369. default:
  370. return ''
  371. }
  372. }
  373. // 获取风险等级文本
  374. const getRiskLevelText = (riskLevel: string) => {
  375. switch (riskLevel) {
  376. case 'none':
  377. return '无风险'
  378. case 'low':
  379. return '低风险'
  380. case 'medium':
  381. return '中风险'
  382. case 'high':
  383. return '高风险'
  384. default:
  385. return '-'
  386. }
  387. }
  388. </script>
  389. <style scoped lang="scss"></style>