Преглед изворни кода

护理模块只保留生活护理计划以及护理日志(修改流程,护理日志使用新接口)

xiongxing пре 3 месеци
родитељ
комит
6bc1d3bd6e

+ 16 - 1
src/api/elderly/nursing/index.ts

@@ -307,11 +307,26 @@ export const delNurseGroup = (id) => {
 // 获取护理日志分页
 // 获取护理日志分页
 export const getNursingLogPage = (data) => {
 export const getNursingLogPage = (data) => {
   return request.get({
   return request.get({
-    url: `elderly/nursingLog/page`,
+    url: `elderly-nursing-log/page`,
     params: data
     params: data
   })
   })
 }
 }
 
 
+// 护理日志详情
+export const getNursingLogDetail = (params) => {
+  return request.get({
+    url: `elderly-nursing-log/detail`,
+    params
+  })
+}
+
+// 删除护理日志
+export const deleteNursingLog = (id) => {
+  return request.delete({
+    url: `elderly-nursing-log/delete?id=${id}`
+  })
+}
+
 // 补录护理日志
 // 补录护理日志
 export const supplementNursingLog = (data) => {
 export const supplementNursingLog = (data) => {
   return request.post({
   return request.post({

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

@@ -130,7 +130,7 @@ export const NurseLogColumns = reactive([
   },
   },
   {
   {
     label: '护理日期',
     label: '护理日期',
-    field: 'nursingDate'
+    field: 'nurseDate'
   },
   },
   {
   {
     label: '护理员',
     label: '护理员',
@@ -138,6 +138,14 @@ export const NurseLogColumns = reactive([
   },
   },
   {
   {
     label: '护理等级',
     label: '护理等级',
-    field: 'nursingGrade'
+    field: 'nurseLevelName'
+  },
+  {
+    label: '备注',
+    field: 'remark'
+  },
+  {
+    label: '创建时间',
+    field: 'createTime'
   },
   },
 ])
 ])

+ 26 - 396
src/views/elderly/nursing/life-care-plan/Form.vue

@@ -50,92 +50,16 @@
             </el-form-item>
             </el-form-item>
           </el-col>
           </el-col>
         </el-row>
         </el-row>
-
-<!--        <el-form-item label="饮食类型" prop="dietaryType">-->
-<!--          <TgRadio-->
-<!--            v-model="dataForm.dietaryType"-->
-<!--            @change="(arg) => handleRadioChange(arg, 'dietaryType')"-->
-<!--            :list="getDictOptions(DICT_TYPE.DIETARY_TYPE)"-->
-<!--          >-->
-<!--            <el-radio-->
-<!--              v-for="(item, index) in getStrDictOptions(DICT_TYPE.DIETARY_TYPE)"-->
-<!--              :key="index"-->
-<!--              :label="item.value"-->
-<!--              >{{ item.label }}</el-radio-->
-<!--            >-->
-<!--          </TgRadio>-->
-<!--          <input-->
-<!--            type="text"-->
-<!--            class="sInput"-->
-<!--            v-model="inputs.dietaryTypeInput"-->
-<!--            v-if="!isDetail"-->
-<!--            v-show="dataForm.dietaryType === '0'"-->
-<!--          />-->
-<!--        </el-form-item>-->
-<!--        <el-form-item label="饮食方式" prop="diet">-->
-<!--          <TgRadio-->
-<!--            v-model="dataForm.diet"-->
-<!--            @change="(arg) => handleRadioChange(arg, 'diet')"-->
-<!--            :list="getDictOptions(DICT_TYPE.DIET_TYPE)"-->
-<!--          >-->
-<!--            <el-radio-->
-<!--              v-for="(item, index) in getStrDictOptions(DICT_TYPE.DIET_TYPE)"-->
-<!--              :key="index"-->
-<!--              :label="item.value"-->
-<!--              >{{ item.label }}</el-radio-->
-<!--            >-->
-<!--          </TgRadio>-->
-<!--          <input-->
-<!--            type="text"-->
-<!--            class="sInput"-->
-<!--            v-model="inputs.dietInput"-->
-<!--            v-if="!isDetail"-->
-<!--            v-show="dataForm.diet === '0'"-->
-<!--          />-->
-<!--        </el-form-item>-->
-<!--        <el-form-item label="饮食禁忌" prop="dietaryTaboo">-->
-<!--          <el-checkbox-group-->
-<!--            v-model="dataForm.dietaryTaboo"-->
-<!--            @change="(arg) => handleChange(arg, 'dietaryTaboo')"-->
-<!--            :list="getDictOptions(DICT_TYPE.DIETARY_TABOO_TYPE)"-->
-<!--            v-if="!isDetail"-->
-<!--          >-->
-<!--            <el-checkbox-->
-<!--              v-for="(item, index) in getStrDictOptions(DICT_TYPE.DIETARY_TABOO_TYPE)"-->
-<!--              :label="item.value"-->
-<!--              :key="index"-->
-<!--              >{{ item.label }}</el-checkbox-->
-<!--            >-->
-<!--          </el-checkbox-group>-->
-<!--          <span v-else>{{ formatArr(DICT_TYPE.DIETARY_TABOO_TYPE, dataForm.dietaryTaboo) }}</span>-->
-<!--          <input-->
-<!--            type="text"-->
-<!--            class="sInput"-->
-<!--            v-model="inputs.dietaryTabooInput"-->
-<!--            v-if="!isDetail"-->
-<!--            v-show="dataForm.dietaryTaboo.includes('0')"-->
-<!--          />-->
-<!--        </el-form-item>-->
-<!--        <el-form-item label="风险防范" prop="riskPrevention">-->
-<!--          <TgTextarea v-model="dataForm.riskPrevention" placeholder="风险防范" :row="1" />-->
-<!--        </el-form-item>-->
-<!--        <el-form-item label="照护特点" prop="nursingCharacteristics">-->
-<!--          <TgTextarea v-model="dataForm.nursingCharacteristics" placeholder="照护特点" :row="1" />-->
-<!--        </el-form-item>-->
       </div>
       </div>
       <div class="info">
       <div class="info">
         <div class="info-title">护理项目</div>
         <div class="info-title">护理项目</div>
         <span v-show="dataForm.elderId">
         <span v-show="dataForm.elderId">
-<!--          <el-button type="primary" link class="left" @click="openReport"-->
-<!--            >查看能力评估报告</el-button-->
-<!--          >-->
           <el-button type="primary" class="left" @click="handleAdd" v-if="!isDetail">
           <el-button type="primary" class="left" @click="handleAdd" v-if="!isDetail">
             <Icon icon="ep:zoom-in" class="mr-5px" />添加项目
             <Icon icon="ep:zoom-in" class="mr-5px" />添加项目
           </el-button>
           </el-button>
         </span>
         </span>
       </div>
       </div>
       <div class="info-wrap">
       <div class="info-wrap">
-<!--        <span>护理套餐包</span>-->
         <el-row>
         <el-row>
           <el-col
           <el-col
             :xs="24"
             :xs="24"
@@ -146,130 +70,17 @@
             v-for="(p, i) in dataForm.items"
             v-for="(p, i) in dataForm.items"
             :key="i"
             :key="i"
           >
           >
-            <el-row gutter="10">
-              <el-col :span="8">
-                <div class="border">
-                  <el-checkbox
-                    :label="p.nurseItemName"
-                    v-model="p.checked"
-                    @change="(arg) => handleChangeCheckBox(arg, p)"
-                    v-if="!isDetail"
-                  />
-                  <div v-else class="itemName">{{ p.nurseItemName }}</div>
-                </div>
-              </el-col>
-<!--              <el-col :span="4">-->
-<!--                <el-input-->
-<!--                  :disabled="isDetail"-->
-<!--                  v-model="p.frequency"-->
-<!--                  placeholder="请输入频次"-->
-<!--                >-->
-<!--                  <template #prepend>-->
-<!--                   <el-text>频次</el-text>-->
-<!--                  </template>-->
-<!--                </el-input>-->
-
-<!--              </el-col>-->
-<!--              <el-col :span="6">-->
-<!--                <TgSelect-->
-<!--                  placeholder="请选择频次单位"-->
-<!--                  v-model="p.frequencyUnit"-->
-<!--                  :list="getDictOptions(DICT_TYPE.NURSING_FREQUENCY_TYPE)"-->
-<!--                  :class="['itemName', { border: isDetail }]"-->
-<!--                >-->
-<!--                  <el-option-->
-<!--                    v-for="(dict, d) in getStrDictOptions(DICT_TYPE.NURSING_FREQUENCY_TYPE)"-->
-<!--                    :key="d"-->
-<!--                    :label="dict.label"-->
-<!--                    :value="dict.value"-->
-<!--                  />-->
-<!--                </TgSelect>-->
-<!--              </el-col>-->
-<!--              <el-col :span="6">-->
-<!--                <TgSelect-->
-<!--                  placeholder="请选择操作方式"-->
-<!--                  v-model="p.operatingMode"-->
-<!--                  :list="getDictOptions(DICT_TYPE.NURSING_OPERATING)"-->
-<!--                  :class="['itemName', { border: isDetail }]"-->
-<!--                >-->
-<!--                  <el-option-->
-<!--                    v-for="(dict, d) in getStrDictOptions(DICT_TYPE.NURSING_OPERATING)"-->
-<!--                    :key="d"-->
-<!--                    :label="dict.label"-->
-<!--                    :value="dict.value"-->
-<!--                  />-->
-<!--                </TgSelect>-->
-<!--              </el-col>-->
-            </el-row>
+            <div class="border">
+              <el-checkbox
+                :label="p.nurseItemName"
+                v-model="p.checked"
+                @change="(arg) => handleChangeCheckBox(arg, p)"
+                v-if="!isDetail"
+              />
+              <div v-else class="itemName">{{ p.nurseItemName }}</div>
+            </div>
           </el-col>
           </el-col>
         </el-row>
         </el-row>
-<!--        <span>额外项目</span>-->
-<!--        <el-row :gutter="30">-->
-<!--          <el-col-->
-<!--            :xs="24"-->
-<!--            :sm="24"-->
-<!--            :md="24"-->
-<!--            :lg="12"-->
-<!--            class="mb5"-->
-<!--            v-for="(p, i) in dataForm.extraItems"-->
-<!--            :key="i"-->
-<!--          >-->
-<!--            <el-row>-->
-<!--              <el-col :span="2" class="flex" v-if="!isDetail">-->
-<!--                <Icon-->
-<!--                  class="mt1"-->
-<!--                  :size="26"-->
-<!--                  color="#f09d31"-->
-<!--                  icon="ep:remove"-->
-<!--                  @click="handleDelete(p)"-->
-<!--                />-->
-<!--              </el-col>-->
-<!--              <el-col :span="isDetail ? 8 : 6">-->
-<!--                <div :class="['itemName border warning']">-->
-<!--                  <span>{{ p.nurseItemName }}</span>-->
-<!--                  <el-tag type="danger">{{ p.price ? formatNum(p.price) : 0 }}元</el-tag>-->
-<!--                </div>-->
-<!--              </el-col>-->
-<!--              <el-col :span="4">-->
-<!--                <TgInputNumber-->
-<!--                  placeholder="请输入频次"-->
-<!--                  v-model="p.frequency"-->
-<!--                  :class="['itemName extra', { border: isDetail }, { 'border-warning': isDetail }]"-->
-<!--                />-->
-<!--              </el-col>-->
-<!--              <el-col :span="6">-->
-<!--                <TgSelect-->
-<!--                  placeholder="请选择频次单位"-->
-<!--                  v-model="p.frequencyUnit"-->
-<!--                  :list="getDictOptions(DICT_TYPE.NURSING_FREQUENCY_TYPE)"-->
-<!--                  :class="['itemName extra', { border: isDetail }, { warning: isDetail }]"-->
-<!--                >-->
-<!--                  <el-option-->
-<!--                    v-for="(dict, d) in getStrDictOptions(DICT_TYPE.NURSING_FREQUENCY_TYPE)"-->
-<!--                    :key="d"-->
-<!--                    :label="dict.label"-->
-<!--                    :value="dict.value"-->
-<!--                  />-->
-<!--                </TgSelect>-->
-<!--              </el-col>-->
-<!--              <el-col :span="6">-->
-<!--                <TgSelect-->
-<!--                  placeholder="请选择操作方式"-->
-<!--                  v-model="p.operatingMode"-->
-<!--                  :list="getDictOptions(DICT_TYPE.NURSING_OPERATING)"-->
-<!--                  :class="['itemName extra', { border: isDetail }, { warning: isDetail }]"-->
-<!--                >-->
-<!--                  <el-option-->
-<!--                    v-for="(dict, d) in getStrDictOptions(DICT_TYPE.NURSING_OPERATING)"-->
-<!--                    :key="d"-->
-<!--                    :label="dict.label"-->
-<!--                    :value="dict.value"-->
-<!--                  />-->
-<!--                </TgSelect>-->
-<!--              </el-col>-->
-<!--            </el-row>-->
-<!--          </el-col>-->
-<!--        </el-row>-->
       </div>
       </div>
     </el-form>
     </el-form>
     <template #footer>
     <template #footer>
@@ -280,26 +91,22 @@
     </template>
     </template>
   </Dialog>
   </Dialog>
   <lifeItem ref="itemRef" @success="getItemList" />
   <lifeItem ref="itemRef" @success="getItemList" />
-  <EvaluationDetail ref="reportRef" />
 </template>
 </template>
 
 
 <script setup lang="ts">
 <script setup lang="ts">
-import { DICT_TYPE, getDictOptions, getIntDictOptions, getStrDictOptions } from '@/utils/dict'
 import {
 import {
   createNursingPlan,
   createNursingPlan,
   updateNursingPlan,
   updateNursingPlan,
-  copyNursingPlan,
   getNursingPlanById,
   getNursingPlanById,
-  getListByElderId,
   findNurseItemListByName
   findNurseItemListByName
 } from '@/api/elderly/nursing'
 } from '@/api/elderly/nursing'
-import EvaluationDetail from '@/views/elderly/assess/synthetic-ability/Detail.vue'
 import lifeItem from './life-item-dialog.vue'
 import lifeItem from './life-item-dialog.vue'
-import { formatNum } from '@/utils/formatter'
 import { planType } from '../types'
 import { planType } from '../types'
+
 defineOptions({ name: 'LifeCarePlanForm' })
 defineOptions({ name: 'LifeCarePlanForm' })
-const message = useMessage() // 消息弹窗
+
 const { t } = useI18n() // 国际化
 const { t } = useI18n() // 国际化
+const message = useMessage() // 消息弹窗
 const dialogVisible = ref(false)
 const dialogVisible = ref(false)
 const state = reactive<planType>({
 const state = reactive<planType>({
   dataForm: {
   dataForm: {
@@ -309,66 +116,44 @@ const state = reactive<planType>({
     bedName: '',
     bedName: '',
     nurseLevelName: '',
     nurseLevelName: '',
     effectiveDate: '',
     effectiveDate: '',
-    diet: '',
-    dietaryType: '',
-    riskPrevention: '',
-    nursingCharacteristics: '',
-    dietaryTaboo: [],
     items: [],
     items: [],
-    extraItems: []
+    extraItems: [],
   },
   },
   dataRule: {
   dataRule: {
     elderId: [{ required: true, message: '长者姓名不能为空', trigger: 'blur' }],
     elderId: [{ required: true, message: '长者姓名不能为空', trigger: 'blur' }],
     effectiveDate: [{ required: true, message: '生效日期不能为空', trigger: 'blur' }]
     effectiveDate: [{ required: true, message: '生效日期不能为空', trigger: 'blur' }]
   },
   },
-  tempCopyForm: {
-    items: [],
-    extraItems: []
-  }
 })
 })
-const { dataForm, dataRule, tempCopyForm } = toRefs(state)
+const { dataForm, dataRule } = toRefs(state)
 const resetFormField =  reactive({ ...dataForm.value })
 const resetFormField =  reactive({ ...dataForm.value })
 const route = useRoute()
 const route = useRoute()
 const formLoading = ref(false)
 const formLoading = ref(false)
 const isDetail = ref(false)
 const isDetail = ref(false)
+
 // 弹窗标题
 // 弹窗标题
 const itemTitle = computed(() => {
 const itemTitle = computed(() => {
-  return isDetail.value ? '详情' : !dataForm.value.id ? (isCopy.value ? '复制' : '新增') : '修改'
+  return isDetail.value ? '详情' : !dataForm.value.id ? '新增' : '修改'
 })
 })
 
 
-const isCopy = ref(false)
-
 /** 打开弹窗 */
 /** 打开弹窗 */
-const open = async (id, detail, copy) => {
+const open = async (id, detail) => {
   dataForm.value.id=''
   dataForm.value.id=''
   dialogVisible.value = true
   dialogVisible.value = true
   isDetail.value = detail
   isDetail.value = detail
-  isCopy.value = copy
   if (id) {
   if (id) {
     const res = await getNursingPlanById(id)
     const res = await getNursingPlanById(id)
-    // 转换数据
-    res.diet = convert(2, res.diet, 'dietInput')
-    res.dietaryType = convert(2, res.dietaryType, 'dietaryTypeInput')
-    res.dietaryTaboo = convert(1, res.dietaryTaboo, 'dietaryTabooInput')
-    // 如果是复制就清空id和长者
-    if (copy) {
-      res.id = ''
-      res.elderId = ''
-      res.elderName = ''
-    }
     // 默认勾选护理项目
     // 默认勾选护理项目
     res.items.map((item) => {
     res.items.map((item) => {
       item.checked = true
       item.checked = true
-      if(copy){
-        // 清空planId
-        item.nursingPlanId = ''
-      }
+    })
+    res.extraItems.map((item) => {
+      item.checked = true
     })
     })
     // 匹配额外项目价格
     // 匹配额外项目价格
     dataForm.value = res
     dataForm.value = res
     await formatExtraItem()
     await formatExtraItem()
-    tempCopyForm.value = JSON.parse(JSON.stringify(dataForm.value))
-    console.log("tempCopyForm.value",tempCopyForm.value)
+    dataForm.value.items = res.items?.length > 0 ? res.items : res.extraItems
+    console.log('dataForm.value', dataForm.value)
   }
   }
 }
 }
 defineExpose({ open }) // 提供 open 方法,用于打开弹窗
 defineExpose({ open }) // 提供 open 方法,用于打开弹窗
@@ -376,16 +161,13 @@ defineExpose({ open }) // 提供 open 方法,用于打开弹窗
 const formatExtraItem = async () => {
 const formatExtraItem = async () => {
   if (dataForm.value.extraItems.length) {
   if (dataForm.value.extraItems.length) {
     const res = await findNurseItemListByName({
     const res = await findNurseItemListByName({
-      categoryTypeName: route.path.indexOf('medical-care-plan') > -1 ? '医疗护理' : '生活护理',
+      categoryTypeName: '生活护理',
       nurseItemName: ''
       nurseItemName: ''
     })
     })
     dataForm.value.extraItems.map((e) => {
     dataForm.value.extraItems.map((e) => {
       res.map((r) => {
       res.map((r) => {
         if (e.nurseItemId == r.id) {
         if (e.nurseItemId == r.id) {
           e.price = r.price
           e.price = r.price
-          if(isCopy.value){
-            e.nursingPlanId = ''
-          }
         }
         }
       })
       })
     })
     })
@@ -397,96 +179,6 @@ const handleClosed = () => {
   dialogVisible.value = false
   dialogVisible.value = false
 }
 }
 
 
-let inputs = reactive({
-  dietInput: '', // 饮食方式-其他
-  dietaryTypeInput: '', // 饮食类型-其他
-  dietaryTabooInput: '' // 饮食禁忌-其他
-})
-const handleChange = (val, type: any) => {
-  if (!val.includes('0')) {
-    let v = type + 'Input'
-    inputs[v] = ''
-  }
-}
-
-// 数组转字符串
-const toStr = (type, name, arr) => {
-  if (type == 1) {
-    if (Array.isArray(arr) && arr.length > 0) {
-      // 如果arr是数组且有值,则返回原数组
-      if (arr.includes('0') && name) {
-        let temp = JSON.parse(JSON.stringify(arr))
-        const index = arr.findIndex((item) => item == '0')
-        temp[index] = '0-' + name
-        return JSON.stringify(temp)
-      }
-      return JSON.stringify(arr)
-    } else {
-      // 否则返回空字符串
-      return ''
-    }
-  } else if (type == 2) {
-    if (arr === '0') {
-      return arr + '-' + name
-    } else {
-      return arr
-    }
-  }
-}
-
-// 字符串转数组
-const convert = (type, str, name?) => {
-  if (type == 1) {
-    let arr: string[] = []
-    if (str) {
-      arr = JSON.parse(str)
-      if (str.includes('0-')) {
-        let index = -1
-        arr.map((item: string, i) => {
-          if (item.indexOf('0-') > -1) index = i
-        })
-        let temp = arr.splice(index, 1)
-        arr.push('0')
-        inputs[name] = temp.join().split('-')[1]
-      }
-    }
-    return arr
-  } else {
-    if (str.includes('0-')) {
-      const arr = str.split('-')
-      inputs[name] = arr[1]
-      return arr[0]
-    } else {
-      return str
-    }
-  }
-}
-
-// 格式化
-const formatArr = (dict: string, value) => {
-  // let { arr } = convert(1, value, 'dietaryTabooInput')
-  let str = ''
-  value.map((a) => {
-    getDictOptions(dict).map((item) => {
-      if (item.value == Number(a)) {
-        if (item.value === '0') {
-          str += item.label + '-' + inputs.dietaryTabooInput + ','
-        } else {
-          str += item.label + ','
-        }
-      }
-    })
-  })
-  return str.substring(0, str.length - 1)
-}
-
-const handleRadioChange = (val, type: any) => {
-  if (val != 0) {
-    let v = type + 'Input'
-    inputs[v] = ''
-  }
-}
-
 const itemRef = ref()
 const itemRef = ref()
 const handleAdd = () => {
 const handleAdd = () => {
   itemRef.value.open(dataForm.value.items)
   itemRef.value.open(dataForm.value.items)
@@ -513,59 +205,6 @@ const handleElder = async (item) => {
   dataForm.value.elderName = item.elderName
   dataForm.value.elderName = item.elderName
   dataForm.value.bedName = item.bedName
   dataForm.value.bedName = item.bedName
   dataForm.value.nurseLevelName = item.nurseLevelName
   dataForm.value.nurseLevelName = item.nurseLevelName
-  // 如果是复制,获取当前长者护理项目,与复制者做比较
-  // const res = await getListByElderId({
-  //   elderId: item.id,
-  //   categoryTypeName: route.path.indexOf('medical-care-plan') > -1 ? '医疗护理' : '生活护理' // 2:医疗护理 1 生活照料
-  // })
-  // // 设置选中
-  // res.map((item) => (item.checked = true))
-  // dataForm.value.items = res
-  // if (isCopy.value) {
-  //   dataForm.value.items = JSON.parse(JSON.stringify(tempCopyForm.value.items))
-  //   dataForm.value.extraItems = JSON.parse(JSON.stringify(tempCopyForm.value.extraItems))
-  //   formatCopyData(res)
-  // }
-}
-
-const reportRef = ref()
-const openReport = (item) => {
-  reportRef.value.open(dataForm.value.elderId, 2)
-}
-
-// 格式化复制的数据
-const formatCopyData = (arr) => {
-  const tempArr: any = []
-  // 当前已有项目跟复制长者项目相同放到额外
-  arr.map((a) => {
-    dataForm.value.items.map((item) => {
-      if (a.nurseItemId == item.nurseItemId) {
-        tempArr.push(JSON.parse(JSON.stringify(a)))
-        a.flag = true
-      }
-    })
-  })
-  // 如果没有相同就合并
-  arr.map((item) => {
-    if (!item.flag) {
-      item.checked = true
-      dataForm.value.items.push(item)
-    }
-  })
-  // 判断额外项目是否已存在
-  tempArr.map((t) => {
-    dataForm.value.extraItems.map((e) => {
-      if (t.nurseItemId == e.nurseItemId) {
-        t.flag = true
-        e.frequency = Number(t.frequency) + Number(e.frequency)
-      }
-    })
-  })
-  tempArr.map((item) => {
-    if (!item.flag) {
-      dataForm.value.extraItems.push(item)
-    }
-  })
 }
 }
 
 
 const handleChangeCheckBox = (val, item) => {
 const handleChangeCheckBox = (val, item) => {
@@ -574,10 +213,6 @@ const handleChangeCheckBox = (val, item) => {
     dataForm.value.items.splice(index, 1)
     dataForm.value.items.splice(index, 1)
   }
   }
 }
 }
-const handleDelete = (item) => {
-  const index = dataForm.value.extraItems.findIndex((p) => item.nurseItemId == p.nurseItemId)
-  dataForm.value.extraItems.splice(index, 1)
-}
 
 
 const formRef = ref()
 const formRef = ref()
 const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
 const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
@@ -591,15 +226,10 @@ const submitForm = async () => {
     const params = {
     const params = {
       type: route.path.indexOf('medical-care-plan') > -1 ? 2 : 1, // 2:医疗护理 1 生活护理,
       type: route.path.indexOf('medical-care-plan') > -1 ? 2 : 1, // 2:医疗护理 1 生活护理,
       ...dataForm.value,
       ...dataForm.value,
-      dietaryTaboo: toStr(1, inputs.dietaryTabooInput, dataForm.value.dietaryTaboo),
-      diet: toStr(2, inputs.dietInput, dataForm.value.diet),
-      dietaryType: toStr(2, inputs.dietaryTypeInput, dataForm.value.dietaryType)
     }
     }
-    const res = !isCopy.value
-      ? params.id
-        ? await updateNursingPlan(params)
-        : await createNursingPlan(params)
-      : await copyNursingPlan(params)
+    const res = params.id
+      ? await updateNursingPlan(params)
+      : await createNursingPlan(params)
     if (res) {
     if (res) {
       message.success(t('common.updateSuccess'))
       message.success(t('common.updateSuccess'))
       handleClosed()
       handleClosed()

+ 0 - 255
src/views/elderly/nursing/life-care-plan/Print.vue

@@ -1,255 +0,0 @@
-<template>
-  <Dialog v-model="dialogVisible" title="打印" width="70%" @close="handleClosed">
-    <div class="life-care-print" id="printArea">
-      <div class="title">{{ tenantName }}</div>
-      <div class="desc">护理信息</div>
-      <el-row :gutter="20">
-        <el-col :span="8" class="pb4">长者姓名:{{ dataForm.elderName }}</el-col>
-        <el-col :span="8" class="pb4"
-          >性别:{{ getDictLabel(DICT_TYPE.SYSTEM_USER_SEX, dataForm.elderSex) }}</el-col
-        >
-        <el-col :span="8" class="pb4">床位号:{{ dataForm.bedName }}</el-col>
-        <el-col :span="8" class="pb4">饮食类型:{{ dataForm.dietaryType }}</el-col>
-        <el-col :span="8" class="pb4">饮食方式:{{ dataForm.diet }}</el-col>
-        <el-col :span="8" class="pb4">饮食禁忌:{{ dataForm.dietaryTaboo }}</el-col>
-        <el-col class="pb4">风险防范:{{ dataForm.riskPrevention }}</el-col>
-        <el-col class="pb4">照护特点:{{ dataForm.nursingCharacteristics }}</el-col>
-      </el-row>
-      <p class="content-title">生活护理</p>
-      <el-row :gutter="30">
-        <el-col
-          :xs="24"
-          :sm="24"
-          :md="24"
-          :lg="12"
-          class="mb5"
-          v-for="(p, i) in dataForm.items"
-          :key="i"
-        >
-          <el-row>
-            <el-col :span="8">
-              <div :class="['itemName', { warning: p.isExtra }]">
-                <span>{{ p.nurseItemName }}</span>
-              </div>
-            </el-col>
-            <el-col :span="4">
-              <TgInputNumber
-                placeholder="请输入频次"
-                v-model="p.frequencyUnit"
-                :class="['itemName', { warning: p.isExtra }]"
-              />
-            </el-col>
-            <el-col :span="6">
-              <TgSelect
-                placeholder="请选择频次单位"
-                v-model="p.frequency"
-                :list="getDictOptions(DICT_TYPE.NURSING_FREQUENCY_TYPE)"
-                :class="['itemName', { warning: p.isExtra }]"
-              >
-                <el-option
-                  v-for="(dict, d) in getIntDictOptions(DICT_TYPE.NURSING_FREQUENCY_TYPE)"
-                  :key="d"
-                  :label="dict.label"
-                  :value="dict.value"
-                />
-              </TgSelect>
-            </el-col>
-            <el-col :span="6">
-              <TgSelect
-                placeholder="请选择操作方式"
-                v-model="p.operatingMode"
-                :list="getDictOptions(DICT_TYPE.NURSING_OPERATING)"
-                :class="['itemName', { warning: p.isExtra }]"
-              >
-                <el-option
-                  v-for="(dict, d) in getStrDictOptions(DICT_TYPE.NURSING_OPERATING)"
-                  :key="d"
-                  :label="dict.label"
-                  :value="dict.value"
-                />
-              </TgSelect>
-            </el-col>
-          </el-row>
-        </el-col>
-      </el-row>
-      <p class="content-title">医疗护理</p>
-      <el-row :gutter="30">
-        <el-col
-          :xs="24"
-          :sm="24"
-          :md="24"
-          :lg="12"
-          class="mb5"
-          v-for="(p, i) in dataForm.medicalItem"
-          :key="i"
-        >
-          <el-row>
-            <el-col :span="8">
-              <div :class="['itemName', { warning: p.isExtra }]">
-                <span>{{ p.nurseItemName }}</span>
-              </div>
-            </el-col>
-            <el-col :span="4">
-              <TgInputNumber
-                placeholder="请输入频次"
-                v-model="p.frequencyUnit"
-                :class="['itemName', { warning: p.isExtra }]"
-              />
-            </el-col>
-            <el-col :span="6">
-              <TgSelect
-                placeholder="请选择频次单位"
-                v-model="p.frequency"
-                :list="getDictOptions(DICT_TYPE.NURSING_FREQUENCY_TYPE)"
-                :class="['itemName', { warning: p.isExtra }]"
-              >
-                <el-option
-                  v-for="(dict, d) in getIntDictOptions(DICT_TYPE.NURSING_FREQUENCY_TYPE)"
-                  :key="d"
-                  :label="dict.label"
-                  :value="dict.value"
-                />
-              </TgSelect>
-            </el-col>
-            <el-col :span="6">
-              <TgSelect
-                placeholder="请选择操作方式"
-                v-model="p.operatingMode"
-                :list="getDictOptions(DICT_TYPE.NURSING_OPERATING)"
-                :class="['itemName', { warning: p.isExtra }]"
-              >
-                <el-option
-                  v-for="(dict, d) in getStrDictOptions(DICT_TYPE.NURSING_OPERATING)"
-                  :key="d"
-                  :label="dict.label"
-                  :value="dict.value"
-                />
-              </TgSelect>
-            </el-col>
-          </el-row>
-        </el-col>
-      </el-row>
-    </div>
-    <template #footer>
-      <el-button @click="handleClosed">关闭</el-button>
-      <el-button v-print="print" type="primary">打印</el-button>
-    </template>
-
-    <Print ref="printRef" />
-  </Dialog>
-</template>
-<script setup lang="ts">
-import { useUserStore } from '@/store/modules/user'
-import {
-  DICT_TYPE,
-  getDictLabel,
-  getDictOptions,
-  getStrDictOptions,
-  getIntDictOptions
-} from '@/utils/dict'
-import Print from './Print.vue'
-defineOptions({ name: 'lifeCarePlanPrint' })
-const tenantName = useUserStore().getTenantName // 当前登录的编号
-const dialogVisible = ref(false)
-const state = reactive<{
-  dataForm: {
-    elderName?: string
-    elderSex?: number
-    bedName?: string
-    dietaryType?: string
-    diet?: string
-    riskPrevention?: string
-    dietaryTaboo?: string
-    nursingCharacteristics?: string
-    medicalItem?: {
-      isExtra: number
-      nurseItemName: string
-      frequencyUnit: string
-      frequency: string
-      operatingMode: string
-    }[]
-    items?: {
-      isExtra: number
-      nurseItemName: string
-      frequencyUnit: string
-      frequency: string
-      operatingMode: string
-    }[]
-  }
-}>({
-  dataForm: {}
-})
-const { dataForm } = toRefs(state)
-const resetFormField =  reactive({ ...dataForm.value })
-
-/** 打开弹窗 */
-const open = async (item) => {
-  dialogVisible.value = true
-  dataForm.value = item
-}
-defineExpose({ open }) // 提供 open 方法,用于打开弹窗
-
-const handleClosed = () => {
-  dataForm.value = {...resetFormField}
-  dialogVisible.value = false
-}
-
-// 打印
-const print = {
-  id: 'printArea',
-  extraCss: '',
-  popTitle: '', // 打印配置页上方的标题
-  extraHead: '', // 最上方的头部文字,附加在head标签上的额外标签,使用逗号分割
-  preview: false, // 是否启动预览模式,默认是false
-  previewTitle: '对账单预览', // 打印预览的标题
-  previewPrintBtnLabel: '预览结束,开始打印', // 打印预览的标题下方的按钮文本,点击可进入打印
-  zIndex: 20002, // 预览窗口的z-index,默认是20002,最好比默认值更高
-  previewBeforeOpenCallback() {
-    console.log('正在加载预览窗口!')
-  }, // 预览窗口打开之前的callback
-  previewOpenCallback() {
-    console.log('已经加载完预览窗口,预览打开了!')
-  }, // 预览窗口打开时的callback
-  beforeOpenCallback() {
-    console.log('开始打印之前!')
-  }, // 开始打印之前的callback
-  openCallback() {
-    console.log('执行打印了!')
-  }, // 调用打印时的callback
-  closeCallback() {
-    console.log('关闭了打印工具!')
-  }, // 关闭打印的callback(无法区分确认or取消)
-  clickMounted() {
-    console.log('点击v-print绑定的按钮了!')
-  },
-  standard: ''
-}
-</script>
-<style lang="scss" scoped>
-.life-care-print {
-  .title {
-    text-align: center;
-    font-size: 22px;
-    font-weight: bolder;
-    margin: 15px 0;
-  }
-  .desc {
-    font-size: 18px;
-    text-align: center;
-    margin: 10px 0;
-  }
-  .content-title {
-    font-size: 15px;
-  }
-  .itemName {
-    line-height: 30px;
-    padding: 1px 11px;
-    box-shadow: 0 0 0 1px var(--el-input-border-color, var(--el-border-color)) inset;
-    border-radius: var(--el-input-border-radius, var(--el-border-radius-base));
-  }
-  .warning {
-    box-shadow: 0 0 0 1px var(--el-color-warning) inset;
-    background-color: var(--el-color-warning-light-9);
-  }
-}
-</style>

+ 6 - 20
src/views/elderly/nursing/life-care-plan/index.vue

@@ -33,14 +33,7 @@
 
 
   <!-- 列表 -->
   <!-- 列表 -->
   <ContentWrap>
   <ContentWrap>
-    <TabBarBtn @add="openForm()">
-      <!-- <template #middle>
-        <el-button @click="handleCopy"
-          ><Icon icon="ep:document-copy" class="mr-5px" /> 复制</el-button
-        >
-      </template> -->
-    </TabBarBtn>
-    <!-- isRadio -->
+    <TabBarBtn @add="openForm()" />
     <Table2
     <Table2
       v-loading="loading"
       v-loading="loading"
       :data="list"
       :data="list"
@@ -50,6 +43,7 @@
       @edit="openForm"
       @edit="openForm"
       @detail="(arg) => openForm(arg, true)"
       @detail="(arg) => openForm(arg, true)"
     />
     />
+
     <!-- 分页 -->
     <!-- 分页 -->
     <Pagination
     <Pagination
       :total="total"
       :total="total"
@@ -64,13 +58,12 @@
 <script lang="ts" setup>
 <script lang="ts" setup>
 import { getnursingPlanPage, getNursingLevelPage } from '@/api/elderly/nursing'
 import { getnursingPlanPage, getNursingLevelPage } from '@/api/elderly/nursing'
 import { LifeCarePlanColumns } from '../column'
 import { LifeCarePlanColumns } from '../column'
-import Form from './Form.vue'
 import {useUserStore} from "@/store/modules/user";
 import {useUserStore} from "@/store/modules/user";
-const userStore = useUserStore()
+import Form from './Form.vue'
+
 defineOptions({ name: 'LifeCarePlan' })
 defineOptions({ name: 'LifeCarePlan' })
 
 
-const message = useMessage() // 消息弹窗
-const { t } = useI18n() // 国际化
+const userStore = useUserStore()
 const route = useRoute()
 const route = useRoute()
 
 
 const loading = ref(true) // 列表的加载中
 const loading = ref(true) // 列表的加载中
@@ -81,7 +74,7 @@ const queryParams = reactive({
   pageSize: 10,
   pageSize: 10,
   nurseLevelId: undefined,
   nurseLevelId: undefined,
   bedId: undefined,
   bedId: undefined,
-  elderName: undefined,
+  elderName: "",
   tenantIds: userStore.orgTenantId,
   tenantIds: userStore.orgTenantId,
   type: route.path.indexOf('medical-care-plan') > -1 ? 2 : 1, // 2:医疗护理 1 生活护理
   type: route.path.indexOf('medical-care-plan') > -1 ? 2 : 1, // 2:医疗护理 1 生活护理
 })
 })
@@ -122,13 +115,6 @@ const currItem = ref({})
 const handleRowClick = (val) => {
 const handleRowClick = (val) => {
   currItem.value = val
   currItem.value = val
 }
 }
-const handleCopy = () => {
-  if(!currItem.value.id){
-    message.error('请选择一条数据')
-    return
-  }
-  formRef.value.open(currItem.value.id, false, true)
-}
 
 
 const nurseLevelList = ref<{ nurseLevelName: string; id: string | number }[]>([])
 const nurseLevelList = ref<{ nurseLevelName: string; id: string | number }[]>([])
 const getNurseLevelList = async () => {
 const getNurseLevelList = async () => {

+ 31 - 256
src/views/elderly/nursing/nursing-log-list/Detail.vue

@@ -1,194 +1,27 @@
 <template>
 <template>
   <Dialog v-model="dialogVisible" width="90%" @close="handleClosed" title="护理日志详情" class="form-tag-dialog" scroll>
   <Dialog v-model="dialogVisible" width="90%" @close="handleClosed" title="护理日志详情" class="form-tag-dialog" scroll>
-    <el-form :model="dataForm" class="nursing-log-detail" ref="formRef" inline>
+    <el-form class="nursing-log-detail" inline>
     <!-- <template #content> -->
     <!-- <template #content> -->
       <div class="header-flex">
       <div class="header-flex">
         <div class="left">
         <div class="left">
           <el-tag type="primary" effect="light" round>
           <el-tag type="primary" effect="light" round>
-            {{ dataForm.elderName }} / {{dataForm.nursingGrade}} / {{ dataForm.bedName }}
+            {{ header.elderName }} / {{ header.nurseLevelName }} / {{ header.bedName }}
           </el-tag>
           </el-tag>
-          <span class="ml5 mr5">{{ dataForm.nursingDate }}</span>
-          <el-tag type="primary" effect="light" round class="ml5 mr5">当日{{ getDictLabel(DICT_TYPE.ELDER_IN_HOSPITAL, dataForm.inHospitalStatus) }}</el-tag>
-        </div>
-        <div class="right">
-          <el-radio-group v-model="queryType" @change="handleChangeType">
-            <el-radio-button label="所有护理" value="" />
-            <el-radio-button label="生活护理" value="1" />
-            <el-radio-button label="医疗护理" value="2" />
-            </el-radio-group>
-          <div class="group">
-            <span :class="['column', 'ml4', 'mr4', {'blue': activeName==1}]" @click="handleTab(1)">
-              <img src="@/assets/imgs/time.png" v-if="activeName==2"/>
-              <img src="@/assets/imgs/time-fill.png" v-if="activeName==1"/>
-              按时间查看
-            </span>
-            <span :class="['column',{'blue': activeName==2}]" @click="handleTab(2)">
-              <img src="@/assets/imgs/project.png" v-if="activeName==1"/>
-              <img src="@/assets/imgs/project-fill.png" v-if="activeName==2"/>
-              按项目查看
-            </span>
-          </div>
-        </div>
-        </div>
-    <!-- </template> -->
-      <el-row :gutter="10" class="mt5" v-if="activeName==1">
-        <el-col :span="6" :xs="24">
-          <el-card class="card-item" shadow="never">
-            <div class="title">上午06:00-12:00</div>
-            <div class="left">
-              <div v-for="(item, index) in d1.morningEvents" :key="index" class="scene-item">
-                <span class="line"></span>
-                <div class="timeline-item__tail" v-if="index > 0"></div>
-                {{ item.name }}
-              </div>
-            </div>
-            <div class="right">
-              <el-table :data="d1.morningEvents" height="45vh" :header-cell-style="tableHeaderColor">
-                <el-table-column label="记录时间">
-                  <template #default="scope">
-                    {{ formatTime(scope.row.nursingTime, 'HH:mm') }}
-                  </template>
-                </el-table-column>
-                <el-table-column label="护理员" prop="caregiver" />
-                <el-table-column label="护理项目" prop="nurseItemName" />
-                <el-table-column label="图片">
-                  <template #default="scope">
-                    <el-image :src="scope.row.nurseItemImage" fit="cover" />
-                  </template>
-                </el-table-column>
-              </el-table>
-            </div>
-          </el-card>
-        </el-col>
-        <el-col :span="6" :xs="24">
-          <el-card class="card-item" shadow="never">
-            <div class="title">下午12:00-18:00</div>
-            <div class="left">
-              <div v-for="(item, index) in d1.afternoonEvents" :key="index" class="scene-item">
-                <span class="line"></span>
-                <div class="timeline-item__tail" v-if="index > 0"></div>
-                {{ item.name }}
-              </div>
-            </div>
-            <div class="right">
-              <el-table :data="d1.afternoonEvents" height="45vh" :header-cell-style="tableHeaderColor">
-                <el-table-column label="记录时间">
-                  <template #default="scope">
-                    {{ formatTime(scope.row.nursingTime, 'HH:mm') }}
-                  </template>
-                </el-table-column>
-                <el-table-column label="护理员" prop="caregiver" />
-                <el-table-column label="护理项目" prop="nurseItemName" />
-                <el-table-column label="图片">
-                  <template #default="scope">
-                    <el-image :src="scope.row.nurseItemImage" fit="cover" />
-                  </template>
-                </el-table-column>
-              </el-table>
-            </div>
-          </el-card>
-        </el-col>
-        <el-col :span="6" :xs="24">
-          <el-card class="card-item" shadow="never">
-            <div class="title">晚间18:00-24:00</div>
-            <div class="left">
-              <div v-for="(item, index) in d1.nightEvents" :key="index" class="scene-item">
-                <span class="line"></span>
-                <div class="timeline-item__tail" v-if="index > 0"></div>
-                {{ item.name }}
-              </div>
-            </div>
-            <div class="right">
-              <el-table :data="d1.nightEvents" height="45vh" :header-cell-style="tableHeaderColor">
-                <el-table-column label="记录时间">
-                  <template #default="scope">
-                    {{ formatTime(scope.row.nursingTime, 'HH:mm') }}
-                  </template>
-                </el-table-column>
-                <el-table-column label="护理员" prop="caregiver" />
-                <el-table-column label="护理项目" prop="nurseItemName" />
-                <el-table-column label="图片">
-                  <template #default="scope">
-                    <el-image :src="scope.row.nurseItemImage" fit="cover" />
-                  </template>
-                </el-table-column>
-              </el-table>
-            </div>
-          </el-card>
-        </el-col>
-        <el-col :span="6" :xs="24">
-          <el-card class="card-item" shadow="never">
-            <div class="title">深夜24:00-06:00</div>
-            <div class="left">
-              <div v-for="(item, index) in d1.beforeDawnEvents" :key="index" class="scene-item">
-                <span class="line"></span>
-                <div class="timeline-item__tail" v-if="index > 0"></div>
-                {{ item.name }}
-              </div>
-            </div>
-            <div class="right">
-              <el-table :data="d1.beforeDawnEvents" height="45vh" :header-cell-style="tableHeaderColor">
-                <el-table-column label="记录时间">
-                  <template #default="scope">
-                    {{ formatTime(scope.row.nursingTime, 'HH:mm') }}
-                  </template>
-                </el-table-column>
-                <el-table-column label="护理员" prop="caregiver" />
-                <el-table-column label="护理项目" prop="nurseItemName" />
-                <el-table-column label="图片">
-                  <template #default="scope">
-                    <el-image :src="scope.row.nurseItemImage" fit="cover" />
-                  </template>
-                </el-table-column>
-              </el-table>
-            </div>
-          </el-card>
-        </el-col>
-      </el-row>
-      <div class="mt5" v-if="activeName==2">
-        <el-form-item label="护理项目" prop="nurseItemName">
-          <TgInput placeholder="护理项目" v-model="queryParams.nurseItemName"/>
-        </el-form-item>
-        <el-form-item label="护理人员" prop="caregiverName">
-          <TgInput placeholder="护理人员" v-model="queryParams.caregiverName"/>
-        </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>
-
-        <div v-for="(item, index) in d2" :key="index" v-loading="loading">
-          <div class="info-title">
-            {{ item.scheduleShift.workDate }} 2/{{ item.nurseItems.length }} {{ item.scheduleShift.shiftName }} {{ item.scheduleShift.nurseName }}
-          </div>
-          <div class="info-wrap">
-            <el-row :gutter="8">
-              <el-col :span="6" :xs="24" v-for="(n, i) in item.nurseItems" :key="i" class="mb2">
-                <el-card shadow="never" :class="[{'success': n.actualFrequency >= n.frequency}]">
-                  <div class="header">
-                    <div class="left">
-                      <span :class="['no-bg', {'bg': n.actualFrequency >= n.frequency }]">{{ getDictLabel(DICT_TYPE.NURSING_FREQUENCY_TYPE, n.frequencyUnit).split('/')[1] }}</span>
-                      <span :class="['text', 'ml2', {'primary': n.actualFrequency < n.frequency}]">{{ n.nurseItemName }}</span>
-                    </div>
-                    <div class="right">
-                      完成<span class="text f15">{{ n.actualFrequency }}</span>/{{ n.frequency }}次
-                    </div>
-                  </div>
-                  <el-progress v-if="n.actualFrequency >= n.frequency" :percentage="100" status="success" class="progress"/>
-                  <el-progress v-else :percentage="(n.actualFrequency / n.frequency)*100" status="success" class="progress" :format="format"/>
-                  <el-scrollbar height="100">
-                    <el-row>
-                      <el-col :span="12" :xs="24" v-for="t in n.records" :key="t+i">
-                        <div class="time-round">{{ formatTime(t.nursingTime, 'HH:mm') }}</div>
-                      </el-col>
-                    </el-row>
-                  </el-scrollbar>
-                </el-card>
-              </el-col>
-            </el-row>
-          </div>
         </div>
         </div>
       </div>
       </div>
+      <el-table :data="records" height="60vh" :header-cell-style="(data) => tableHeaderColor(data) || {}">
+        <el-table-column label="护理日期" prop="nurseDate" />
+        <el-table-column label="护理员" prop="creator" />
+        <el-table-column label="护理项目" prop="nursingPlanItemId" />
+        <el-table-column label="图片">
+          <template #default="scope">
+            <el-image v-if="scope.row.image" :src="scope.row.image" fit="cover" />
+            <span v-else>-</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="备注" prop="remark" />
+        <el-table-column label="创建时间" prop="createTime" />
+      </el-table>
     </el-form>
     </el-form>
     <template #footer>
     <template #footer>
       <el-button @click="handleClosed">关闭</el-button>
       <el-button @click="handleClosed">关闭</el-button>
@@ -196,100 +29,42 @@
   </Dialog>
   </Dialog>
 </template>
 </template>
 <script setup lang="ts">
 <script setup lang="ts">
-import { DICT_TYPE, getDictLabel, getDictOptions, getIntDictOptions } from '@/utils/dict'
-import { getNursingLogByTime, getNursingLogByItem } from '@/api/elderly/nursing'
+import { getNursingLogDetail } from '@/api/elderly/nursing'
 import { tableHeaderColor } from '@/utils/table'
 import { tableHeaderColor } from '@/utils/table'
-import { formatTime } from '@/utils'
 defineOptions({ name: 'NurseLogDetail' })
 defineOptions({ name: 'NurseLogDetail' })
-const message = useMessage() // 消息弹窗
-const { t } = useI18n() // 国际化
 const dialogVisible = ref(false)
 const dialogVisible = ref(false)
-const formLoading = ref(false)
 
 
 const state = reactive({
 const state = reactive({
-  dataForm: {
-    id: '',
+  header: {
     elderName: '',
     elderName: '',
     bedName: '',
     bedName: '',
-    nursingGrade: '',
-    inHospitalStatus: '',
-    nursingDate: ''
+    nurseLevelName: ''
   },
   },
-  d1: {},
-  d2: {}
+  records: []
 })
 })
-const { dataForm, d1, d2 } = toRefs(state)
-const resetFormField =  reactive({ ...dataForm.value })
-
-const queryType = ref('')
-const activeName = ref(1)
-
-const queryParams = reactive({
-  nurseItemName: undefined,
-  caregiverName: undefined,
-  type: undefined
-})
-const formRef = ref()
+const { header, records } = toRefs(state)
+const resetHeader = reactive({ ...header.value })
 
 
 /** 打开弹窗 */
 /** 打开弹窗 */
-const open = async (row) => {
+const open = async (row: { elderId: number }) => {
   dialogVisible.value = true
   dialogVisible.value = true
-  dataForm.value = row
-
-  getList(row.id, 1)
+  await getDetail(row.elderId)
 }
 }
-defineExpose({ open }) // 提供 open 方法,用于打开弹窗
 
 
-const format = (percentage) => (percentage === 100 ? '' : `${percentage}%`)
-const loading = ref(false)
-// type: 生活护理1,医疗护理2; val:按时间查看1 按项目查看2
-const getList = async (id, val) => {
-  if(val == 1){
-    const res = await getNursingLogByTime({ id: id, type: queryParams.type })
-    d1.value = res
-  }else{
-    loading.value = true
-    const res = await getNursingLogByItem({id: id, ...queryParams})
-    d2.value = res
-    loading.value = false
-  }
+const getDetail = async (elderId: number) => {
+  const res = await getNursingLogDetail({ elderId })
+  header.value = res.header || { ...resetHeader }
+  records.value = res.records || []
 }
 }
 
 
+defineExpose({ open }) // 提供 open 方法,用于打开弹窗
+
 const handleClosed = () => {
 const handleClosed = () => {
-  activeName.value = 1
-  queryParams.nurseItemName = undefined
-  queryParams.caregiverName = undefined
-  queryParams.type = undefined
-  queryType.value = ''
-  dataForm.value = { ...resetFormField }
+  header.value = { ...resetHeader }
+  records.value = []
   dialogVisible.value = false
   dialogVisible.value = false
 }
 }
 
 
-const handleQuery = () => {
-  getList(dataForm.value.id, activeName.value)
-}
-
-const resetQuery = () => {
-  queryParams.nurseItemName = undefined
-  queryParams.caregiverName = undefined
-  formRef.value.resetFields()
-  getList(dataForm.value.id, activeName.value)
-}
-
-const handleTab = (val) => {
-  activeName.value = val
-  getList(dataForm.value.id, val)
-}
-
-const handleChangeType = (val) => {
-  if(val){
-    queryParams.type = val
-  }else{
-    queryParams.type = undefined
-  }
-  getList(dataForm.value.id, activeName.value)
-}
-
 </script>
 </script>
 <style lang="scss" scoped>
 <style lang="scss" scoped>
 .header-flex{
 .header-flex{

+ 0 - 187
src/views/elderly/nursing/nursing-log-list/Form.vue

@@ -1,187 +0,0 @@
-<template>
-  <Dialog v-model="dialogVisible" title="护理日志补录" width="80%" @close="handleClosed">
-    <el-form :model="dataForm" ref="formRef">
-      <el-row :gutter="20">
-        <el-col :span="4" :xs="24">
-          <el-form-item label="长者姓名">{{ dataForm.elderName }}</el-form-item>
-        </el-col>
-        <el-col :span="4" :xs="24">
-          <el-form-item label="床位号">{{ dataForm.bedName }}</el-form-item>
-        </el-col>
-        <el-col :span="4" :xs="24">
-          <el-form-item label="护理等级">{{ dataForm.nursingGrade }}</el-form-item>
-        </el-col>
-        <el-col :span="4" :xs="24">
-          <el-form-item label="护理日期">{{ dataForm.nursingDate }}</el-form-item>
-        </el-col>
-        <el-col :span="4" :xs="24">
-          <el-form-item label="护理人员">
-            <el-select v-model="dataForm.caregiverId" placeholder="请选择" @change="handleChangeNurse">
-              <el-option v-for="item in nurseList" :key="item.id" :label="item.nickname" :value="item.id"/>
-            </el-select>
-          </el-form-item>
-        </el-col>
-      </el-row>
-      <el-table :data="dataForm.nursingLogRecords" border height="55vh">
-        <el-table-column label="项目分类" prop="categoryName" width="180" align="center"/>
-        <el-table-column label="项目名称" prop="nurseItemName" width="150" align="center"/>
-        <el-table-column label="频次" prop="frequency" width="120" align="center"/>
-        <el-table-column label="形式" prop="frequencyUnit" width="120" align="center">
-          <template #default="scope">
-            {{ getDictLabel(DICT_TYPE.NURSING_FREQUENCY_TYPE, scope.row.frequencyUnit) }}
-          </template>
-        </el-table-column>
-        <el-table-column label="补录时间" align="center">
-          <template #default="scope">
-            <el-scrollbar>
-              <div class="flex-time">
-                <span v-for="(item, index) in scope.row.records" :key="index" class="flex-time mr2 mb2">
-                  <TgTimePicker style="width: 120px;" v-model="item.tempTime" @change="handleChange(item)"/>
-                  <Icon icon="ep:circle-close-filled" class="ml1 icon" @click="handleDel(scope.row, index)"/>
-                </span>
-                <el-button type="primary" @click="handleAdd(scope.row)">添加</el-button>
-              </div>
-            </el-scrollbar>
-          </template>
-        </el-table-column>
-      </el-table>
-    </el-form>
-    <template #footer>
-      <el-button @click="handleClosed">关闭</el-button>
-      <el-button v-loading="formLoading" type="primary" @click="submitForm">确定</el-button
-      >
-    </template>
-  </Dialog>
-</template>
-<script setup lang="ts">
-import { DICT_TYPE, getDictLabel } from '@/utils/dict'
-import { supplementNursingLog, getNurseGroupByElderId, getNursingLogDetails } from '@/api/elderly/nursing'
-import { formatTime } from '@/utils'
-defineOptions({ name: 'NurseLogForm' })
-const message = useMessage() // 消息弹窗
-const { t } = useI18n() // 国际化
-const dialogVisible = ref(false)
-const formLoading = ref(false)
-const state = reactive({
-  dataForm:{
-    id: '',
-    elderId: '',
-    elderName: '',
-    nursingDate: '',
-    count: '',
-    bedName: '',
-    nursingGrade: '',
-    caregiverId: '',
-    caregiver: '',
-    nursingLogRecords: []
-  }
-})
-const { dataForm } = toRefs(state)
-
-const resetFormField =  reactive({ ...dataForm.value })
-const formRef = ref()
-
-const nurseList = ref<{id: string, nickname: string}[]>([])
-/** 打开弹窗 */
-const open = async (row) => {
-  dialogVisible.value = true
-  // 根据长者获取护理分组人员
-  const res = await getNurseGroupByElderId(row.elderId)
-  nurseList.value = res
-
-  dataForm.value.elderName = row.elderName
-  dataForm.value.bedName = row.bedName
-  dataForm.value.nursingGrade = row.nursingGrade
-  dataForm.value.elderId = row.elderId
-  dataForm.value.nursingDate = row.nursingDate
-  dataForm.value.id = row.id
-  
-}
-defineExpose({ open }) // 提供 open 方法,用于打开弹窗
-
-const handleAdd = (row) => {
-  row.records.push({
-    ...row,
-    records: undefined,
-    nursingLogId: dataForm.value.id,
-    caregiverId: dataForm.value.caregiverId,
-    caregiver: dataForm.value.caregiver,
-    nursingPlanItemId: row.id,
-    tempTime: '',
-    id: undefined
-  })
-}
-const handleDel = (row, index: number) => {
-  row.records.splice(index, 1)
-}
-
-const handleChangeNurse = (val) => {
-  const obj: any = nurseList.value.find(item => item.id == val)
-  dataForm.value.caregiver = obj.nickname
-  getDetail()
-}
-
-const handleChange = (item) => {
-  item.nursingTime = Date.parse(dataForm.value.nursingDate + ' ' + item.tempTime)
-}
-
-const handleClosed = () => {
-  dataForm.value = { ...resetFormField }
-  dialogVisible.value = false
-}
-
-const getDetail = async () => {
-  // 获取补录详情
-  const result = await getNursingLogDetails({elderId: dataForm.value.elderId, nursingLogId: dataForm.value.id})
-  
-  result.map(item=>{
-    item.records.map(r => {
-      r.id = undefined
-      if(r.nursingTime){
-        r.tempTime = formatTime(new Date(r.nursingTime), 'HH:mm:ss')
-      }
-    })
-  })
-  dataForm.value.nursingLogRecords = result
-}
-
-/** 提交表单 */
-const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
-const submitForm = async () => {
-  // 校验表单
-  if (!formRef.value) return
-  const valid = await formRef.value.validate()
-  if (!valid) return
-  // 提交请求
-  formLoading.value = true
-  try {
-    const params = JSON.parse(JSON.stringify(dataForm.value))
-    const arr = []
-    params.nursingLogRecords.map(item=>{
-      if(item.records && item.records.length > 0){
-        arr.push(...item.records)
-      }
-    })
-    params.nursingLogRecords = arr
-    const res = await supplementNursingLog(params)
-    if (res) {
-      message.success(t('common.updateSuccess'))
-      handleClosed()
-      // 发送操作成功的事件
-      emit('success')
-    }
-  } finally {
-    formLoading.value = false
-  }
-}
-</script>
-<style lang="scss" scoped>
-.flex-time{
-  display: flex;
-  align-items: center;
-  flex-wrap: wrap;
-  .icon{
-    cursor: pointer;
-  }
-}
-</style>

+ 33 - 42
src/views/elderly/nursing/nursing-log-list/index.vue

@@ -9,20 +9,21 @@
       :inline="true"
       :inline="true"
       label-width="80px"
       label-width="80px"
     >
     >
-      <el-form-item label="长者名称" prop="elderName">
-        <TgInput @keyup.enter="handleQuery" v-model="queryParams.elderName"  class="!w-240px" />
+      <el-form-item prop="tenantIds">
+        <TenantSelect v-model="queryParams.tenantIds" placeholder="请选择机构名称" prop="tenantIds" />
       </el-form-item>
       </el-form-item>
-      <el-form-item label="护理员" prop="elderName">
-        <TgInput @keyup.enter="handleQuery" v-model="queryParams.elderName"  class="!w-240px" />
+      <el-form-item label="长者名称" prop="elderName">
+        <TgInput @keyup.enter="handleQuery" v-model="queryParams.elderName" class="!w-240px" />
       </el-form-item>
       </el-form-item>
-      <el-form-item label="护理日期" prop="nursingDate">
+      <el-form-item label="护理日期" prop="nurseDate">
         <el-date-picker
         <el-date-picker
           end-placeholder="结束日期"
           end-placeholder="结束日期"
           start-placeholder="开始日期"
           start-placeholder="开始日期"
           type="daterange"
           type="daterange"
-          value-format="YYYY-MM-DD HH:mm:ss" range-separator="至" v-model="queryParams.nursingDate"
-          :default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"/>
-
+          value-format="YYYY-MM-DD"
+          range-separator="至"
+          v-model="queryParams.nurseDate"
+        />
       </el-form-item>
       </el-form-item>
       <el-form-item>
       <el-form-item>
         <el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
         <el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
@@ -38,11 +39,8 @@
       :columns="NurseLogColumns"
       :columns="NurseLogColumns"
       :queryParams="queryParams"
       :queryParams="queryParams"
       @detail="openDetail"
       @detail="openDetail"
-    >
-      <template #pre="{scope}">
-        <el-button type="primary" link @click="openForm(scope)" v-hasPermi="['nursing-log:extend']">补录</el-button>
-      </template>
-    </Table2>
+      @del="handleDelete"
+    />
     <!-- 分页 -->
     <!-- 分页 -->
     <Pagination
     <Pagination
       :total="total"
       :total="total"
@@ -51,25 +49,26 @@
       @pagination="getList"
       @pagination="getList"
     />
     />
 
 
-    <Form ref="formRef" />
     <Detail ref="detailRef" />
     <Detail ref="detailRef" />
   </ContentWrap>
   </ContentWrap>
 </template>
 </template>
 <script setup lang="ts">
 <script setup lang="ts">
-import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
-import { getNursingLogPage } from '@/api/elderly/nursing'
-import Form from './Form.vue';
+import { getNursingLogPage, deleteNursingLog } from '@/api/elderly/nursing'
 import Detail from './Detail.vue';
 import Detail from './Detail.vue';
 import { NurseLogColumns } from '../column'
 import { NurseLogColumns } from '../column'
-import { formatTime } from '@/utils';
+import { ElMessageBox } from 'element-plus'
+import { useUserStore } from '@/store/modules/user'
+const userStore = useUserStore()
+
 defineOptions({ name: 'NursingLog' })
 defineOptions({ name: 'NursingLog' })
+const message = useMessage()
 const queryParams = reactive({
 const queryParams = reactive({
   pageNo: 1,
   pageNo: 1,
   pageSize: 10,
   pageSize: 10,
   elderName: '',
   elderName: '',
-  nursingDate: [formatTime(new Date(new Date().getFullYear(), new Date().getMonth(), 1), 'yyyy-MM-dd 00:00:00'), formatTime(new Date(new Date().getFullYear(), new Date().getMonth() + 1, 0), 'yyyy-MM-dd 23:59:59')]
+  tenantIds: userStore.orgTenantId,
+  nurseDate: []
 })
 })
-const nursingType = ref(1)
 const loading = ref(true) // 列表的加载中
 const loading = ref(true) // 列表的加载中
 const total = ref(0) // 列表的总页数
 const total = ref(0) // 列表的总页数
 const list = ref([]) // 列表的数据
 const list = ref([]) // 列表的数据
@@ -83,7 +82,6 @@ const handleQuery = () => {
 
 
 /** 重置按钮操作 */
 /** 重置按钮操作 */
 const resetQuery = () => {
 const resetQuery = () => {
-  nursingType.value = 1
   queryFormRef.value.resetFields()
   queryFormRef.value.resetFields()
   handleQuery()
   handleQuery()
 }
 }
@@ -100,31 +98,24 @@ const getList = async () => {
   }
   }
 }
 }
 
 
-const formRef = ref()
-const openForm = (row:{}) => {
-  formRef.value.open(row)
-}
-
 const detailRef = ref()
 const detailRef = ref()
 const openDetail = (row:{}) => {
 const openDetail = (row:{}) => {
-  detailRef.value.open(row, row.id)
-}
-
-const disabledDate = (time) => {
-  if(nursingType.value == 1){
-    // 当前月第一天,当前月最后一天
-    const currentDate = new Date();
-    const firstDay = new Date(currentDate.getFullYear(), currentDate.getMonth(), 1);
-    const lastDay = new Date(currentDate.getFullYear(), currentDate.getMonth() + 1, 0);
-
-    return time < firstDay || time > lastDay
-  }
+  detailRef.value.open(row)
 }
 }
 
 
-const handleChangeType = () => {
-  if(nursingType.value == 1){
-    queryParams.nursingDate = [formatTime(new Date(new Date().getFullYear(), new Date().getMonth(), 1), 'yyyy-MM-dd 00:00:00'), formatTime(new Date(new Date().getFullYear(), new Date().getMonth() + 1, 0), 'yyyy-MM-dd 23:59:59')]
-  }
+const handleDelete = (id: number) => {
+  ElMessageBox.confirm('确定删除该护理日志?', '提示', {
+    confirmButtonText: '确 认',
+    cancelButtonText: '取 消'
+  })
+    .then(async () => {
+      const res = await deleteNursingLog(id)
+      if (res) {
+        message.success('删除成功')
+        await getList()
+      }
+    })
+    .catch(() => {})
 }
 }
 
 
 onMounted(()=>{
 onMounted(()=>{

+ 9 - 9
src/views/elderly/nursing/types.ts

@@ -86,19 +86,19 @@ export interface planType {
     bedName: string
     bedName: string
     nurseLevelName: string
     nurseLevelName: string
     effectiveDate: string
     effectiveDate: string
-    diet: string
-    dietaryType: string
-    riskPrevention: string
-    nursingCharacteristics: string
-    dietaryTaboo: string[]
+    // diet: string
+    // dietaryType: string
+    // riskPrevention: string
+    // nursingCharacteristics: string
+    // dietaryTaboo: string[]
     items: itemsType[]
     items: itemsType[]
     extraItems: itemsType[]
     extraItems: itemsType[]
   }
   }
   dataRule: FormRules
   dataRule: FormRules
-  tempCopyForm: {
-    items: itemsType[]
-    extraItems: itemsType[]
-  }
+  // tempCopyForm: {
+  //   items: itemsType[]
+  //   extraItems: itemsType[]
+  // }
 }
 }
 
 
 export interface itemsType {
 export interface itemsType {