Form.vue 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. <template>
  2. <Dialog v-model="dialogVisible" title="护理日志补录" width="80%" @close="handleClosed">
  3. <el-form :model="dataForm" ref="formRef">
  4. <el-row :gutter="20">
  5. <el-col :span="4" :xs="24">
  6. <el-form-item label="长者姓名">{{ dataForm.elderName }}</el-form-item>
  7. </el-col>
  8. <el-col :span="4" :xs="24">
  9. <el-form-item label="床位号">{{ dataForm.bedName }}</el-form-item>
  10. </el-col>
  11. <el-col :span="4" :xs="24">
  12. <el-form-item label="护理等级">{{ dataForm.nursingGrade }}</el-form-item>
  13. </el-col>
  14. <el-col :span="4" :xs="24">
  15. <el-form-item label="护理日期">{{ dataForm.nursingDate }}</el-form-item>
  16. </el-col>
  17. <el-col :span="4" :xs="24">
  18. <el-form-item label="护理人员">
  19. <el-select v-model="dataForm.caregiverId" placeholder="请选择" @change="handleChangeNurse">
  20. <el-option v-for="item in nurseList" :key="item.id" :label="item.nickname" :value="item.id"/>
  21. </el-select>
  22. </el-form-item>
  23. </el-col>
  24. </el-row>
  25. <el-table :data="dataForm.nursingLogRecords" border height="55vh">
  26. <el-table-column label="项目分类" prop="categoryName" width="180" align="center"/>
  27. <el-table-column label="项目名称" prop="nurseItemName" width="150" align="center"/>
  28. <el-table-column label="频次" prop="frequency" width="120" align="center"/>
  29. <el-table-column label="形式" prop="frequencyUnit" width="120" align="center">
  30. <template #default="scope">
  31. {{ getDictLabel(DICT_TYPE.NURSING_FREQUENCY_TYPE, scope.row.frequencyUnit) }}
  32. </template>
  33. </el-table-column>
  34. <el-table-column label="补录时间" align="center">
  35. <template #default="scope">
  36. <el-scrollbar>
  37. <div class="flex-time">
  38. <span v-for="(item, index) in scope.row.records" :key="index" class="flex-time mr2 mb2">
  39. <TgTimePicker style="width: 120px;" v-model="item.tempTime" @change="handleChange(item)"/>
  40. <Icon icon="ep:circle-close-filled" class="ml1 icon" @click="handleDel(scope.row, index)"/>
  41. </span>
  42. <el-button type="primary" @click="handleAdd(scope.row)">添加</el-button>
  43. </div>
  44. </el-scrollbar>
  45. </template>
  46. </el-table-column>
  47. </el-table>
  48. </el-form>
  49. <template #footer>
  50. <el-button @click="handleClosed">关闭</el-button>
  51. <el-button v-loading="formLoading" type="primary" @click="submitForm">确定</el-button
  52. >
  53. </template>
  54. </Dialog>
  55. </template>
  56. <script setup lang="ts">
  57. import { DICT_TYPE, getDictLabel } from '@/utils/dict'
  58. import { supplementNursingLog, getNurseGroupByElderId, getNursingLogDetails } from '@/api/elderly/nursing'
  59. import { formatTime } from '@/utils'
  60. defineOptions({ name: 'NurseLogForm' })
  61. const message = useMessage() // 消息弹窗
  62. const { t } = useI18n() // 国际化
  63. const dialogVisible = ref(false)
  64. const formLoading = ref(false)
  65. const state = reactive({
  66. dataForm:{
  67. id: '',
  68. elderId: '',
  69. elderName: '',
  70. nursingDate: '',
  71. count: '',
  72. bedName: '',
  73. nursingGrade: '',
  74. caregiverId: '',
  75. caregiver: '',
  76. nursingLogRecords: []
  77. }
  78. })
  79. const { dataForm } = toRefs(state)
  80. const resetFormField = reactive({ ...dataForm.value })
  81. const formRef = ref()
  82. const nurseList = ref<{id: string, nickname: string}[]>([])
  83. /** 打开弹窗 */
  84. const open = async (row) => {
  85. dialogVisible.value = true
  86. // 根据长者获取护理分组人员
  87. const res = await getNurseGroupByElderId(row.elderId)
  88. nurseList.value = res
  89. dataForm.value.elderName = row.elderName
  90. dataForm.value.bedName = row.bedName
  91. dataForm.value.nursingGrade = row.nursingGrade
  92. dataForm.value.elderId = row.elderId
  93. dataForm.value.nursingDate = row.nursingDate
  94. dataForm.value.id = row.id
  95. }
  96. defineExpose({ open }) // 提供 open 方法,用于打开弹窗
  97. const handleAdd = (row) => {
  98. row.records.push({
  99. ...row,
  100. records: undefined,
  101. nursingLogId: dataForm.value.id,
  102. caregiverId: dataForm.value.caregiverId,
  103. caregiver: dataForm.value.caregiver,
  104. nursingPlanItemId: row.id,
  105. tempTime: '',
  106. id: undefined
  107. })
  108. }
  109. const handleDel = (row, index: number) => {
  110. row.records.splice(index, 1)
  111. }
  112. const handleChangeNurse = (val) => {
  113. const obj: any = nurseList.value.find(item => item.id == val)
  114. dataForm.value.caregiver = obj.nickname
  115. getDetail()
  116. }
  117. const handleChange = (item) => {
  118. item.nursingTime = Date.parse(dataForm.value.nursingDate + ' ' + item.tempTime)
  119. }
  120. const handleClosed = () => {
  121. dataForm.value = { ...resetFormField }
  122. dialogVisible.value = false
  123. }
  124. const getDetail = async () => {
  125. // 获取补录详情
  126. const result = await getNursingLogDetails({elderId: dataForm.value.elderId, nursingLogId: dataForm.value.id})
  127. result.map(item=>{
  128. item.records.map(r => {
  129. r.id = undefined
  130. if(r.nursingTime){
  131. r.tempTime = formatTime(new Date(r.nursingTime), 'HH:mm:ss')
  132. }
  133. })
  134. })
  135. dataForm.value.nursingLogRecords = result
  136. }
  137. /** 提交表单 */
  138. const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
  139. const submitForm = async () => {
  140. // 校验表单
  141. if (!formRef.value) return
  142. const valid = await formRef.value.validate()
  143. if (!valid) return
  144. // 提交请求
  145. formLoading.value = true
  146. try {
  147. const params = JSON.parse(JSON.stringify(dataForm.value))
  148. const arr = []
  149. params.nursingLogRecords.map(item=>{
  150. if(item.records && item.records.length > 0){
  151. arr.push(...item.records)
  152. }
  153. })
  154. params.nursingLogRecords = arr
  155. const res = await supplementNursingLog(params)
  156. if (res) {
  157. message.success(t('common.updateSuccess'))
  158. handleClosed()
  159. // 发送操作成功的事件
  160. emit('success')
  161. }
  162. } finally {
  163. formLoading.value = false
  164. }
  165. }
  166. </script>
  167. <style lang="scss" scoped>
  168. .flex-time{
  169. display: flex;
  170. align-items: center;
  171. flex-wrap: wrap;
  172. .icon{
  173. cursor: pointer;
  174. }
  175. }
  176. </style>