AddForm.vue 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379
  1. <template>
  2. <el-drawer
  3. v-model="dialogVisible"
  4. :title="title"
  5. resizable
  6. :close-on-click-modal="false"
  7. :close-on-press-escape="false"
  8. :destroy-on-close="true"
  9. size="70%"
  10. :before-close="handleClosed"
  11. >
  12. <div class="attack-risk-form">
  13. <h1 class="form-title">委托代理人确认表(附件)</h1>
  14. <!-- 基本信息 -->
  15. <el-row :gutter="40">
  16. <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12" class="row">
  17. <text>长者姓名</text>
  18. <search-the-elderly
  19. ref="selectElderRef"
  20. :disabled="isDetail"
  21. @update_elder="elderUp"
  22. v-model="dataForm.elderName"
  23. :tId="dataForm.tenantId"
  24. />
  25. </el-col>
  26. <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12" class="row">
  27. <text>档案号</text>
  28. <el-input v-if="!isDetail" v-model="dataForm.contractNumber" disabled />
  29. <el-text v-else disabled="">{{ dataForm.contractNumber }}</el-text>
  30. </el-col>
  31. </el-row>
  32. <el-row :gutter="40">
  33. <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12" class="row">
  34. <text>入院日期</text>
  35. <el-input
  36. v-if="!isDetail"
  37. :model-value="
  38. dayjs(dataForm.checkInTime).format('YYYY-MM-DD') == 'Invalid Date'
  39. ? ''
  40. : dayjs(dataForm.checkInTime).format('YYYY-MM-DD')
  41. "
  42. disabled
  43. />
  44. <el-text v-else disabled="">{{
  45. dayjs(dataForm.checkInTime).format('YYYY-MM-DD')
  46. }}</el-text>
  47. </el-col>
  48. <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12" class="row">
  49. <text>床位号</text>
  50. <el-input v-if="!isDetail" v-model="dataForm.bedNumber" disabled />
  51. <el-text v-else disabled="">{{ dataForm.bedNumber }}</el-text>
  52. </el-col>
  53. </el-row>
  54. <el-row :gutter="40">
  55. <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12" class="row">
  56. <text>记录人</text>
  57. <el-input :disabled="isDetail" v-model="form.recorder" />
  58. </el-col>
  59. <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12" class="row">
  60. <text>记录日期</text>
  61. <el-date-picker
  62. :disabled="isDetail"
  63. v-model="form.recordDate"
  64. type="date"
  65. style="width: 100%"
  66. />
  67. </el-col>
  68. </el-row>
  69. <!-- 内容区域 -->
  70. <div class="form-body">
  71. <DelegationAgentConfirmationBody
  72. ref="bodyRef"
  73. v-model="delegationAgentForm"
  74. :is-text-mode="isDetail"
  75. />
  76. </div>
  77. </div>
  78. <template #footer>
  79. <el-button @click="handleClosed">关闭</el-button>
  80. <el-button type="success" size="small" v-show="isDetail" @click="handlePrint"
  81. >打印/导出</el-button
  82. >
  83. <el-button
  84. style="margin-left: 22px; margin-right: 30px"
  85. v-loading="formLoading"
  86. type="primary"
  87. v-show="!isDetail"
  88. @click="submitForm"
  89. >确定</el-button
  90. >
  91. </template>
  92. </el-drawer>
  93. <Teleport to="body">
  94. <div v-if="isPrint" class="print-container">
  95. <div class="print-org-name">{{ orgName }}</div>
  96. <DelegationAgentConfirmationBody v-model="delegationAgentForm" :is-text-mode="true" />
  97. </div>
  98. </Teleport>
  99. </template>
  100. <script lang="ts" setup>
  101. import { ref, reactive, computed, nextTick } from 'vue'
  102. import dayjs from 'dayjs'
  103. import DelegationAgentConfirmationBody from '../components/DelegationAgentConfirmationBody.vue'
  104. import { useUserStore } from '@/store/modules/user'
  105. import { findLabelById } from '@/utils/dict'
  106. import {
  107. delegationAgentConfirmation_create,
  108. delegationAgentConfirmation_update,
  109. delegationAgentConfirmation_getById
  110. } from '@/api/elderly/contracts'
  111. const message = useMessage()
  112. const { t } = useI18n()
  113. const userStore = useUserStore()
  114. const title = ref('')
  115. const dialogVisible = ref(false)
  116. const formLoading = ref(false)
  117. const selectElderRef = ref()
  118. const bodyRef = ref()
  119. const isDetail = ref(false)
  120. const isPrint = ref(false)
  121. const orgName = computed(
  122. () =>
  123. findLabelById(userStore.getOrgTenant?.options || [], dataForm.value.tenantId) ||
  124. userStore.getTenantName ||
  125. ''
  126. )
  127. let dataForm = ref({
  128. id: undefined,
  129. elderName: '',
  130. elderId: '',
  131. bedNumber: '',
  132. checkInTime: '',
  133. contractNumber: '',
  134. tenantId: undefined
  135. })
  136. const elderUp = (e) => {
  137. dataForm.value.elderName = e.elderName
  138. dataForm.value.elderId = e.id
  139. dataForm.value.bedNumber = e.bedName || ''
  140. dataForm.value.checkInTime = e.checkInTime
  141. dataForm.value.contractNumber = e.contractNumber || e.fileNumber
  142. delegationAgentForm.value.elderName = e.elderName
  143. delegationAgentForm.value.elderGender = e.elderSex == 1 ? '男' : e.elderSex == 2 ? '女' : ''
  144. delegationAgentForm.value.elderAge = e.elderAge || ''
  145. delegationAgentForm.value.elderIdCardNo = e.idCard || ''
  146. }
  147. const delegationAgentForm = ref({
  148. elderName: '',
  149. elderGender: '',
  150. elderAge: '',
  151. elderIdCardNo: '',
  152. elderAddress: '',
  153. agentName: '',
  154. agentGender: '',
  155. agentIdCardNo: '',
  156. agentAddress: '',
  157. declarerName: '',
  158. representedName: '',
  159. relationship: '',
  160. elderSign: '',
  161. agentSign: '',
  162. signDate: ''
  163. })
  164. const form = reactive({
  165. recorder: '',
  166. recordDate: ''
  167. })
  168. const open = async (tenantId, id?: any, detail: boolean = false) => {
  169. resetForm()
  170. dialogVisible.value = true
  171. dataForm.value.tenantId = tenantId
  172. isDetail.value = detail
  173. if (id) {
  174. title.value = detail ? '详情-委托代理人确认表' : '编辑-委托代理人确认表'
  175. dataForm.value.id = id
  176. await loadDelegationAgentData(id)
  177. } else {
  178. title.value = '新增-委托代理人确认表'
  179. }
  180. }
  181. const loadDelegationAgentData = async (id: number) => {
  182. try {
  183. const res = await delegationAgentConfirmation_getById(id)
  184. if (res) {
  185. dataForm.value.elderName = res.elderName || ''
  186. dataForm.value.elderId = res.elderId || ''
  187. dataForm.value.bedNumber = res.bedNumber || ''
  188. form.recorder = res.recorder || ''
  189. form.recordDate = res.recordDate ? dayjs(res.recordDate).toDate() : ''
  190. if (res.content) {
  191. try {
  192. const contentData = JSON.parse(res.content)
  193. delegationAgentForm.value = { ...delegationAgentForm.value, ...contentData }
  194. } catch (e) {
  195. console.error('解析委托代理人确认表内容失败', e)
  196. }
  197. }
  198. await selectElderRef.value?.upData(res.elderName, res.elderId)
  199. }
  200. } catch (error) {
  201. message.error('加载数据失败')
  202. }
  203. }
  204. defineExpose({ open })
  205. const emit = defineEmits(['success'])
  206. const submitForm = async () => {
  207. if (formLoading.value) {
  208. return
  209. }
  210. formLoading.value = true
  211. try {
  212. const bodyForm = bodyRef.value?.form || delegationAgentForm.value
  213. const content = JSON.stringify({ ...bodyForm })
  214. const tempParams = {
  215. id: dataForm.value.id,
  216. elderId: dataForm.value.elderId,
  217. elderName: dataForm.value.elderName,
  218. bedNumber: dataForm.value.bedNumber,
  219. recorder: form.recorder,
  220. recordDate: form.recordDate ? dayjs(form.recordDate).format('YYYY-MM-DD') : '',
  221. content: content,
  222. signYi: bodyForm.elderSign || '',
  223. signBing: bodyForm.agentSign || '',
  224. signDate: bodyForm.signDate || '',
  225. tenantId: dataForm.value.tenantId
  226. }
  227. let res
  228. if (dataForm.value.id) {
  229. res = await delegationAgentConfirmation_update(tempParams)
  230. } else {
  231. res = await delegationAgentConfirmation_create(tempParams)
  232. }
  233. if (res) {
  234. message.success(dataForm.value.id ? t('common.updateSuccess') : t('common.createSuccess'))
  235. dialogVisible.value = false
  236. emit('success')
  237. }
  238. } finally {
  239. setTimeout(() => {
  240. formLoading.value = false
  241. }, 500)
  242. }
  243. }
  244. const resetForm = () => {
  245. dataForm.value = {
  246. id: undefined,
  247. elderName: '',
  248. elderId: '',
  249. bedNumber: '',
  250. checkInTime: '',
  251. contractNumber: '',
  252. tenantId: undefined
  253. }
  254. form.recorder = ''
  255. form.recordDate = ''
  256. delegationAgentForm.value = {
  257. elderName: '',
  258. elderGender: '',
  259. elderAge: '',
  260. elderIdCardNo: '',
  261. elderAddress: '',
  262. agentName: '',
  263. agentGender: '',
  264. agentIdCardNo: '',
  265. agentAddress: '',
  266. declarerName: '',
  267. representedName: '',
  268. relationship: '',
  269. elderSign: '',
  270. agentSign: '',
  271. signDate: ''
  272. }
  273. }
  274. const handleClosed = () => {
  275. dialogVisible.value = false
  276. resetForm()
  277. }
  278. const handlePrint = async () => {
  279. isPrint.value = true
  280. await nextTick()
  281. await new Promise((resolve) => setTimeout(resolve, 1500))
  282. window.print()
  283. setTimeout(() => {
  284. isPrint.value = false
  285. }, 500)
  286. }
  287. </script>
  288. <style scoped lang="scss">
  289. .form-title {
  290. text-align: center;
  291. font-size: 20px;
  292. width: 100%;
  293. margin-bottom: 20px;
  294. }
  295. .attack-risk-form {
  296. max-width: 1200px;
  297. margin: 0 auto;
  298. background: #fff;
  299. .form-body {
  300. border: 1px solid #333;
  301. padding: 15px;
  302. }
  303. }
  304. .row {
  305. margin-bottom: 12px;
  306. display: flex;
  307. flex-direction: row;
  308. align-items: center;
  309. text {
  310. text-align: right;
  311. margin-right: 4px;
  312. width: 82px;
  313. }
  314. }
  315. </style>
  316. <style lang="scss">
  317. .print-container {
  318. display: none;
  319. }
  320. @media print {
  321. html,
  322. body {
  323. background: #fff !important;
  324. margin: 0 !important;
  325. padding: 0 !important;
  326. overflow: visible !important;
  327. }
  328. body > *:not(.print-container) {
  329. display: none !important;
  330. }
  331. body > .print-container {
  332. display: block !important;
  333. }
  334. .print-container .print-org-name {
  335. text-align: start;
  336. font-size: 14px;
  337. margin-bottom: 12px;
  338. }
  339. .print-container > *:not(.print-org-name) {
  340. width: 210mm !important;
  341. max-width: none !important;
  342. margin: 0 !important;
  343. padding: 0 !important;
  344. box-sizing: border-box !important;
  345. }
  346. @page {
  347. size: 210mm 297mm;
  348. margin: 16mm;
  349. }
  350. }
  351. </style>