|
|
@@ -0,0 +1,169 @@
|
|
|
+<template>
|
|
|
+ <!-- 搜索 -->
|
|
|
+ <ContentWrap>
|
|
|
+ <!-- 搜索工作栏 -->
|
|
|
+ <el-form
|
|
|
+ class="-mb-15px"
|
|
|
+ :model="queryParams"
|
|
|
+ ref="queryFormRef"
|
|
|
+ :inline="true"
|
|
|
+ label-width="80px"
|
|
|
+ >
|
|
|
+ <el-form-item prop="tenantIds">
|
|
|
+ <TenantSelect
|
|
|
+ v-model="queryParams.tenantIds"
|
|
|
+ placeholder="请选择机构名称"
|
|
|
+ prop="tenantIds"
|
|
|
+ />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="长者名称" prop="elderName">
|
|
|
+ <TgInput @keyup.enter="handleQuery" v-model="queryParams.elderName" class="!w-160px" />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="角色" prop="role">
|
|
|
+ <el-select v-model="queryParams.role" placeholder="请选择角色" clearable class="!w-160px">
|
|
|
+ <el-option
|
|
|
+ v-for="opt in roleSubmitOptions"
|
|
|
+ :key="opt.enumKey"
|
|
|
+ :label="opt.label"
|
|
|
+ :value="opt.enumKey"
|
|
|
+ />
|
|
|
+ </el-select>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="巡房时间" prop="roundTime">
|
|
|
+ <el-date-picker
|
|
|
+ v-model="queryParams.roundTime"
|
|
|
+ type="daterange"
|
|
|
+ range-separator="至"
|
|
|
+ start-placeholder="开始日期"
|
|
|
+ end-placeholder="结束日期"
|
|
|
+ value-format="YYYY-MM-DD"
|
|
|
+ class="!w-280px"
|
|
|
+ />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item>
|
|
|
+ <el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
|
|
|
+ <el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
|
|
|
+ </el-form-item>
|
|
|
+ </el-form>
|
|
|
+ </ContentWrap>
|
|
|
+ <ContentWrap>
|
|
|
+ <Table2
|
|
|
+ v-loading="loading"
|
|
|
+ :list="list"
|
|
|
+ :columns="ElderlyItemsRoundLogColumns"
|
|
|
+ :queryParams="queryParams"
|
|
|
+ >
|
|
|
+ <template #pre="{ scope }">
|
|
|
+ <el-button link type="primary" @click="openDetail(scope)">查看</el-button>
|
|
|
+ </template>
|
|
|
+ </Table2>
|
|
|
+ <!-- 分页 -->
|
|
|
+ <Pagination
|
|
|
+ :total="total"
|
|
|
+ v-model:page="queryParams.pageNo"
|
|
|
+ v-model:limit="queryParams.pageSize"
|
|
|
+ @pagination="getList"
|
|
|
+ />
|
|
|
+
|
|
|
+ <Detail ref="detailRef" />
|
|
|
+ </ContentWrap>
|
|
|
+</template>
|
|
|
+<script setup lang="ts">
|
|
|
+import { getElderlyItemsRoundPage } from '@/api/elderly/nursing'
|
|
|
+import Detail from './Detail.vue'
|
|
|
+import { ElderlyItemsRoundLogColumns } from '../column'
|
|
|
+import { useUserStore } from '@/store/modules/user'
|
|
|
+import { ROLE_SUBMIT_LABEL, getRoleSubmitLabel } from './roleSubmitLabel'
|
|
|
+
|
|
|
+const userStore = useUserStore()
|
|
|
+
|
|
|
+const roleSubmitOptions = Object.entries(ROLE_SUBMIT_LABEL).map(([enumKey, label]) => ({
|
|
|
+ enumKey,
|
|
|
+ label
|
|
|
+}))
|
|
|
+
|
|
|
+defineOptions({ name: 'RoomInspectionProjectLog' })
|
|
|
+
|
|
|
+/** 默认巡房时间:当前自然月 [月初, 月末] */
|
|
|
+function createDefaultRoundTimeRange(): string[] {
|
|
|
+ const now = new Date()
|
|
|
+ const start = new Date(now.getFullYear(), now.getMonth(), 1)
|
|
|
+ const end = new Date(now.getFullYear(), now.getMonth() + 1, 0)
|
|
|
+ const pad = (n: number) => String(n).padStart(2, '0')
|
|
|
+ const fmt = (d: Date) => `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}`
|
|
|
+ return [fmt(start), fmt(end)]
|
|
|
+}
|
|
|
+
|
|
|
+const queryParams = reactive({
|
|
|
+ pageNo: 1,
|
|
|
+ pageSize: 10,
|
|
|
+ elderName: '',
|
|
|
+ role: '',
|
|
|
+ roundTime: createDefaultRoundTimeRange(),
|
|
|
+ tenantIds: userStore.orgTenantId
|
|
|
+})
|
|
|
+
|
|
|
+const loading = ref(true)
|
|
|
+const total = ref(0)
|
|
|
+const list = ref<Recordable[]>([])
|
|
|
+const queryFormRef = ref()
|
|
|
+
|
|
|
+const handleQuery = () => {
|
|
|
+ queryParams.pageNo = 1
|
|
|
+ getList()
|
|
|
+}
|
|
|
+
|
|
|
+const resetQuery = () => {
|
|
|
+ queryFormRef.value?.resetFields()
|
|
|
+ queryParams.roundTime = createDefaultRoundTimeRange()
|
|
|
+ handleQuery()
|
|
|
+}
|
|
|
+
|
|
|
+const buildPageParams = () => {
|
|
|
+ const p = { ...queryParams } as Recordable
|
|
|
+ if (!Array.isArray(p.roundTime) || p.roundTime.length < 2) {
|
|
|
+ delete p.roundTime
|
|
|
+ }
|
|
|
+ if (p.role === '' || p.role == null) {
|
|
|
+ delete p.role
|
|
|
+ }
|
|
|
+ return p
|
|
|
+}
|
|
|
+
|
|
|
+/** 巡视项目组:按中英文逗号拆分;若为数组则对每一项再拆分后合并(兼容 ["a,b","c"]) */
|
|
|
+function splitItemsDelimited(raw: unknown): string[] {
|
|
|
+ if (raw == null || raw === '') return []
|
|
|
+ if (Array.isArray(raw)) {
|
|
|
+ return raw.flatMap((x) => splitItemsDelimited(String(x)))
|
|
|
+ }
|
|
|
+ return String(raw)
|
|
|
+ .split(/[,,]+/)
|
|
|
+ .map((s) => s.trim())
|
|
|
+ .filter(Boolean)
|
|
|
+}
|
|
|
+
|
|
|
+const getList = async () => {
|
|
|
+ loading.value = true
|
|
|
+ try {
|
|
|
+ const data = await getElderlyItemsRoundPage(buildPageParams())
|
|
|
+ const raw = data.list ?? []
|
|
|
+ list.value = raw.map((r: Recordable) => ({
|
|
|
+ ...r,
|
|
|
+ itemsLabel: splitItemsDelimited(r.items).join('、'),
|
|
|
+ roleLabel: getRoleSubmitLabel(r.role)
|
|
|
+ }))
|
|
|
+ total.value = data.total ?? 0
|
|
|
+ } finally {
|
|
|
+ loading.value = false
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+const detailRef = ref<{ open: (row: Recordable) => void }>()
|
|
|
+const openDetail = (row: Recordable) => {
|
|
|
+ detailRef.value?.open(row)
|
|
|
+}
|
|
|
+
|
|
|
+onMounted(() => {
|
|
|
+ getList()
|
|
|
+})
|
|
|
+</script>
|