Bladeren bron

Merge branch 'master' of http://47.107.245.0:3000/xiongxing/kyj-yanglao-web-new

unknown 3 maanden geleden
bovenliggende
commit
7be34c8817

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

@@ -307,11 +307,26 @@ export const delNurseGroup = (id) => {
 // 获取护理日志分页
 export const getNursingLogPage = (data) => {
   return request.get({
-    url: `elderly/nursingLog/page`,
+    url: `elderly-nursing-log/page`,
     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) => {
   return request.post({

+ 3 - 2
src/api/material/stockSearch/index.ts

@@ -10,8 +10,9 @@ export const materialStockSearchPage = (params) => {
 
 // 库存流水查询详情
 export const materialStockFlowDetail = (params) => {
-  return request.get({
-    url: 'material-io/stats/inventory/flow?inboundItemId=' + params.inboundItemId + '&month=' + params.month
+  return request.post({
+    url: 'material-io/stats/inventory/flow',
+    data: params
   })
 }
 

+ 4 - 0
src/views/elderly/elder/price-change/Form.vue

@@ -51,6 +51,10 @@ const submitForm = async () => {
     if(!valid){
       return
     }
+    if(dataForm.priceChangeList.length == 0){
+      message.error('请添加变更项目')
+      return
+    } 
     const res = await priceChangeCreate(dataForm)
     if (res) {
       message.success(t('common.updateSuccess'))

+ 1 - 9
src/views/elderly/nursing/column.ts

@@ -128,16 +128,8 @@ export const NurseLogColumns = reactive([
     label: '床位',
     field: 'bedName'
   },
-  {
-    label: '护理日期',
-    field: 'nursingDate'
-  },
-  {
-    label: '护理员',
-    field: 'creator'
-  },
   {
     label: '护理等级',
-    field: 'nursingGrade'
+    field: 'nurseLevelName'
   },
 ])

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

@@ -50,92 +50,16 @@
             </el-form-item>
           </el-col>
         </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 class="info">
         <div class="info-title">护理项目</div>
         <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">
             <Icon icon="ep:zoom-in" class="mr-5px" />添加项目
           </el-button>
         </span>
       </div>
       <div class="info-wrap">
-<!--        <span>护理套餐包</span>-->
         <el-row>
           <el-col
             :xs="24"
@@ -146,130 +70,17 @@
             v-for="(p, i) in dataForm.items"
             :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-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>
     </el-form>
     <template #footer>
@@ -280,26 +91,22 @@
     </template>
   </Dialog>
   <lifeItem ref="itemRef" @success="getItemList" />
-  <EvaluationDetail ref="reportRef" />
 </template>
 
 <script setup lang="ts">
-import { DICT_TYPE, getDictOptions, getIntDictOptions, getStrDictOptions } from '@/utils/dict'
 import {
   createNursingPlan,
   updateNursingPlan,
-  copyNursingPlan,
   getNursingPlanById,
-  getListByElderId,
   findNurseItemListByName
 } from '@/api/elderly/nursing'
-import EvaluationDetail from '@/views/elderly/assess/synthetic-ability/Detail.vue'
 import lifeItem from './life-item-dialog.vue'
-import { formatNum } from '@/utils/formatter'
 import { planType } from '../types'
+
 defineOptions({ name: 'LifeCarePlanForm' })
-const message = useMessage() // 消息弹窗
+
 const { t } = useI18n() // 国际化
+const message = useMessage() // 消息弹窗
 const dialogVisible = ref(false)
 const state = reactive<planType>({
   dataForm: {
@@ -309,66 +116,44 @@ const state = reactive<planType>({
     bedName: '',
     nurseLevelName: '',
     effectiveDate: '',
-    diet: '',
-    dietaryType: '',
-    riskPrevention: '',
-    nursingCharacteristics: '',
-    dietaryTaboo: [],
     items: [],
-    extraItems: []
+    extraItems: [],
   },
   dataRule: {
     elderId: [{ 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 route = useRoute()
 const formLoading = ref(false)
 const isDetail = ref(false)
+
 // 弹窗标题
 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=''
   dialogVisible.value = true
   isDetail.value = detail
-  isCopy.value = copy
   if (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) => {
       item.checked = true
-      if(copy){
-        // 清空planId
-        item.nursingPlanId = ''
-      }
+    })
+    res.extraItems.map((item) => {
+      item.checked = true
     })
     // 匹配额外项目价格
     dataForm.value = res
     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 方法,用于打开弹窗
@@ -376,16 +161,13 @@ defineExpose({ open }) // 提供 open 方法,用于打开弹窗
 const formatExtraItem = async () => {
   if (dataForm.value.extraItems.length) {
     const res = await findNurseItemListByName({
-      categoryTypeName: route.path.indexOf('medical-care-plan') > -1 ? '医疗护理' : '生活护理',
+      categoryTypeName: '生活护理',
       nurseItemName: ''
     })
     dataForm.value.extraItems.map((e) => {
       res.map((r) => {
         if (e.nurseItemId == r.id) {
           e.price = r.price
-          if(isCopy.value){
-            e.nursingPlanId = ''
-          }
         }
       })
     })
@@ -397,96 +179,6 @@ const handleClosed = () => {
   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 handleAdd = () => {
   itemRef.value.open(dataForm.value.items)
@@ -513,59 +205,6 @@ const handleElder = async (item) => {
   dataForm.value.elderName = item.elderName
   dataForm.value.bedName = item.bedName
   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) => {
@@ -574,10 +213,6 @@ const handleChangeCheckBox = (val, item) => {
     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 emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
@@ -591,15 +226,10 @@ const submitForm = async () => {
     const params = {
       type: route.path.indexOf('medical-care-plan') > -1 ? 2 : 1, // 2:医疗护理 1 生活护理,
       ...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) {
       message.success(t('common.updateSuccess'))
       handleClosed()

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

@@ -33,14 +33,7 @@
 
   <!-- 列表 -->
   <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
       v-loading="loading"
       :data="list"
@@ -50,6 +43,7 @@
       @edit="openForm"
       @detail="(arg) => openForm(arg, true)"
     />
+
     <!-- 分页 -->
     <Pagination
       :total="total"
@@ -64,13 +58,12 @@
 <script lang="ts" setup>
 import { getnursingPlanPage, getNursingLevelPage } from '@/api/elderly/nursing'
 import { LifeCarePlanColumns } from '../column'
-import Form from './Form.vue'
 import {useUserStore} from "@/store/modules/user";
-const userStore = useUserStore()
+import Form from './Form.vue'
+
 defineOptions({ name: 'LifeCarePlan' })
 
-const message = useMessage() // 消息弹窗
-const { t } = useI18n() // 国际化
+const userStore = useUserStore()
 const route = useRoute()
 
 const loading = ref(true) // 列表的加载中
@@ -81,7 +74,7 @@ const queryParams = reactive({
   pageSize: 10,
   nurseLevelId: undefined,
   bedId: undefined,
-  elderName: undefined,
+  elderName: "",
   tenantIds: userStore.orgTenantId,
   type: route.path.indexOf('medical-care-plan') > -1 ? 2 : 1, // 2:医疗护理 1 生活护理
 })
@@ -122,13 +115,6 @@ const currItem = ref({})
 const handleRowClick = (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 getNurseLevelList = async () => {

+ 94 - 283
src/views/elderly/nursing/nursing-log-list/Detail.vue

@@ -1,194 +1,44 @@
 <template>
   <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> -->
-      <div class="header-flex">
-        <div class="left">
-          <el-tag type="primary" effect="light" round>
-            {{ dataForm.elderName }} / {{dataForm.nursingGrade}} / {{ dataForm.bedName }}
-          </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 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-row>
       </div>
+      <el-table :data="records" height="60vh" :header-cell-style="(data) => tableHeaderColor(data) || {}">
+        <el-table-column label="护理日期" prop="nurseDate" />
+        <el-table-column label="护理员" prop="nurse" />
+        <el-table-column label="护理项目" prop="nursingItemName" />
+        <el-table-column label="图片">
+          <template #default="scope">
+            <div v-if="scope.row.image" class="image-list">
+              <el-image
+                v-for="(img, index) in scope.row.image.split(',').filter((item: string) => item)"
+                :key="index"
+                :src="img"
+                :preview-src-list="scope.row.image.split(',').filter((item: string) => item)"
+                :initial-index="Number(index)"
+                preview-teleported
+                fit="cover"
+                class="image-item"
+              />
+            </div>
+            <span v-else>-</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="备注" prop="remark" />
+        <el-table-column label="创建时间" prop="createTime" />
+        <el-table-column label="操作" width="80" v-hasPermi="['nursing-log-list:delete']">
+          <template #default="scope">
+            <el-button link type="danger" @click="handleDelete(scope.row.id)">删除</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
     </el-form>
     <template #footer>
       <el-button @click="handleClosed">关闭</el-button>
@@ -196,128 +46,75 @@
   </Dialog>
 </template>
 <script setup lang="ts">
-import { DICT_TYPE, getDictLabel, getDictOptions, getIntDictOptions } from '@/utils/dict'
-import { getNursingLogByTime, getNursingLogByItem } from '@/api/elderly/nursing'
+import { getNursingLogDetail, deleteNursingLog } from '@/api/elderly/nursing'
 import { tableHeaderColor } from '@/utils/table'
-import { formatTime } from '@/utils'
+import { ElMessageBox } from 'element-plus'
 defineOptions({ name: 'NurseLogDetail' })
-const message = useMessage() // 消息弹窗
-const { t } = useI18n() // 国际化
 const dialogVisible = ref(false)
-const formLoading = ref(false)
+const message = useMessage()
 
 const state = reactive({
-  dataForm: {
-    id: '',
+  header: {
     elderName: '',
     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 currentElderId = ref<number | null>(null)
+const dateRange = ref<string[]>([] as string[])
 
 /** 打开弹窗 */
-const open = async (row) => {
+const open = async (row: { elderId: number }, nurseDate: string[]) => {
   dialogVisible.value = true
-  dataForm.value = row
+  currentElderId.value = row.elderId
+  dateRange.value = nurseDate as string[]
+  await getDetail(row.elderId, dateRange.value)
+}
 
-  getList(row.id, 1)
+const getDetail = async (elderId: number, nurseDate: string[]) => {
+  const res = await getNursingLogDetail({ elderId, start: nurseDate[0], end: nurseDate[1] })
+  header.value = res.header || { ...resetHeader }
+  records.value = res.records || []
 }
+
 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 handleDelete = (id: number) => {
+  ElMessageBox.confirm('确定删除该护理记录?', '提示', {
+    confirmButtonText: '确 认',
+    cancelButtonText: '取 消'
+  })
+    .then(async () => {
+      const res = await deleteNursingLog(id)
+      if (res) {
+        message.success('删除成功')
+        if (currentElderId.value) {
+          await getDetail(currentElderId.value, dateRange.value)
+        }
+      }
+    })
+    .catch(() => {})
 }
 
 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
-}
-
-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)
+  currentElderId.value = null
 }
 
 </script>
 <style lang="scss" scoped>
-.header-flex{
-  display: flex;
-  align-items: center;
-  justify-content: space-between;
-  padding: 10px;
-  .right{
-    display: flex;
-    .group{
-      display: flex;
-      .column{
-        display: flex;
-        flex-direction: column;
-        align-items: center;
-        cursor: pointer;
-        img{
-          width: 16px;
-          height: 16px;
-        }
-      }
-    }
-  }
-  .blue{
-    color: var(--el-color-primary);
-  }
+.info-title{
+  font-weight: 600;
+  color: #303133;
+  margin: 10px 0 6px;
 }
 .info-wrap{
+  margin-bottom: 10px;
   .time-round{
     padding: 10px 0;
     margin: 8px;
@@ -327,6 +124,20 @@ const handleChangeType = (val) => {
     text-align: center;
   }
 }
+.header-item{
+  color: #606266;
+  padding-bottom: 10px;
+}
+.image-list{
+  display: flex;
+  flex-wrap: wrap;
+  gap: 6px;
+}
+.image-item{
+  width: 48px;
+  height: 48px;
+  border-radius: 4px;
+}
 .el-card{
   position: relative;
   .header{

+ 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>

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

@@ -9,20 +9,21 @@
       :inline="true"
       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 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 label="护理日期" prop="nursingDate">
+      <el-form-item label="护理日期" prop="nurseDate">
         <el-date-picker
           end-placeholder="结束日期"
           start-placeholder="开始日期"
           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-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
@@ -31,16 +32,14 @@
     </el-form>
   </ContentWrap>
   <ContentWrap>
-    <TabBarBtn />
     <Table2
       v-loading="loading"
       :data="list"
       :columns="NurseLogColumns"
       :queryParams="queryParams"
-      @detail="openDetail"
     >
-      <template #pre="{scope}">
-        <el-button type="primary" link @click="openForm(scope)" v-hasPermi="['nursing-log:extend']">补录</el-button>
+      <template #pre="{ scope }">
+        <el-button v-hasPermi="['nursing-log-list:detail']" link type="primary" @click="openDetail(scope)">查看</el-button>
       </template>
     </Table2>
     <!-- 分页 -->
@@ -51,25 +50,31 @@
       @pagination="getList"
     />
 
-    <Form ref="formRef" />
     <Detail ref="detailRef" />
   </ContentWrap>
 </template>
 <script setup lang="ts">
-import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
 import { getNursingLogPage } from '@/api/elderly/nursing'
-import Form from './Form.vue';
 import Detail from './Detail.vue';
 import { NurseLogColumns } from '../column'
-import { formatTime } from '@/utils';
+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: '',
-  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: getDefaultMonthRange()
 })
-const nursingType = ref(1)
 const loading = ref(true) // 列表的加载中
 const total = ref(0) // 列表的总页数
 const list = ref([]) // 列表的数据
@@ -83,8 +88,8 @@ const handleQuery = () => {
 
 /** 重置按钮操作 */
 const resetQuery = () => {
-  nursingType.value = 1
   queryFormRef.value.resetFields()
+  queryParams.nurseDate = getDefaultMonthRange()
   handleQuery()
 }
 
@@ -100,31 +105,9 @@ const getList = async () => {
   }
 }
 
-const formRef = ref()
-const openForm = (row:{}) => {
-  formRef.value.open(row)
-}
-
 const detailRef = ref()
 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
-  }
-}
-
-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')]
-  }
+  detailRef.value.open(row,queryParams.nurseDate)
 }
 
 onMounted(()=>{

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

@@ -86,19 +86,19 @@ export interface planType {
     bedName: string
     nurseLevelName: 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[]
     extraItems: itemsType[]
   }
   dataRule: FormRules
-  tempCopyForm: {
-    items: itemsType[]
-    extraItems: itemsType[]
-  }
+  // tempCopyForm: {
+  //   items: itemsType[]
+  //   extraItems: itemsType[]
+  // }
 }
 
 export interface itemsType {

+ 21 - 10
src/views/warehouses/stockSearch/index.vue

@@ -9,13 +9,15 @@
             <el-option v-for="w in warehouseOptions" :key="w.id" :label="w.storeName" :value="w.id" />
           </el-select>
         </el-form-item>
-        <el-form-item label="月份" prop="month">
+        <el-form-item label="月份范围" prop="months">
           <el-date-picker
-            v-model="queryParams.month"
-            type="month"
+            v-model="queryParams.months"
+            type="monthrange"
             value-format="YYYY-MM"
-            placeholder="选择月份"
-            class="!w-180px"
+            range-separator="至"
+            start-placeholder="开始月份"
+            end-placeholder="结束月份"
+            class="!w-240px"
           />
         </el-form-item>
         <el-form-item label="关键字" prop="keyword">
@@ -101,13 +103,21 @@ const tableHeaderColor = () => ({
   fontWeight: '600',
 })
 
+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.toISOString().slice(0, 7)
+  return [format(start), format(end)]
+}
+
 // 搜索条件
 const queryParams = reactive({
   pageNo: 1,
   pageSize: 10,
   tenantIds: userStore.orgTenantId,
   storeId: '',
-  month: new Date().toISOString().slice(0, 7),
+  months: getDefaultMonthRange(),
   keyword: '',
 })
 
@@ -136,7 +146,7 @@ const getTableData = async () => {
     pageSize: queryParams.pageSize,
     tenantIds: queryParams.tenantIds,
     storeId: queryParams.storeId,
-    month: queryParams.month,
+    months: queryParams.months,
     keyword: queryParams.keyword,
   }
   try {
@@ -163,7 +173,7 @@ const handleSearch = () => {
 
 const handleReset = () => {
   queryParams.storeId = ''
-  queryParams.month = new Date().toISOString().slice(0, 7)
+  queryParams.months = getDefaultMonthRange()
   queryParams.keyword = ''
   queryParams.pageNo = 1
   queryParams.tenantIds = userStore.orgTenantId
@@ -182,14 +192,15 @@ const handleCurrentChange = (page) => {
 }
 
 const handleView = async(row) => {
-  if(!queryParams.month) {
+  const [startMonth] = queryParams.months || []
+  if (!startMonth) {
     ElMessage.error('请选择月份')
     return
   }
   try {
     const res = await materialStockFlowDetail({
       inboundItemId: row.inboundItemId,
-      month: queryParams.month,
+      months: queryParams.months,
     })
     currentStockDetail.value = res
     stockDialogVisible.value = true