|
|
@@ -11,28 +11,69 @@
|
|
|
<div class="info-title">长者信息</div>
|
|
|
<div class="info-wrap">
|
|
|
<el-row :gutter="20">
|
|
|
- <el-col :span="8" :xs="24" class="header-item">长者名称:{{ header.elderName || '-' }}</el-col>
|
|
|
- <el-col :span="8" :xs="24" class="header-item">护理等级:{{ header.nurseLevelName || '-' }}</el-col>
|
|
|
- <el-col :span="8" :xs="24" class="header-item">床位号:{{ header.bedName || '-' }}</el-col>
|
|
|
+ <el-col :span="8" :xs="24" class="header-item"
|
|
|
+ >长者名称:{{ header.elderName || '-' }}</el-col
|
|
|
+ >
|
|
|
+ <el-col :span="8" :xs="24" class="header-item"
|
|
|
+ >护理等级:{{ header.nurseLevelName || '-' }}</el-col
|
|
|
+ >
|
|
|
+ <el-col :span="8" :xs="24" class="header-item"
|
|
|
+ >床位号:{{ header.bedName || '-' }}</el-col
|
|
|
+ >
|
|
|
</el-row>
|
|
|
</div>
|
|
|
- <div class="detail-toolbar mb-15px flex flex-wrap items-center gap-12px">
|
|
|
- <span class="text-sm text-secondary">完成时间范围</span>
|
|
|
- <el-date-picker
|
|
|
- v-model="finishTimeRange"
|
|
|
- type="daterange"
|
|
|
- range-separator="至"
|
|
|
- start-placeholder="开始日期"
|
|
|
- end-placeholder="结束日期"
|
|
|
- value-format="YYYY-MM-DD"
|
|
|
- />
|
|
|
- <el-button type="primary" :loading="detailLoading" @click="reloadDetail">查询</el-button>
|
|
|
- </div>
|
|
|
+ <el-form :model="queryForm" class="detail-query-form mb-15px" label-width="100px">
|
|
|
+ <el-row :gutter="12" align="middle">
|
|
|
+ <el-col :xs="24" :sm="16" :md="10" :lg="8">
|
|
|
+ <el-form-item label="完成时间范围" prop="finishTime">
|
|
|
+ <el-date-picker
|
|
|
+ v-model="queryForm.finishTime"
|
|
|
+ type="daterange"
|
|
|
+ range-separator="至"
|
|
|
+ start-placeholder="开始日期"
|
|
|
+ end-placeholder="结束日期"
|
|
|
+ value-format="YYYY-MM-DD"
|
|
|
+ class="finish-time-range-picker"
|
|
|
+ />
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :xs="24" :sm="8" :md="6" :lg="4">
|
|
|
+ <el-form-item label-width="0">
|
|
|
+ <el-button type="primary" :loading="detailLoading" @click="reloadDetail"
|
|
|
+ >查询</el-button
|
|
|
+ >
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ </el-row>
|
|
|
+ </el-form>
|
|
|
|
|
|
- <el-table v-loading="detailLoading" :data="pagedList" height="55vh" :header-cell-style="(d) => tableHeaderColor(d) || {}">
|
|
|
- <el-table-column label="完成时间" prop="finishTime" min-width="160" show-overflow-tooltip />
|
|
|
- <el-table-column label="备注" prop="remark" min-width="140" show-overflow-tooltip />
|
|
|
- <el-table-column label="图片" min-width="200">
|
|
|
+ <el-table
|
|
|
+ v-loading="detailLoading"
|
|
|
+ :data="pagedList"
|
|
|
+ height="55vh"
|
|
|
+ :header-cell-style="(d) => tableHeaderColor(d) || {}"
|
|
|
+ >
|
|
|
+ <el-table-column
|
|
|
+ label="项目名称"
|
|
|
+ prop="specialPlanItemName"
|
|
|
+ min-width="180"
|
|
|
+ show-overflow-tooltip
|
|
|
+ />
|
|
|
+ <el-table-column
|
|
|
+ label="完成时间"
|
|
|
+ prop="finishTime"
|
|
|
+ min-width="180"
|
|
|
+ :formatter="dateFormatter"
|
|
|
+ show-overflow-tooltip
|
|
|
+ />
|
|
|
+ <el-table-column label="项目状态" prop="status" min-width="180"
|
|
|
+ ><template #default="scope">
|
|
|
+ <el-tag v-if="scope.row.status == 0" type="success">已完成</el-tag>
|
|
|
+ <el-tag v-if="scope.row.status == 1" type="danger">已撤销</el-tag>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="备注" prop="remark" min-width="300" show-overflow-tooltip />
|
|
|
+ <el-table-column label="图片" min-width="300">
|
|
|
<template #default="scope">
|
|
|
<div v-if="splitImages(scope.row.imageUrl).length" class="image-list">
|
|
|
<el-image
|
|
|
@@ -53,10 +94,10 @@
|
|
|
<template #default="scope">
|
|
|
<el-button
|
|
|
v-hasPermi="['special-nurse-log:revocation']"
|
|
|
+ v-if="scope.row.status == 0"
|
|
|
link
|
|
|
type="danger"
|
|
|
- :disabled="planItemId(scope.row) == null"
|
|
|
- :loading="revokeLoadingId === planItemId(scope.row)"
|
|
|
+ :loading="revokeLoadingId == scope.row.id"
|
|
|
@click="handleRevoke(scope.row)"
|
|
|
>
|
|
|
撤销
|
|
|
@@ -87,6 +128,7 @@ import type { ElderlySpecialNursingLogRespVO } from '@/api/elderly/nursing/speci
|
|
|
import { updateSpecialPlanItem } from '@/api/elderly/nursing/special-plan'
|
|
|
import { getTenantId } from '@/utils/auth'
|
|
|
import { tableHeaderColor } from '@/utils/table'
|
|
|
+import { dateFormatter } from '@/utils/formatTime'
|
|
|
|
|
|
defineOptions({ name: 'SpecialNursingLogDetail' })
|
|
|
|
|
|
@@ -105,7 +147,11 @@ const header = reactive({
|
|
|
})
|
|
|
|
|
|
const records = ref<ElderlySpecialNursingLogRespVO[]>([])
|
|
|
-const finishTimeRange = ref<string[]>([])
|
|
|
+
|
|
|
+const queryForm = reactive({
|
|
|
+ /** 完成时间范围,与接口 finishTime 一致,YYYY-MM-DD */
|
|
|
+ finishTime: [] as string[]
|
|
|
+})
|
|
|
|
|
|
/** 详情内分页(接口为整列表,前端分页) */
|
|
|
const detailPageNo = ref(1)
|
|
|
@@ -121,10 +167,6 @@ const defaultMonthRange = () => {
|
|
|
|
|
|
let currentElderId: number | string | undefined
|
|
|
|
|
|
-/** 撤销时更新计划明细,后端主键为特殊护理计划明细 id */
|
|
|
-const planItemId = (row: ElderlySpecialNursingLogRespVO) =>
|
|
|
- row.specialPlanItemId != null ? Number(row.specialPlanItemId) : null
|
|
|
-
|
|
|
const splitImages = (raw?: string) => {
|
|
|
if (!raw) return []
|
|
|
return String(raw)
|
|
|
@@ -145,16 +187,23 @@ watch(
|
|
|
}
|
|
|
)
|
|
|
|
|
|
+const resolveElderId = (row: Recordable) => {
|
|
|
+ const v = row.elderId ?? row.elder_id ?? row.id
|
|
|
+ if (v === '' || v === undefined || v === null) return undefined
|
|
|
+ return v
|
|
|
+}
|
|
|
+
|
|
|
const reloadDetail = async () => {
|
|
|
- if (currentElderId == null) return
|
|
|
- if (!finishTimeRange.value?.length || finishTimeRange.value.length < 2) {
|
|
|
- finishTimeRange.value = defaultMonthRange()
|
|
|
+ if (currentElderId == null || currentElderId === '') return
|
|
|
+ if (!queryForm.finishTime?.length || queryForm.finishTime.length < 2) {
|
|
|
+ queryForm.finishTime = defaultMonthRange()
|
|
|
}
|
|
|
detailLoading.value = true
|
|
|
try {
|
|
|
+ const range = queryForm.finishTime
|
|
|
const data = await getSpecialNursingLogListByElderAndFinishTime({
|
|
|
elderId: currentElderId,
|
|
|
- finishTime: [finishTimeRange.value[0], finishTimeRange.value[1]],
|
|
|
+ finishTime: [range[0], range[1]],
|
|
|
tenantId: Number(getTenantId())
|
|
|
})
|
|
|
records.value = Array.isArray(data) ? data : []
|
|
|
@@ -164,16 +213,15 @@ const reloadDetail = async () => {
|
|
|
}
|
|
|
|
|
|
const handleRevoke = async (row: ElderlySpecialNursingLogRespVO) => {
|
|
|
- const id = planItemId(row)
|
|
|
- if (id == null) {
|
|
|
- message.warning('缺少明细主键,无法撤销')
|
|
|
- return
|
|
|
- }
|
|
|
try {
|
|
|
await message.delConfirm('确认撤销该条完成记录?将恢复为未完成状态。')
|
|
|
- revokeLoadingId.value = id
|
|
|
- await updateSpecialPlanItem({ id, status: 0 })
|
|
|
- message.success(t('common.operationSuccess'))
|
|
|
+ revokeLoadingId.value = row.id ?? 0
|
|
|
+ await updateSpecialPlanItem({
|
|
|
+ id: row.id ?? 0,
|
|
|
+ specialItemId: row.specialPlanItemId ?? 0,
|
|
|
+ status: 0
|
|
|
+ })
|
|
|
+ message.success(t('common.updateSuccess'))
|
|
|
emit('refresh')
|
|
|
await reloadDetail()
|
|
|
} catch {
|
|
|
@@ -184,11 +232,16 @@ const handleRevoke = async (row: ElderlySpecialNursingLogRespVO) => {
|
|
|
}
|
|
|
|
|
|
const open = async (row: Recordable) => {
|
|
|
- currentElderId = row.elderId
|
|
|
+ const eid = resolveElderId(row)
|
|
|
+ if (eid == null) {
|
|
|
+ message.warning('当前行缺少长者信息,无法加载详情')
|
|
|
+ return
|
|
|
+ }
|
|
|
+ currentElderId = eid
|
|
|
header.elderName = row.elderName ?? ''
|
|
|
header.bedName = row.bedName ?? ''
|
|
|
header.nurseLevelName = row.nurseLevelName ?? ''
|
|
|
- finishTimeRange.value = defaultMonthRange()
|
|
|
+ queryForm.finishTime = defaultMonthRange()
|
|
|
dialogVisible.value = true
|
|
|
await reloadDetail()
|
|
|
}
|
|
|
@@ -212,14 +265,21 @@ const handleClosed = () => {
|
|
|
margin: 10px 0 6px;
|
|
|
}
|
|
|
.info-wrap {
|
|
|
+ padding: 0 20px;
|
|
|
margin-bottom: 10px;
|
|
|
}
|
|
|
.header-item {
|
|
|
color: #606266;
|
|
|
padding-bottom: 10px;
|
|
|
}
|
|
|
- .detail-toolbar .text-secondary {
|
|
|
- color: var(--el-text-color-secondary);
|
|
|
+ .detail-query-form {
|
|
|
+ :deep(.el-form-item) {
|
|
|
+ margin-bottom: 0;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ .finish-time-range-picker {
|
|
|
+ width: 100%;
|
|
|
+ max-width: 240px;
|
|
|
}
|
|
|
.image-list {
|
|
|
display: flex;
|