RetreatForm.vue 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  1. <template>
  2. <Dialog
  3. @close="dialogVisible = false"
  4. style="min-width: 46vw; max-width: 100vw"
  5. v-model="dialogVisible"
  6. title="退住转离住"
  7. class="elderly-info-bak"
  8. noPaddingEL="elderly-info-bak"
  9. >
  10. <el-form ref="formRef" :model="dataForm" :rules="dataRule" :label-width="labelWidth">
  11. <div class="info-wrap">
  12. <el-row>
  13. <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
  14. <el-form-item label="长者姓名:" prop="elderName">
  15. <el-text>{{ dataForm.elderName || '' }}</el-text>
  16. </el-form-item>
  17. </el-col>
  18. <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
  19. <el-form-item label="床位号:" prop="bedName">
  20. <el-text>{{ dataForm.bedName || '' }}</el-text>
  21. </el-form-item>
  22. </el-col>
  23. </el-row>
  24. <el-row>
  25. <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
  26. <el-form-item prop="retreatDate" label="退住日期" label-suffix="*">
  27. <template #label>
  28. <div class="flex">
  29. 退住日期
  30. <el-icon>
  31. <el-tooltip
  32. class="item"
  33. effect="dark"
  34. content="该日期后不再生成护理计划"
  35. placement="top-start"
  36. >
  37. <InfoFilled />
  38. </el-tooltip>
  39. </el-icon>
  40. </div>
  41. </template>
  42. <TgDatePicker
  43. v-model="dataForm.retreatDate"
  44. type="date"
  45. placeholder="请选择日期"
  46. />
  47. </el-form-item>
  48. </el-col>
  49. <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
  50. <el-form-item label="费用截止日期" prop="costDeadline" label-suffix="*">
  51. <template #label>
  52. <div class="flex">
  53. 费用截止日期
  54. <el-icon>
  55. <el-tooltip
  56. class="item"
  57. effect="dark"
  58. content="请选择退住当天或前一天"
  59. placement="top-start"
  60. >
  61. <InfoFilled />
  62. </el-tooltip>
  63. </el-icon>
  64. </div>
  65. </template>
  66. <TgDatePicker
  67. v-model="dataForm.costDeadline"
  68. type="date"
  69. placeholder="请选择日期"
  70. />
  71. </el-form-item>
  72. </el-col>
  73. </el-row>
  74. <el-row>
  75. <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
  76. <el-form-item label="退住原因" prop="retreatReason">
  77. <TgSelect
  78. v-model="dataForm.retreatReason"
  79. placeholder="请选择"
  80. :list="getDictOptions(DICT_TYPE.BACK_CAUSE_ARR)"
  81. >
  82. <el-option
  83. v-for="(item, index) in getStrDictOptions(DICT_TYPE.BACK_CAUSE_ARR)"
  84. :key="index"
  85. :label="item.label"
  86. :value="item.value"
  87. />
  88. </TgSelect>
  89. </el-form-item>
  90. </el-col>
  91. <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
  92. <el-form-item label="退住描述" prop="retreatDescribe">
  93. <TgInput
  94. v-model="dataForm.retreatDescribe"
  95. type="textarea"
  96. placeholder="请输入退住描述"
  97. :rows="3"
  98. />
  99. </el-form-item>
  100. </el-col>
  101. </el-row>
  102. </div>
  103. </el-form>
  104. <template #footer>
  105. <el-button @click="handleClosed">关闭</el-button>
  106. <el-button v-loading="formLoading" type="primary" @click="submitForm">确定</el-button>
  107. </template>
  108. </Dialog>
  109. </template>
  110. <script lang="ts" setup>
  111. import { computed, reactive, ref } from 'vue'
  112. import { useMediaQuery } from '@vueuse/core'
  113. import { retreatSimpleCreate } from '@/api/elderly/elder/outwardRegustration'
  114. import { DICT_TYPE, getDictOptions, getStrDictOptions } from '@/utils/dict'
  115. import { FormRules } from 'element-plus'
  116. const message = useMessage() // 消息弹窗
  117. const { t } = useI18n() // 国际化
  118. const dialogVisible = ref(false) // 弹窗
  119. const formRef = ref() // 表单 Ref
  120. const formLoading = ref(false) // 表单的加载中:提交的按钮禁用
  121. const dataForm = reactive({
  122. elderName: '',
  123. bedName: '',
  124. retreatDate: '',
  125. costDeadline: '',
  126. retreatReason: '',
  127. retreatDescribe: '',
  128. elderlyId: undefined,
  129. tempOutId: undefined
  130. })
  131. // 计算窗口大小
  132. const currentWidth = useMediaQuery('(max-width: 800px)')
  133. // 计算文字大小
  134. const labelWidth = computed(() => {
  135. return currentWidth.value ? '100px' : '130px'
  136. })
  137. // 表单规则
  138. const dataRule = reactive<FormRules>({
  139. retreatDate: [{ required: true, message: '退住日期不能为空', trigger: 'change' }],
  140. costDeadline: [{ required: true, message: '费用截止日期不能为空', trigger: 'change' }],
  141. retreatReason: [{ required: true, message: '退住原因不能为空', trigger: 'change' }]
  142. })
  143. /** 打开弹窗 */
  144. const open = (row) => {
  145. dataForm.elderName = row.elderName
  146. dataForm.bedName = row.bedName
  147. dataForm.retreatDate = row.retreatDate
  148. dataForm.costDeadline = row.costDeadline
  149. dataForm.retreatReason = row.retreatReason
  150. dataForm.retreatDescribe = row.retreatDescribe
  151. dataForm.elderlyId = row.elderId
  152. dataForm.tempOutId = row.id
  153. dialogVisible.value = true
  154. console.log('dataForm', dataForm)
  155. }
  156. defineExpose({ open }) // 提供 open 方法,用于打开弹窗
  157. /** 提交表单 */
  158. const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
  159. const submitForm = async () => {
  160. if (formLoading.value) {
  161. return
  162. }
  163. formLoading.value = true
  164. try {
  165. // 校验表单
  166. if (!formRef.value) return
  167. const valid = await formRef.value.validate()
  168. if (!valid) return
  169. // 退住原因转为汉字后提交
  170. const reasonLabel = getStrDictOptions(DICT_TYPE.BACK_CAUSE_ARR).find(
  171. (item) => item.value === dataForm.retreatReason
  172. )?.label
  173. // 发起退住申请
  174. const res = await retreatSimpleCreate({
  175. retreatDate: dataForm.retreatDate,
  176. costDeadline: dataForm.costDeadline,
  177. elderlyId: dataForm.elderlyId,
  178. retreatReason: reasonLabel || dataForm.retreatReason,
  179. retreatDescribe: dataForm.retreatDescribe,
  180. tempOutId: dataForm.tempOutId
  181. })
  182. if (res) {
  183. message.success(t('common.updateSuccess'))
  184. handleClosed()
  185. // 发送操作成功的事件
  186. emit('success')
  187. }
  188. } catch {} finally {
  189. setTimeout(() => {
  190. formLoading.value = false
  191. }, 500)
  192. }
  193. }
  194. /** 重置表单 */
  195. const resetForm = () => {
  196. dataForm.elderName = ''
  197. dataForm.bedName = ''
  198. dataForm.retreatDate = ''
  199. dataForm.costDeadline = ''
  200. dataForm.retreatReason = ''
  201. dataForm.retreatDescribe = ''
  202. dataForm.elderlyId = undefined
  203. dataForm.tempOutId = undefined
  204. formRef.value?.resetFields()
  205. }
  206. // 关闭表单
  207. const handleClosed = () => {
  208. dialogVisible.value = false
  209. resetForm()
  210. }
  211. </script>
  212. <style lang="scss" scoped>
  213. .elderly-info-bak {
  214. .el-form {
  215. padding: 15px !important;
  216. }
  217. .info-wrap {
  218. margin: 15px;
  219. }
  220. @media (max-width: 1200) {
  221. :deep(.el-form-item--default .el-form-item__label) {
  222. line-height: 0 !important;
  223. }
  224. }
  225. }
  226. </style>