Kaynağa Gözat

护理计划,护理日志,特殊照护计划,特殊照护日志接口对接

xiongxing 3 hafta önce
ebeveyn
işleme
aee3cab0dd

+ 2 - 2
src/api/elderly/nursing/index.ts

@@ -312,8 +312,8 @@ export const getNursingLogPage = (data) => {
   })
 }
 
-// 护理日志详情
-export const getNursingLogDetail = (params) => {
+// 护理日志详情:业务 data 为 { header, records: { list, total } }(axios 已解包外层 data)
+export const getNursingLogDetail = (params: Recordable) => {
   return request.get({
     url: `elderly-nursing-log/detail`,
     params

+ 1 - 1
src/api/elderly/nursing/special-nursing-log/index.ts

@@ -29,7 +29,7 @@ export const getSpecialNursingLogPage = (params: Recordable) => {
  */
 export const getSpecialNursingLogListByElderAndFinishTime = (params: {
   elderId: number | string
-  finishTime: string[]
+  finishTime: [string, string]
   tenantId?: number
 }) => {
   return request.get<ElderlySpecialNursingLogRespVO[]>({

+ 2 - 2
src/api/elderly/nursing/special-plan/index.ts

@@ -96,9 +96,9 @@ export const getSpecialNursingPlan = (id: number | string) => {
 }
 
 /** 更新特殊护理计划明细(如撤销完成状态:status 传 0) */
-export const updateSpecialPlanItem = (data: { id: number; status?: number }) => {
+export const updateSpecialPlanItem = (data: { id: number; specialItemId: number; status?: number }) => {
   return request.put({
-    url: 'nursing/special-plan-item/update',
+    url: '/nursing/special-nursing-log/cancel',
     data
   })
 }

+ 0 - 10
src/views/elderly/nursing/column.ts

@@ -159,16 +159,6 @@ export const SpecialNursingLogColumns = reactive([
   {
     label: '护理等级',
     field: 'nurseLevelName'
-  },
-  {
-    label: '完成时间',
-    field: 'finishTime',
-    type: '9',
-    width: 170
-  },
-  {
-    label: '备注',
-    field: 'remark'
   }
 ])
 

Dosya farkı çok büyük olduğundan ihmal edildi
+ 794 - 87
src/views/elderly/nursing/nursing-log-list/Detail.vue


+ 3 - 22
src/views/elderly/nursing/nursing-log-list/index.vue

@@ -15,16 +15,6 @@
       <el-form-item label="长者名称" prop="elderName">
         <TgInput @keyup.enter="handleQuery" v-model="queryParams.elderName" class="!w-240px" />
       </el-form-item>
-      <el-form-item label="护理日期" prop="nurseDate">
-        <el-date-picker
-          end-placeholder="结束日期"
-          start-placeholder="开始日期"
-          type="daterange"
-          value-format="YYYY-MM-DD"
-          range-separator="至"
-          v-model="queryParams.nurseDate"
-        />
-      </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>
@@ -61,19 +51,11 @@ import { useUserStore } from '@/store/modules/user'
 const userStore = useUserStore()
 
 defineOptions({ name: 'NursingLog' })
-const getDefaultMonthRange = () => {
-  const now = new Date()
-  const start = new Date(now.getFullYear(), now.getMonth(), 1)
-  const end = new Date(now.getFullYear(), now.getMonth() + 1, 0)
-  const format = (date: Date) => date.toISOString().slice(0, 10)
-  return [format(start), format(end)]
-}
 const queryParams = reactive({
   pageNo: 1,
   pageSize: 10,
   elderName: '',
-  tenantIds: userStore.orgTenantId,
-  nurseDate: getDefaultMonthRange()
+  tenantIds: userStore.orgTenantId
 })
 const loading = ref(true) // 列表的加载中
 const total = ref(0) // 列表的总页数
@@ -89,7 +71,6 @@ const handleQuery = () => {
 /** 重置按钮操作 */
 const resetQuery = () => {
   queryFormRef.value.resetFields()
-  queryParams.nurseDate = getDefaultMonthRange()
   handleQuery()
 }
 
@@ -106,8 +87,8 @@ const getList = async () => {
 }
 
 const detailRef = ref()
-const openDetail = (row:{}) => {
-  detailRef.value.open(row,queryParams.nurseDate)
+const openDetail = (row: Record<string, unknown>) => {
+  detailRef.value.open(row)
 }
 
 onMounted(()=>{

+ 102 - 42
src/views/elderly/nursing/special-nurse-log/Detail.vue

@@ -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;

Bu fark içinde çok fazla dosya değişikliği olduğu için bazı dosyalar gösterilmiyor