ProcessForm.vue 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. <template>
  2. <el-form
  3. ref="formRef"
  4. :model="form"
  5. :rules="rules"
  6. label-width="120px"
  7. label-position="top"
  8. status-icon
  9. class="wait-elder-form"
  10. >
  11. <el-form-item label="长者姓名" prop="elderName" required>
  12. <div class="view-value">{{ form.elderName || '-' }}</div>
  13. </el-form-item>
  14. <el-form-item label="身份证号" prop="idCardNo" required>
  15. <div class="view-value">{{ form.idCardNo || '-' }}</div>
  16. </el-form-item>
  17. <el-form-item label="院区" prop="campus" required>
  18. <div class="view-value">{{ campusLabel(form.campus) }}</div>
  19. </el-form-item>
  20. <el-form-item label="近期生活状态(视频)" prop="lifeStatusVideo" required>
  21. <div class="view-files">
  22. <div v-if="!form.lifeStatusVideo.length" class="empty">-</div>
  23. <ul v-else>
  24. <li v-for="(item, index) in form.lifeStatusVideo" :key="`life-${index}`">{{ getFileName(item) }}</li>
  25. </ul>
  26. </div>
  27. </el-form-item>
  28. <el-form-item label="行走情况(视频)" prop="walkingVideo" required>
  29. <div class="view-files">
  30. <div v-if="!form.walkingVideo.length" class="empty">-</div>
  31. <ul v-else>
  32. <li v-for="(item, index) in form.walkingVideo" :key="`walk-${index}`">{{ getFileName(item) }}</li>
  33. </ul>
  34. </div>
  35. </el-form-item>
  36. <el-form-item label="近半年内病历" prop="medicalRecord" required>
  37. <div class="view-files">
  38. <div v-if="!form.medicalRecord.length" class="empty">-</div>
  39. <ul v-else>
  40. <li v-for="(item, index) in form.medicalRecord" :key="`medical-${index}`">{{ getFileName(item) }}</li>
  41. </ul>
  42. </div>
  43. </el-form-item>
  44. <el-form-item label="身份证正反面" prop="idCardImages" required>
  45. <div class="view-files">
  46. <div v-if="!form.idCardImages.length" class="empty">-</div>
  47. <ul v-else>
  48. <li v-for="(item, index) in form.idCardImages" :key="`idimg-${index}`">{{ getFileName(item) }}</li>
  49. </ul>
  50. </div>
  51. </el-form-item>
  52. <el-form-item label="近期出院小结(视频)" prop="dischargeSummaryVideo">
  53. <div class="view-files">
  54. <div v-if="!form.dischargeSummaryVideo.length" class="empty">-</div>
  55. <ul v-else>
  56. <li v-for="(item, index) in form.dischargeSummaryVideo" :key="`discharge-${index}`">{{ getFileName(item) }}</li>
  57. </ul>
  58. </div>
  59. </el-form-item>
  60. </el-form>
  61. </template>
  62. <script setup lang="ts">
  63. import { getBusinessId } from '@/api/elderly/common'
  64. import { getBedChangeRecordById, getBedChangeRecordElderlyById } from '@/api/elderly/elder/bed-change'
  65. defineOptions({ name: 'BedChangeProcessForm' })
  66. const formRef = ref()
  67. const form = reactive({
  68. elderName: '',
  69. idCardNo: '',
  70. campus: '',
  71. lifeStatusVideo: [] as any[],
  72. walkingVideo: [] as any[],
  73. medicalRecord: [] as any[],
  74. idCardImages: [] as any[],
  75. dischargeSummaryVideo: [] as any[]
  76. })
  77. const rules = reactive({})
  78. const campusOptions = ref<{ label: string; value: string }[]>([])
  79. const parseToArray = (value: any) => {
  80. if (!value) return []
  81. if (Array.isArray(value)) return value
  82. if (typeof value === 'string') {
  83. try {
  84. const parsed = JSON.parse(value)
  85. return Array.isArray(parsed) ? parsed : []
  86. } catch (_e) {
  87. return []
  88. }
  89. }
  90. return []
  91. }
  92. const mapSourceToForm = (source: Record<string, any> = {}) => {
  93. form.elderName = source.elderName || source.name || ''
  94. form.idCardNo = source.idCardNo || source.idCard || ''
  95. form.campus = source.campus || source.campusId || ''
  96. form.lifeStatusVideo = parseToArray(source.lifeStatusVideo)
  97. form.walkingVideo = parseToArray(source.walkingVideo)
  98. form.medicalRecord = parseToArray(source.medicalRecord)
  99. form.idCardImages = parseToArray(source.idCardImages)
  100. form.dischargeSummaryVideo = parseToArray(source.dischargeSummaryVideo)
  101. }
  102. const campusLabel = (value: string) => {
  103. const item = campusOptions.value.find((it) => it.value === value)
  104. return item?.label || value || '-'
  105. }
  106. const getFileName = (file: any) => {
  107. return file?.name || file?.fileName || file?.url || '-'
  108. }
  109. const init = async (id?: string, _detail?: boolean, status?: string, elderly = undefined as any) => {
  110. if (elderly?.elderId) {
  111. const elderInfo = await getBedChangeRecordElderlyById(elderly.elderId)
  112. mapSourceToForm(elderInfo || {})
  113. }
  114. if (id) {
  115. const res = await getBedChangeRecordById(id, status, true)
  116. mapSourceToForm(res || {})
  117. }
  118. }
  119. const submitForm = async () => {
  120. return {
  121. valid: true,
  122. dataForm: { ...form }
  123. }
  124. }
  125. const resetForm = () => {
  126. form.elderName = ''
  127. form.idCardNo = ''
  128. form.campus = ''
  129. form.lifeStatusVideo = []
  130. form.walkingVideo = []
  131. form.medicalRecord = []
  132. form.idCardImages = []
  133. form.dischargeSummaryVideo = []
  134. formRef.value?.clearValidate?.()
  135. }
  136. const processType = ref()
  137. const getProcess = async (id, type, status) => {
  138. const res = await getBusinessId(id)
  139. await init(res.businessId, true, status)
  140. processType.value = type
  141. }
  142. const setTenantId = (_tId) => {}
  143. defineExpose({ init, submitForm, getProcess, resetForm, setTenantId })
  144. </script>
  145. <style lang="scss" scoped>
  146. .wait-elder-form {
  147. .view-value {
  148. min-height: 32px;
  149. line-height: 32px;
  150. padding: 0 11px;
  151. border: 1px solid var(--el-border-color);
  152. border-radius: 4px;
  153. background: var(--el-fill-color-blank);
  154. color: var(--el-text-color-primary);
  155. }
  156. .view-files {
  157. min-height: 32px;
  158. padding: 8px 11px;
  159. border: 1px solid var(--el-border-color);
  160. border-radius: 4px;
  161. background: var(--el-fill-color-blank);
  162. .empty {
  163. color: var(--el-text-color-secondary);
  164. }
  165. ul {
  166. margin: 0;
  167. padding-left: 18px;
  168. li {
  169. line-height: 24px;
  170. color: var(--el-text-color-primary);
  171. }
  172. }
  173. }
  174. }
  175. </style>