AddForm.vue 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821
  1. <template>
  2. <el-drawer v-model="dialogVisible" :title="title" size="90%" :before-close="handleClosed">
  3. <div class="assessment-form">
  4. <div class="form-header">
  5. <el-form :model="dataForm" :rules="rules" ref="formRef" label-width="80px">
  6. <el-row :gutter="20">
  7. <el-col :span="6">
  8. <el-form-item label="姓名" prop="elderName">
  9. <SelectElder
  10. v-model="dataForm.elderId"
  11. ref="selectElderRef" :tId="dataForm.tenantId" @elder="elderUp" :disabled="isDetail"
  12. />
  13. </el-form-item>
  14. </el-col>
  15. <el-col :span="6">
  16. <el-form-item label="年龄">
  17. <el-input v-model="dataForm.elderAge" disabled />
  18. </el-form-item>
  19. </el-col>
  20. <el-col :span="6">
  21. <el-form-item label="性别">
  22. <el-input v-model="dataForm.elderSex" disabled />
  23. </el-form-item>
  24. </el-col>
  25. <el-col :span="6">
  26. <el-form-item label="房号/床号">
  27. <el-input v-model="dataForm.bedName" disabled />
  28. </el-form-item>
  29. </el-col>
  30. </el-row>
  31. </el-form>
  32. </div>
  33. <!-- 危险因素评估表 -->
  34. <div class="risk-factors-section">
  35. <div class="section-title">危险因素评估</div>
  36. <table class="assessment-table">
  37. <thead>
  38. <tr>
  39. <th class="col-factor">危险因素</th>
  40. <th class="col-score-header">是</th>
  41. <th class="col-score-header">否</th>
  42. <th class="col-result">得分</th>
  43. </tr>
  44. </thead>
  45. <tbody>
  46. <tr v-for="(item, itemIndex) in riskFactors" :key="itemIndex">
  47. <td class="col-factor">{{ item.name }}</td>
  48. <td class="col-score-header">
  49. <el-radio-group v-model="form.assessment.scores[itemIndex]" :disabled="isDetail" @change="calculateTotal">
  50. <el-radio :label="item.yesScore">{{ item.yesScore }}分</el-radio>
  51. </el-radio-group>
  52. </td>
  53. <td class="col-score-header">
  54. <el-radio-group v-model="form.assessment.scores[itemIndex]" :disabled="isDetail" @change="calculateTotal">
  55. <el-radio :label="item.noScore">{{ item.noScore }}分</el-radio>
  56. </el-radio-group>
  57. </td>
  58. <td class="col-result">{{ form.assessment.scores[itemIndex] }}</td>
  59. </tr>
  60. </tbody>
  61. </table>
  62. <!-- 风险程度判断 -->
  63. <div class="risk-judgment">
  64. <span class="judgment-title">风险程度判断:</span>
  65. <el-radio-group v-model="form.riskLevel" :disabled="isDetail">
  66. <el-radio label="none">无风险:≤1分</el-radio>
  67. <el-radio label="low">低风险:2分</el-radio>
  68. <el-radio label="medium">中风险:3分</el-radio>
  69. <el-radio label="high">高风险:≥4分</el-radio>
  70. </el-radio-group>
  71. </div>
  72. </div>
  73. <!-- 评估记录 -->
  74. <div class="assessment-records">
  75. <div class="record-section">
  76. <div class="record-header">评估记录</div>
  77. <el-row :gutter="20">
  78. <el-col :span="6">
  79. <el-form-item label="评估日期:" label-width="120px">
  80. <el-date-picker
  81. v-model="form.assessment.assessDate"
  82. type="date"
  83. placeholder="选择日期"
  84. value-format="YYYY-MM-DD"
  85. :disabled="isDetail"
  86. style="width: 100%"
  87. />
  88. </el-form-item>
  89. </el-col>
  90. <el-col :span="6">
  91. <el-form-item label="评估人签名:" label-width="120px">
  92. <el-input v-model="form.assessment.assessor" :disabled="isDetail" />
  93. </el-form-item>
  94. </el-col>
  95. <el-col :span="6">
  96. <el-form-item label="评估总得分:" label-width="120px">
  97. <span class="score-text">{{ form.assessment.totalScore }} 分</span>
  98. </el-form-item>
  99. </el-col>
  100. <el-col :span="6">
  101. <el-form-item label="风险等级结果:" label-width="120px">
  102. <el-tag :type="getRiskTagType(form.riskLevel)">
  103. {{ getRiskText(form.riskLevel) }}
  104. </el-tag>
  105. </el-form-item>
  106. </el-col>
  107. </el-row>
  108. </div>
  109. </div>
  110. <!-- 预防措施 -->
  111. <div class="prevention-section">
  112. <div class="section-title">预防措施:</div>
  113. <el-checkbox-group v-model="form.preventionMeasures" :disabled="isDetail" class="prevention-group">
  114. <el-row :gutter="20">
  115. <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
  116. <el-checkbox label="加勤巡视,随时发现安全隐患">加勤巡视,随时发现安全隐患</el-checkbox>
  117. </el-col>
  118. <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
  119. <el-checkbox label="睡觉时拉起两侧床栏如需下床请将床栏放下,切勿翻越床栏">睡觉时拉起两侧床栏如需下床请将床栏放下,切勿翻越床栏</el-checkbox>
  120. </el-col>
  121. <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
  122. <el-checkbox label="常检查床的牢固性,发现不稳定时立即对床进行加固">常检查床的牢固性,发现不稳定时立即对床进行加固</el-checkbox>
  123. </el-col>
  124. <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
  125. <el-checkbox label="发现老人睡在床边缘时,应将老人调整到床中央">发现老人睡在床边缘时,应将老人调整到床中央</el-checkbox>
  126. </el-col>
  127. <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
  128. <el-checkbox label="翻身时叮嘱老人动作要慢,幅度要小确保安全">翻身时叮嘱老人动作要慢,幅度要小确保安全</el-checkbox>
  129. </el-col>
  130. <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
  131. <el-checkbox label="将生活用品、尿壶便器等放于易拿之处">将生活用品、尿壶便器等放于易拿之处</el-checkbox>
  132. </el-col>
  133. </el-row>
  134. </el-checkbox-group>
  135. </div>
  136. </div>
  137. <template #footer>
  138. <el-button @click="handleClosed">关闭</el-button>
  139. <el-button v-if="isDetail" type="success" @click="handleExport">打印</el-button>
  140. <el-button style="margin-left: 22px;margin-right: 30px" v-loading="formLoading" type="primary"
  141. v-show="!isDetail" @click="submitForm">确定</el-button>
  142. </template>
  143. </el-drawer>
  144. </template>
  145. <script lang="ts" setup>
  146. import { computed, ref, reactive } from 'vue'
  147. import dayjs from 'dayjs'
  148. import {
  149. fallPreventionCreate,
  150. fallPreventionGetById,
  151. fallPreventionUpdate
  152. } from "@/api/social-work";
  153. const message = useMessage()
  154. const { t } = useI18n()
  155. const title = ref('')
  156. const dialogVisible = ref(false)
  157. const formRef = ref()
  158. const selectElderRef = ref()
  159. const isDetail = ref(false)
  160. const formLoading = ref(false)
  161. let dataForm = ref({
  162. id: undefined,
  163. elderName: '',
  164. elderSex: '',
  165. elderAge: '',
  166. bedName: '',
  167. elderId: '',
  168. tenantId: undefined
  169. })
  170. const elderUp = (e: any) => {
  171. dataForm.value.elderName = e.elderName
  172. dataForm.value.elderId = e.id
  173. dataForm.value.elderSex = e.elderSex === 1 ? '男' : '女'
  174. dataForm.value.bedName = e.bedName || ''
  175. dataForm.value.elderAge = e.elderAge
  176. }
  177. // 危险因素定义
  178. const riskFactors = [
  179. { name: '最近一年曾有不明原因的坠床或跌倒经历', yesScore: 1, noScore: 0 },
  180. { name: '意识障碍', yesScore: 1, noScore: 0 },
  181. { name: '近期有癫痫病史', yesScore: 1, noScore: 0 },
  182. { name: '视力障碍', yesScore: 1, noScore: 0 },
  183. { name: '活动障碍,肢体偏瘫', yesScore: 3, noScore: 0 },
  184. { name: '年龄大于或等于 65 岁', yesScore: 1, noScore: 0 },
  185. { name: '体能虚弱', yesScore: 3, noScore: 0 },
  186. { name: '头晕、眩晕、体位性低血压', yesScore: 2, noScore: 0 },
  187. { name: '服用影响意识或行动的药物,如催眠剂、镇静安神药物,利尿剂、抗癫痫剂、麻醉止痛剂', yesScore: 1, noScore: 0 },
  188. { name: '吸毒、酗酒史', yesScore: 1, noScore: 0 },
  189. { name: '住院中无人陪伴', yesScore: 1, noScore: 0 },
  190. { name: '睡气垫床', yesScore: 1, noScore: 0 }
  191. ]
  192. // 表单数据
  193. const form = reactive({
  194. assessment: {
  195. assessDate: '',
  196. assessor: '',
  197. scores: new Array(12).fill(0),
  198. totalScore: 0
  199. },
  200. preventionMeasures: [],
  201. riskLevel: ''
  202. })
  203. // 计算总得分
  204. const calculateTotal = () => {
  205. const scores = form.assessment.scores
  206. const total = scores.reduce((sum, score) => sum + (score || 0), 0)
  207. form.assessment.totalScore = total
  208. // 自动判断风险等级
  209. if (total <= 1) {
  210. form.riskLevel = 'none'
  211. } else if (total === 2) {
  212. form.riskLevel = 'low'
  213. } else if (total === 3) {
  214. form.riskLevel = 'medium'
  215. } else if (total >= 4) {
  216. form.riskLevel = 'high'
  217. }
  218. }
  219. // 获取风险等级文本
  220. const getRiskText = (riskLevel: string) => {
  221. switch (riskLevel) {
  222. case 'none': return '无风险'
  223. case 'low': return '低风险'
  224. case 'medium': return '中风险'
  225. case 'high': return '高风险'
  226. default: return '-'
  227. }
  228. }
  229. // 获取风险等级标签类型
  230. const getRiskTagType = (riskLevel: string) => {
  231. switch (riskLevel) {
  232. case 'none': return 'success'
  233. case 'low': return 'info'
  234. case 'medium': return 'warning'
  235. case 'high': return 'danger'
  236. default: return ''
  237. }
  238. }
  239. /** 将表单数据序列化为 JSON 对象 */
  240. const serializeFormData = () => {
  241. return {
  242. assessment: {
  243. assessDate: form.assessment.assessDate ? dayjs(form.assessment.assessDate).format('YYYY-MM-DD') : '',
  244. assessor: form.assessment.assessor || '',
  245. scores: form.assessment.scores || [],
  246. totalScore: form.assessment.totalScore || 0
  247. },
  248. preventionMeasures: form.preventionMeasures || [],
  249. riskLevel: form.riskLevel
  250. }
  251. }
  252. /** 将 JSON 对象反序列化为表单数据 */
  253. const deserializeFormData = (formData: Record<string, any>) => {
  254. if (!formData) return
  255. if (formData.assessment) {
  256. form.assessment.assessDate = formData.assessment.assessDate || ''
  257. form.assessment.assessor = formData.assessment.assessor || ''
  258. form.assessment.scores = formData.assessment.scores || new Array(12).fill(0)
  259. form.assessment.totalScore = formData.assessment.totalScore || 0
  260. }
  261. form.preventionMeasures = formData.preventionMeasures || []
  262. form.riskLevel = formData.riskLevel || ''
  263. }
  264. /** 重置表单数据 */
  265. const resetForm = () => {
  266. dataForm.value = {
  267. id: undefined,
  268. elderName: '',
  269. elderSex: '',
  270. elderAge: '',
  271. bedName: '',
  272. elderId: '',
  273. tenantId: undefined
  274. }
  275. formRef.value?.resetFields()
  276. form.assessment = {
  277. assessDate: '',
  278. assessor: '',
  279. scores: new Array(12).fill(0),
  280. totalScore: 0
  281. }
  282. form.preventionMeasures = []
  283. form.riskLevel = ''
  284. }
  285. /** 打开弹窗 */
  286. const open = async (tenantId: any, id?: any, detail: boolean = false) => {
  287. resetForm()
  288. dialogVisible.value = true
  289. dataForm.value.id = id || undefined
  290. dataForm.value.tenantId = tenantId
  291. isDetail.value = detail
  292. if (id) {
  293. title.value = "编辑-防坠床评估表"
  294. await loadData(id)
  295. } else {
  296. title.value = "新增-防坠床评估表"
  297. }
  298. }
  299. /** 加载评估数据 */
  300. const loadData = async (id: number) => {
  301. try {
  302. const res = await fallPreventionGetById(id)
  303. if (res) {
  304. dataForm.value.elderName = res.elderName || ''
  305. dataForm.value.elderId = res.elderId || ''
  306. dataForm.value.elderSex = res.elderSex || ''
  307. dataForm.value.bedName = res.bedName || ''
  308. dataForm.value.elderAge = res.elderAge || ''
  309. await selectElderRef.value.upData(res.elderName, res.elderId)
  310. if (res.assessData) {
  311. const formData = JSON.parse(res.assessData)
  312. deserializeFormData(formData)
  313. }
  314. }
  315. } catch (error) {
  316. message.error('加载评估数据失败')
  317. }
  318. }
  319. defineExpose({ open })
  320. const emit = defineEmits(['success'])
  321. /** 提交表单 */
  322. const submitForm = async () => {
  323. if (!dataForm.value.elderId) {
  324. message.error('请选择长者')
  325. return
  326. }
  327. formLoading.value = true
  328. try {
  329. const formData = serializeFormData()
  330. const payload = {
  331. id: dataForm.value.id,
  332. elderId: dataForm.value.elderId,
  333. tenantId: dataForm.value.tenantId,
  334. elderName: dataForm.value.elderName,
  335. elderSex: dataForm.value.elderSex,
  336. elderAge: dataForm.value.elderAge,
  337. bedName: dataForm.value.bedName,
  338. assessData: JSON.stringify(formData),
  339. assessScore: form.assessment.totalScore || 0,
  340. riskLevel: form.riskLevel,
  341. assessor: form.assessment.assessor,
  342. assessDate: form.assessment.assessDate ? dayjs(form.assessment.assessDate).format('YYYY-MM-DD') : ''
  343. }
  344. if (dataForm.value.id) {
  345. await fallPreventionUpdate(payload)
  346. message.success(t('common.updateSuccess'))
  347. } else {
  348. await fallPreventionCreate(payload)
  349. message.success(t('common.createSuccess'))
  350. }
  351. dialogVisible.value = false
  352. emit('success')
  353. } catch (error) {
  354. message.error('提交失败')
  355. } finally {
  356. formLoading.value = false
  357. }
  358. }
  359. /** 关闭弹窗 */
  360. const handleClosed = () => {
  361. dialogVisible.value = false
  362. }
  363. /** 导出/打印 */
  364. const handleExport = () => {
  365. // 创建打印窗口
  366. const printWindow = window.open('', '_blank')
  367. if (!printWindow) {
  368. message.error('请允许弹出窗口')
  369. return
  370. }
  371. // 构建打印内容
  372. const printContent = `
  373. <!DOCTYPE html>
  374. <html>
  375. <head>
  376. <meta charset="UTF-8">
  377. <title>防坠床评估表 - ${dataForm.value.elderName || ''}</title>
  378. <style>
  379. @media print {
  380. @page { size: A4 portrait; margin: 15mm; }
  381. }
  382. body {
  383. font-family: 'SimSun', 'Microsoft YaHei', serif;
  384. font-size: 10pt;
  385. line-height: 1.4;
  386. color: #333;
  387. }
  388. .header {
  389. text-align: center;
  390. margin-bottom: 15px;
  391. border-bottom: 2px solid #333;
  392. padding-bottom: 10px;
  393. }
  394. .header h1 {
  395. font-size: 16pt;
  396. margin: 0;
  397. letter-spacing: 2px;
  398. }
  399. .info-section {
  400. margin-bottom: 15px;
  401. padding: 10px;
  402. border: 1px solid #999;
  403. background: #fafafa;
  404. }
  405. .info-row {
  406. display: flex;
  407. flex-wrap: wrap;
  408. gap: 20px;
  409. }
  410. .info-item {
  411. display: flex;
  412. align-items: center;
  413. }
  414. .info-item .label {
  415. font-weight: bold;
  416. margin-right: 8px;
  417. color: #555;
  418. }
  419. .info-item .value {
  420. border-bottom: 1px solid #333;
  421. min-width: 80px;
  422. padding: 0 5px;
  423. text-align: center;
  424. }
  425. .assessment-table {
  426. width: 100%;
  427. border-collapse: collapse;
  428. margin-bottom: 15px;
  429. }
  430. .assessment-table th, .assessment-table td {
  431. border: 1px solid #333;
  432. padding: 8px;
  433. text-align: center;
  434. vertical-align: middle;
  435. }
  436. .assessment-table th {
  437. background: #e8e8e8;
  438. font-weight: bold;
  439. }
  440. .assessment-table .col-factor {
  441. width: 60%;
  442. text-align: left;
  443. font-weight: bold;
  444. background: #f5f5f5;
  445. }
  446. .assessment-table .col-score-header {
  447. width: 15%;
  448. }
  449. .assessment-table .col-result {
  450. width: 10%;
  451. font-weight: bold;
  452. }
  453. .risk-judgment-section {
  454. margin: 15px 0;
  455. padding: 10px;
  456. border: 1px solid #999;
  457. }
  458. .risk-judgment-title {
  459. font-weight: bold;
  460. margin-bottom: 10px;
  461. }
  462. .risk-options {
  463. display: flex;
  464. flex-wrap: wrap;
  465. gap: 15px;
  466. }
  467. .risk-option {
  468. display: inline-block;
  469. }
  470. .record-section {
  471. margin: 15px 0;
  472. padding: 10px;
  473. border: 1px solid #999;
  474. }
  475. .record-title {
  476. font-weight: bold;
  477. margin-bottom: 10px;
  478. border-bottom: 1px solid #ccc;
  479. padding-bottom: 5px;
  480. }
  481. .record-row {
  482. display: flex;
  483. gap: 30px;
  484. margin-bottom: 8px;
  485. }
  486. .record-item {
  487. display: flex;
  488. align-items: center;
  489. }
  490. .record-item .label {
  491. font-weight: bold;
  492. margin-right: 8px;
  493. }
  494. .record-item .value {
  495. border-bottom: 1px solid #333;
  496. min-width: 100px;
  497. padding: 0 5px;
  498. text-align: center;
  499. }
  500. .score-value {
  501. color: #d9534f;
  502. font-weight: bold;
  503. font-size: 14pt;
  504. }
  505. .prevention-section {
  506. margin: 15px 0;
  507. border: 1px solid #999;
  508. }
  509. .prevention-title {
  510. font-weight: bold;
  511. background: #e8e8e8;
  512. padding: 8px 12px;
  513. border-bottom: 1px solid #999;
  514. }
  515. .prevention-content {
  516. padding: 10px 12px;
  517. }
  518. .prevention-item {
  519. margin-bottom: 8px;
  520. font-size: 10pt;
  521. }
  522. </style>
  523. </head>
  524. <body>
  525. <div class="header">
  526. <h1>防坠床评估表</h1>
  527. </div>
  528. <div class="info-section">
  529. <div class="info-row">
  530. <div class="info-item">
  531. <span class="label">长者姓名:</span>
  532. <span class="value">${dataForm.value.elderName || ''}</span>
  533. </div>
  534. <div class="info-item">
  535. <span class="label">性别:</span>
  536. <span class="value">${dataForm.value.elderSex || ''}</span>
  537. </div>
  538. <div class="info-item">
  539. <span class="label">年龄:</span>
  540. <span class="value">${dataForm.value.elderAge || ''}</span>
  541. </div>
  542. <div class="info-item">
  543. <span class="label">房号/床号:</span>
  544. <span class="value">${dataForm.value.bedName || ''}</span>
  545. </div>
  546. </div>
  547. </div>
  548. <!-- 危险因素评估表 -->
  549. <table class="assessment-table">
  550. <thead>
  551. <tr>
  552. <th class="col-factor">危险因素</th>
  553. <th class="col-score-header">是</th>
  554. <th class="col-score-header">否</th>
  555. <th class="col-result">得分</th>
  556. </tr>
  557. </thead>
  558. <tbody>
  559. ${riskFactors.map((item, index) => `
  560. <tr>
  561. <td class="col-factor">${item.name}</td>
  562. <td class="col-score-header">${form.assessment.scores[index] === item.yesScore ? '☑' : '☐'} ${item.yesScore}分</td>
  563. <td class="col-score-header">${form.assessment.scores[index] === item.noScore ? '☑' : '☐'} ${item.noScore}分</td>
  564. <td class="col-result">${form.assessment.scores[index]}</td>
  565. </tr>
  566. `).join('')}
  567. </tbody>
  568. </table>
  569. <!-- 风险程度判断 -->
  570. <div class="risk-judgment-section">
  571. <div class="risk-judgment-title">风险程度判断:</div>
  572. <div class="risk-options">
  573. <span class="risk-option">${form.riskLevel === 'none' ? '☑' : '☐'} 无风险:≤1分</span>
  574. <span class="risk-option">${form.riskLevel === 'low' ? '☑' : '☐'} 低风险:2分</span>
  575. <span class="risk-option">${form.riskLevel === 'medium' ? '☑' : '☐'} 中风险:3分</span>
  576. <span class="risk-option">${form.riskLevel === 'high' ? '☑' : '☐'} 高风险:≥4分</span>
  577. </div>
  578. </div>
  579. <!-- 评估记录 -->
  580. <div class="record-section">
  581. <div class="record-title">评估记录</div>
  582. <div class="record-row">
  583. <div class="record-item">
  584. <span class="label">评估日期:</span>
  585. <span class="value">${form.assessment.assessDate || ''}</span>
  586. </div>
  587. <div class="record-item">
  588. <span class="label">评估人签名:</span>
  589. <span class="value">${form.assessment.assessor || ''}</span>
  590. </div>
  591. <div class="record-item">
  592. <span class="label">评估总得分:</span>
  593. <span class="value score-value">${form.assessment.totalScore} 分</span>
  594. </div>
  595. <div class="record-item">
  596. <span class="label">风险等级结果:</span>
  597. <span class="value">${getRiskText(form.riskLevel)}</span>
  598. </div>
  599. </div>
  600. </div>
  601. <!-- 预防措施 -->
  602. <div class="prevention-section">
  603. <div class="prevention-title">预防措施</div>
  604. <div class="prevention-content">
  605. <div class="prevention-item">${form.preventionMeasures?.includes('加勤巡视,随时发现安全隐患') ? '☑' : '☐'} 加勤巡视,随时发现安全隐患</div>
  606. <div class="prevention-item">${form.preventionMeasures?.includes('睡觉时拉起两侧床栏如需下床请将床栏放下,切勿翻越床栏') ? '☑' : '☐'} 睡觉时拉起两侧床栏如需下床请将床栏放下,切勿翻越床栏</div>
  607. <div class="prevention-item">${form.preventionMeasures?.includes('常检查床的牢固性,发现不稳定时立即对床进行加固') ? '☑' : '☐'} 常检查床的牢固性,发现不稳定时立即对床进行加固</div>
  608. <div class="prevention-item">${form.preventionMeasures?.includes('发现老人睡在床边缘时,应将老人调整到床中央') ? '☑' : '☐'} 发现老人睡在床边缘时,应将老人调整到床中央</div>
  609. <div class="prevention-item">${form.preventionMeasures?.includes('翻身时叮嘱老人动作要慢,幅度要小确保安全') ? '☑' : '☐'} 翻身时叮嘱老人动作要慢,幅度要小确保安全</div>
  610. <div class="prevention-item">${form.preventionMeasures?.includes('将生活用品、尿壶便器等放于易拿之处') ? '☑' : '☐'} 将生活用品、尿壶便器等放于易拿之处</div>
  611. </div>
  612. </div>
  613. </body>
  614. </html>
  615. `
  616. // 写入内容并打印
  617. printWindow.document.write(printContent)
  618. printWindow.document.close()
  619. // 延迟打印,确保样式加载完成
  620. setTimeout(() => {
  621. printWindow.print()
  622. }, 500)
  623. }
  624. const rules = {
  625. elderName: [{ required: true, message: '请选择长者', trigger: 'change' }]
  626. }
  627. </script>
  628. <style scoped lang="scss">
  629. .assessment-form {
  630. padding: 0 20px;
  631. .form-header {
  632. margin-bottom: 20px;
  633. }
  634. .risk-factors-section {
  635. margin-bottom: 20px;
  636. .section-title {
  637. font-size: 16px;
  638. font-weight: bold;
  639. margin-bottom: 15px;
  640. color: #333;
  641. border-left: 4px solid #409eff;
  642. padding-left: 10px;
  643. }
  644. .assessment-table {
  645. width: 100%;
  646. border-collapse: collapse;
  647. border: 1px solid #e4e7ed;
  648. border-radius: 4px;
  649. overflow: hidden;
  650. th, td {
  651. padding: 12px;
  652. border: 1px solid #e4e7ed;
  653. text-align: center;
  654. }
  655. thead {
  656. background-color: #f5f7fa;
  657. font-weight: bold;
  658. }
  659. .col-factor {
  660. width: 50%;
  661. text-align: left;
  662. }
  663. .col-score-header {
  664. width: 20%;
  665. }
  666. .col-result {
  667. width: 10%;
  668. font-weight: bold;
  669. color: #409eff;
  670. }
  671. }
  672. .risk-judgment {
  673. margin-top: 15px;
  674. padding: 15px;
  675. background-color: #f5f7fa;
  676. border-radius: 4px;
  677. .judgment-title {
  678. font-weight: bold;
  679. margin-right: 15px;
  680. }
  681. }
  682. }
  683. .assessment-records {
  684. margin-top: 20px;
  685. .record-section {
  686. margin-bottom: 20px;
  687. padding: 15px;
  688. border: 1px solid #e4e7ed;
  689. border-radius: 4px;
  690. .record-header {
  691. font-size: 14px;
  692. font-weight: bold;
  693. margin-bottom: 15px;
  694. color: #409eff;
  695. border-bottom: 1px solid #e4e7ed;
  696. padding-bottom: 10px;
  697. }
  698. .score-text {
  699. font-size: 16px;
  700. font-weight: bold;
  701. color: #409eff;
  702. }
  703. }
  704. }
  705. .prevention-section {
  706. margin-top: 20px;
  707. .section-title {
  708. font-size: 16px;
  709. font-weight: bold;
  710. margin-bottom: 15px;
  711. color: #333;
  712. border-left: 4px solid #409eff;
  713. padding-left: 10px;
  714. }
  715. .prevention-group {
  716. .el-checkbox {
  717. margin-bottom: 10px;
  718. margin-right: 20px;
  719. }
  720. }
  721. }
  722. .api-params-section {
  723. margin-top: 30px;
  724. padding: 20px;
  725. background-color: #f5f7fa;
  726. border: 1px solid #e4e7ed;
  727. border-radius: 4px;
  728. .section-title {
  729. font-size: 16px;
  730. font-weight: bold;
  731. margin-bottom: 15px;
  732. color: #333;
  733. border-left: 4px solid #67c23a;
  734. padding-left: 10px;
  735. }
  736. .risk-rules {
  737. margin-top: 15px;
  738. padding: 10px;
  739. background-color: #fff;
  740. border-radius: 4px;
  741. .rules-title {
  742. font-weight: bold;
  743. margin-bottom: 10px;
  744. color: #606266;
  745. }
  746. .rule-tag {
  747. margin-right: 10px;
  748. margin-bottom: 5px;
  749. }
  750. }
  751. }
  752. }
  753. </style>