AddForm.vue 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807
  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. ref="selectElderRef" :tenantId="dataForm.tenantId" @up="elderUp" :disabled="isDetail"
  11. :elderName="dataForm.elderName" />
  12. </el-form-item>
  13. </el-col>
  14. <el-col :span="6">
  15. <el-form-item label="年龄">
  16. <el-input v-model="dataForm.elderAge" disabled />
  17. </el-form-item>
  18. </el-col>
  19. <el-col :span="6">
  20. <el-form-item label="性别">
  21. <el-input v-model="dataForm.elderSex" disabled />
  22. </el-form-item>
  23. </el-col>
  24. <el-col :span="6">
  25. <el-form-item label="房号/床号">
  26. <el-input v-model="dataForm.bedName" disabled />
  27. </el-form-item>
  28. </el-col>
  29. </el-row>
  30. </el-form>
  31. </div>
  32. <!-- 危险因素评估表 -->
  33. <div class="risk-factors-section">
  34. <div class="section-title">危险因素评估</div>
  35. <table class="assessment-table">
  36. <thead>
  37. <tr>
  38. <th class="col-category">评估项目</th>
  39. <th class="col-item">具体项目</th>
  40. <th class="col-option">选项</th>
  41. <th class="col-score">分值</th>
  42. <th class="col-result">得分</th>
  43. </tr>
  44. </thead>
  45. <tbody>
  46. <!-- 基本资料 - 年龄 -->
  47. <tr>
  48. <td class="col-category" rowspan="3">基本资料</td>
  49. <td class="col-item">年龄</td>
  50. <td class="col-option">
  51. <el-radio-group v-model="form.assessment.scores[0]" :disabled="isDetail" @change="calculateTotal">
  52. <el-radio :label="1">≥60岁</el-radio>
  53. <el-radio :label="0">≤60岁</el-radio>
  54. </el-radio-group>
  55. </td>
  56. <td class="col-score">
  57. <span v-if="form.assessment.scores[0] === 1">1</span>
  58. <span v-else>0</span>
  59. </td>
  60. <td class="col-result">{{ form.assessment.scores[0] }}</td>
  61. </tr>
  62. <!-- 基本资料 - 性别 -->
  63. <tr>
  64. <td class="col-item">性别</td>
  65. <td class="col-option">
  66. <el-radio-group v-model="form.assessment.scores[1]" :disabled="isDetail" @change="calculateTotal">
  67. <el-radio :label="1">男性</el-radio>
  68. <el-radio :label="0">女性</el-radio>
  69. </el-radio-group>
  70. </td>
  71. <td class="col-score">
  72. <span v-if="form.assessment.scores[1] === 1">1</span>
  73. <span v-else>0</span>
  74. </td>
  75. <td class="col-result">{{ form.assessment.scores[1] }}</td>
  76. </tr>
  77. <!-- 基本资料 - 文化程度 -->
  78. <tr>
  79. <td class="col-item">文化程度</td>
  80. <td class="col-option">
  81. <el-radio-group v-model="form.assessment.scores[2]" :disabled="isDetail" @change="calculateTotal">
  82. <el-radio :label="0">受过高等教育</el-radio>
  83. <el-radio :label="1">未受高等教育</el-radio>
  84. </el-radio-group>
  85. </td>
  86. <td class="col-score">
  87. <span v-if="form.assessment.scores[2] === 1">1</span>
  88. <span v-else>0</span>
  89. </td>
  90. <td class="col-result">{{ form.assessment.scores[2] }}</td>
  91. </tr>
  92. <!-- 走失既往史 -->
  93. <tr>
  94. <td class="col-category">走失既往史</td>
  95. <td class="col-item">有无走失过现象</td>
  96. <td class="col-option">
  97. <el-radio-group v-model="form.assessment.scores[3]" :disabled="isDetail" @change="calculateTotal">
  98. <el-radio :label="1">有</el-radio>
  99. <el-radio :label="0">无</el-radio>
  100. </el-radio-group>
  101. </td>
  102. <td class="col-score">
  103. <span v-if="form.assessment.scores[3] === 1">1</span>
  104. <span v-else>0</span>
  105. </td>
  106. <td class="col-result">{{ form.assessment.scores[3] }}</td>
  107. </tr>
  108. <!-- 意识状态 -->
  109. <tr>
  110. <td class="col-category">意识状态</td>
  111. <td class="col-item">意识障碍</td>
  112. <td class="col-option">
  113. <el-radio-group v-model="form.assessment.scores[4]" :disabled="isDetail" @change="calculateTotal">
  114. <el-radio :label="1">有</el-radio>
  115. <el-radio :label="0">无</el-radio>
  116. </el-radio-group>
  117. </td>
  118. <td class="col-score">
  119. <span v-if="form.assessment.scores[4] === 1">1</span>
  120. <span v-else>0</span>
  121. </td>
  122. <td class="col-result">{{ form.assessment.scores[4] }}</td>
  123. </tr>
  124. <!-- 心理状态 -->
  125. <tr>
  126. <td class="col-category">心理状态</td>
  127. <td class="col-item">情绪低落、焦虑抑郁等</td>
  128. <td class="col-option">
  129. <el-radio-group v-model="form.assessment.scores[5]" :disabled="isDetail" @change="calculateTotal">
  130. <el-radio :label="1">有</el-radio>
  131. <el-radio :label="0">无</el-radio>
  132. </el-radio-group>
  133. </td>
  134. <td class="col-score">
  135. <span v-if="form.assessment.scores[5] === 1">1</span>
  136. <span v-else>0</span>
  137. </td>
  138. <td class="col-result">{{ form.assessment.scores[5] }}</td>
  139. </tr>
  140. <!-- 疾病史 - 心脑血管 -->
  141. <tr>
  142. <td class="col-category" rowspan="5">疾病史</td>
  143. <td class="col-item">心脑血管(脑出血、脑梗塞、脑萎缩等)</td>
  144. <td class="col-option">
  145. <el-radio-group v-model="form.assessment.scores[6]" :disabled="isDetail" @change="calculateTotal">
  146. <el-radio :label="1">有</el-radio>
  147. <el-radio :label="0">无</el-radio>
  148. </el-radio-group>
  149. </td>
  150. <td class="col-score">
  151. <span v-if="form.assessment.scores[6] === 1">1</span>
  152. <span v-else>0</span>
  153. </td>
  154. <td class="col-result">{{ form.assessment.scores[6] }}</td>
  155. </tr>
  156. <!-- 疾病史 - 术后认知障碍 -->
  157. <tr>
  158. <td class="col-item">术后认知障碍</td>
  159. <td class="col-option">
  160. <el-radio-group v-model="form.assessment.scores[7]" :disabled="isDetail" @change="calculateTotal">
  161. <el-radio :label="1">有</el-radio>
  162. <el-radio :label="0">无</el-radio>
  163. </el-radio-group>
  164. </td>
  165. <td class="col-score">
  166. <span v-if="form.assessment.scores[7] === 1">1</span>
  167. <span v-else>0</span>
  168. </td>
  169. <td class="col-result">{{ form.assessment.scores[7] }}</td>
  170. </tr>
  171. <!-- 疾病史 - 定向力障碍 -->
  172. <tr>
  173. <td class="col-item">定向力障碍脑炎、肝性脑病、酒精性脑病</td>
  174. <td class="col-option">
  175. <el-radio-group v-model="form.assessment.scores[8]" :disabled="isDetail" @change="calculateTotal">
  176. <el-radio :label="1">有</el-radio>
  177. <el-radio :label="0">无</el-radio>
  178. </el-radio-group>
  179. </td>
  180. <td class="col-score">
  181. <span v-if="form.assessment.scores[8] === 1">1</span>
  182. <span v-else>0</span>
  183. </td>
  184. <td class="col-result">{{ form.assessment.scores[8] }}</td>
  185. </tr>
  186. <!-- 疾病史 - 记忆力障碍 -->
  187. <tr>
  188. <td class="col-item">记忆力或认知功能障碍(智障、老年痴呆等)</td>
  189. <td class="col-option">
  190. <el-radio-group v-model="form.assessment.scores[9]" :disabled="isDetail" @change="calculateTotal">
  191. <el-radio :label="1">有</el-radio>
  192. <el-radio :label="0">无</el-radio>
  193. </el-radio-group>
  194. </td>
  195. <td class="col-score">
  196. <span v-if="form.assessment.scores[9] === 1">1</span>
  197. <span v-else>0</span>
  198. </td>
  199. <td class="col-result">{{ form.assessment.scores[9] }}</td>
  200. </tr>
  201. <!-- 疾病史 - 精神行为异常 -->
  202. <tr>
  203. <td class="col-item">有精神行为异常(精神分裂、抑郁等)</td>
  204. <td class="col-option">
  205. <el-radio-group v-model="form.assessment.scores[10]" :disabled="isDetail" @change="calculateTotal">
  206. <el-radio :label="1">有</el-radio>
  207. <el-radio :label="0">无</el-radio>
  208. </el-radio-group>
  209. </td>
  210. <td class="col-score">
  211. <span v-if="form.assessment.scores[10] === 1">1</span>
  212. <span v-else>0</span>
  213. </td>
  214. <td class="col-result">{{ form.assessment.scores[10] }}</td>
  215. </tr>
  216. <!-- 药物影响认知 - 抗抑郁药 -->
  217. <tr>
  218. <td class="col-category" rowspan="3">药物影响认知</td>
  219. <td class="col-item">抗抑郁药</td>
  220. <td class="col-option">
  221. <el-radio-group v-model="form.assessment.scores[11]" :disabled="isDetail" @change="calculateTotal">
  222. <el-radio :label="1">有</el-radio>
  223. <el-radio :label="0">无</el-radio>
  224. </el-radio-group>
  225. </td>
  226. <td class="col-score">
  227. <span v-if="form.assessment.scores[11] === 1">1</span>
  228. <span v-else>0</span>
  229. </td>
  230. <td class="col-result">{{ form.assessment.scores[11] }}</td>
  231. </tr>
  232. <!-- 药物影响认知 - 抗癫痫药 -->
  233. <tr>
  234. <td class="col-item">抗癫痫药</td>
  235. <td class="col-option">
  236. <el-radio-group v-model="form.assessment.scores[12]" :disabled="isDetail" @change="calculateTotal">
  237. <el-radio :label="1">有</el-radio>
  238. <el-radio :label="0">无</el-radio>
  239. </el-radio-group>
  240. </td>
  241. <td class="col-score">
  242. <span v-if="form.assessment.scores[12] === 1">1</span>
  243. <span v-else>0</span>
  244. </td>
  245. <td class="col-result">{{ form.assessment.scores[12] }}</td>
  246. </tr>
  247. <!-- 药物影响认知 - 心脏病药 -->
  248. <tr>
  249. <td class="col-item">心脏病药</td>
  250. <td class="col-option">
  251. <el-radio-group v-model="form.assessment.scores[13]" :disabled="isDetail" @change="calculateTotal">
  252. <el-radio :label="1">有</el-radio>
  253. <el-radio :label="0">无</el-radio>
  254. </el-radio-group>
  255. </td>
  256. <td class="col-score">
  257. <span v-if="form.assessment.scores[13] === 1">1</span>
  258. <span v-else>0</span>
  259. </td>
  260. <td class="col-result">{{ form.assessment.scores[13] }}</td>
  261. </tr>
  262. </tbody>
  263. </table>
  264. <!-- 风险程度判断 -->
  265. <div class="risk-judgment">
  266. <span class="judgment-title">风险程度判断:</span>
  267. <el-radio-group v-model="form.riskLevel" :disabled="isDetail">
  268. <el-radio label="none">无风险:0-3分</el-radio>
  269. <el-radio label="low">低风险:4分</el-radio>
  270. <el-radio label="medium">中风险:5-6分</el-radio>
  271. <el-radio label="high">高风险:≥7分</el-radio>
  272. </el-radio-group>
  273. </div>
  274. </div>
  275. <!-- 评估记录 -->
  276. <div class="assessment-records">
  277. <div class="record-section">
  278. <div class="record-header">评估记录</div>
  279. <el-row :gutter="20">
  280. <el-col :span="8">
  281. <el-form-item label="评估日期:" label-width="90px">
  282. <el-date-picker
  283. v-model="form.assessment.assessDate"
  284. type="date"
  285. placeholder="选择日期"
  286. value-format="YYYY-MM-DD"
  287. :disabled="isDetail"
  288. style="width: 100%"
  289. />
  290. </el-form-item>
  291. </el-col>
  292. <el-col :span="8">
  293. <el-form-item label="评估人签名:" label-width="100px">
  294. <el-input v-model="form.assessment.assessor" :disabled="isDetail" />
  295. </el-form-item>
  296. </el-col>
  297. <el-col :span="8">
  298. <el-form-item label="评估总得分:" label-width="100px">
  299. <span class="score-text">{{ form.assessment.totalScore }} 分</span>
  300. </el-form-item>
  301. </el-col>
  302. </el-row>
  303. <el-row :gutter="20">
  304. <el-col :span="8">
  305. <el-form-item label="风险等级结果:" label-width="100px">
  306. <el-tag :type="getRiskTagType(form.riskLevel)">
  307. {{ getRiskText(form.riskLevel) }}
  308. </el-tag>
  309. </el-form-item>
  310. </el-col>
  311. </el-row>
  312. </div>
  313. </div>
  314. <!-- 预防措施 -->
  315. <div class="prevention-section">
  316. <div class="section-title">预防措施:</div>
  317. <el-checkbox-group v-model="form.preventionMeasures" :disabled="isDetail" class="prevention-group">
  318. <el-row :gutter="20">
  319. <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
  320. <el-checkbox label="重点观察,加强巡视">重点观察,加强巡视</el-checkbox>
  321. </el-col>
  322. <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
  323. <el-checkbox label="严格加强交班制度,重点床头交接清点人数">严格加强交班制度,重点床头交接清点人数</el-checkbox>
  324. </el-col>
  325. <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
  326. <el-checkbox label="在老人房间门口坐特殊、容易记忆的标识,便于老人的辨认">在老人房间门口坐特殊、容易记忆的标识,便于老人的辨认</el-checkbox>
  327. </el-col>
  328. <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
  329. <el-checkbox label="定期了解长者心理变化,对情绪或活动异常的长者加强观察,主动沟通,尽量满足合理要求,避免外出">定期了解长者心理变化,对情绪或活动异常的长者加强观察,主动沟通,尽量满足合理要求,避免外出</el-checkbox>
  330. </el-col>
  331. <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
  332. <el-checkbox label="失智长者需在家属陪同下并填写请假单后方可外出">失智长者需在家属陪同下并填写请假单后方可外出</el-checkbox>
  333. </el-col>
  334. </el-row>
  335. </el-checkbox-group>
  336. </div>
  337. <!-- 提交参数字段说明 -->
  338. <div class="api-params-section">
  339. <div class="section-title">接口参数说明</div>
  340. <el-descriptions :column="1" border>
  341. <el-descriptions-item label="接口地址">POST /elderly-assess-wander-away/create 或 PUT /elderly-assess-wander-away/update</el-descriptions-item>
  342. <el-descriptions-item label="id">记录ID(更新时必填)</el-descriptions-item>
  343. <el-descriptions-item label="elderId">长者ID(必填)</el-descriptions-item>
  344. <el-descriptions-item label="tenantId">机构ID(必填)</el-descriptions-item>
  345. <el-descriptions-item label="elderName">长者姓名</el-descriptions-item>
  346. <el-descriptions-item label="elderSex">长者性别</el-descriptions-item>
  347. <el-descriptions-item label="elderAge">长者年龄</el-descriptions-item>
  348. <el-descriptions-item label="bedName">房号/床号</el-descriptions-item>
  349. <el-descriptions-item label="assessData">
  350. JSON字符串,包含:<br/>
  351. - assessment: 评估记录 {assessDate, assessor, scores[], totalScore}<br/>
  352. - preventionMeasures: 预防措施选项数组<br/>
  353. - riskLevel: 风险等级(none/low/medium/high)
  354. </el-descriptions-item>
  355. <el-descriptions-item label="assessor">评估人()</el-descriptions-item>
  356. <el-descriptions-item label="assessDate">评估日期(YYYY-MM-DD)</el-descriptions-item>
  357. </el-descriptions>
  358. <div class="risk-rules">
  359. <div class="rules-title">风险等级规则:</div>
  360. <el-tag type="success" class="rule-tag">0-3分:无风险</el-tag>
  361. <el-tag type="info" class="rule-tag">4分:低风险</el-tag>
  362. <el-tag type="warning" class="rule-tag">5-6分:中风险</el-tag>
  363. <el-tag type="danger" class="rule-tag">≥7分:高风险</el-tag>
  364. </div>
  365. </div>
  366. </div>
  367. <template #footer>
  368. <el-button @click="handleClosed">关闭</el-button>
  369. <el-button v-if="isDetail" type="success" @click="handleExport">打印</el-button>
  370. <el-button style="margin-left: 22px;margin-right: 30px" v-loading="formLoading" type="primary"
  371. v-show="!isDetail" @click="submitForm">确定</el-button>
  372. </template>
  373. </el-drawer>
  374. </template>
  375. <script lang="ts" setup>
  376. import { ref, reactive } from 'vue'
  377. import dayjs from 'dayjs'
  378. import {
  379. wanderAwayCreate,
  380. wanderAwayGetById,
  381. wanderAwayUpdate,
  382. } from "@/api/social-work";
  383. const message = useMessage()
  384. const { t } = useI18n()
  385. const title = ref('')
  386. const dialogVisible = ref(false)
  387. const formRef = ref()
  388. const selectElderRef = ref()
  389. const isDetail = ref(false)
  390. const formLoading = ref(false)
  391. let dataForm = ref({
  392. id: undefined,
  393. elderName: '',
  394. elderSex: '',
  395. elderAge: '',
  396. bedName: '',
  397. elderId: '',
  398. tenantId: undefined
  399. })
  400. const elderUp = (e: any) => {
  401. dataForm.value.elderName = e.elderName
  402. dataForm.value.elderId = e.id
  403. dataForm.value.elderSex = e.elderSex === 1 ? '男' : '女'
  404. dataForm.value.bedName = e.bedName || ''
  405. dataForm.value.elderAge = e.elderAge
  406. }
  407. // 表单数据 - 14项评估
  408. const form = reactive({
  409. assessment: {
  410. assessDate: '',
  411. assessor: '',
  412. scores: new Array(14).fill(0),
  413. totalScore: 0
  414. },
  415. preventionMeasures: [],
  416. riskLevel: ''
  417. })
  418. // 计算总得分
  419. const calculateTotal = () => {
  420. const scores = form.assessment.scores
  421. const total = scores.reduce((sum, score) => sum + (score || 0), 0)
  422. form.assessment.totalScore = total
  423. // 自动判断风险等级(更新中风险范围为5-6分)
  424. if (total <= 3) {
  425. form.riskLevel = 'none'
  426. } else if (total === 4) {
  427. form.riskLevel = 'low'
  428. } else if (total >= 5 && total <= 6) {
  429. form.riskLevel = 'medium'
  430. } else if (total >= 7) {
  431. form.riskLevel = 'high'
  432. }
  433. }
  434. // 获取风险等级文本
  435. const getRiskText = (riskLevel: string) => {
  436. switch (riskLevel) {
  437. case 'none': return '无风险'
  438. case 'low': return '低风险'
  439. case 'medium': return '中风险'
  440. case 'high': return '高风险'
  441. default: return '-'
  442. }
  443. }
  444. // 获取风险等级标签类型
  445. const getRiskTagType = (riskLevel: string) => {
  446. switch (riskLevel) {
  447. case 'none': return 'success'
  448. case 'low': return 'info'
  449. case 'medium': return 'warning'
  450. case 'high': return 'danger'
  451. default: return ''
  452. }
  453. }
  454. /** 将表单数据序列化为 JSON 对象 */
  455. const serializeFormData = () => {
  456. return {
  457. assessment: {
  458. assessDate: form.assessment.assessDate ? dayjs(form.assessment.assessDate).format('YYYY-MM-DD') : '',
  459. assessor: form.assessment.assessor || '',
  460. scores: form.assessment.scores || [],
  461. totalScore: form.assessment.totalScore || 0
  462. },
  463. preventionMeasures: form.preventionMeasures || [],
  464. riskLevel: form.riskLevel || ''
  465. }
  466. }
  467. /** 将 JSON 对象反序列化为表单数据 */
  468. const deserializeFormData = (formData: Record<string, any>) => {
  469. if (!formData) return
  470. if (formData.assessment) {
  471. form.assessment.assessDate = formData.assessment.assessDate ? dayjs(formData.assessment.assessDate).toDate() : ''
  472. form.assessment.assessor = formData.assessment.assessor || ''
  473. form.assessment.scores = formData.assessment.scores || new Array(14).fill(0)
  474. form.assessment.totalScore = formData.assessment.totalScore || 0
  475. }
  476. form.preventionMeasures = formData.preventionMeasures || []
  477. form.riskLevel = formData.riskLevel || ''
  478. }
  479. /** 重置表单数据 */
  480. const resetForm = () => {
  481. dataForm.value = {
  482. id: undefined,
  483. elderName: '',
  484. elderSex: '',
  485. elderAge: '',
  486. bedName: '',
  487. elderId: '',
  488. tenantId: undefined
  489. }
  490. formRef.value?.resetFields()
  491. form.assessment = {
  492. assessDate: '',
  493. assessor: '',
  494. scores: new Array(14).fill(0),
  495. totalScore: 0
  496. }
  497. form.preventionMeasures = []
  498. form.riskLevel = ''
  499. }
  500. /** 打开弹窗 */
  501. const open = async (tenantId: any, id?: any, detail: boolean = false) => {
  502. resetForm()
  503. dialogVisible.value = true
  504. dataForm.value.id = id || undefined
  505. dataForm.value.tenantId = tenantId
  506. isDetail.value = detail
  507. if (id) {
  508. title.value = "编辑-防走失风险评估表"
  509. await loadData(id)
  510. } else {
  511. title.value = "新增-防走失风险评估表"
  512. }
  513. }
  514. /** 加载评估数据 */
  515. const loadData = async (id: number) => {
  516. try {
  517. const res = await wanderAwayGetById(id)
  518. if (res) {
  519. dataForm.value.elderName = res.elderName || ''
  520. dataForm.value.elderId = res.elderId || ''
  521. dataForm.value.elderSex = res.elderSex || ''
  522. dataForm.value.bedName = res.bedName || ''
  523. dataForm.value.elderAge = res.elderAge || ''
  524. await selectElderRef.value.upData(res.elderName, res.elderId)
  525. if (res.assessData) {
  526. const formData = JSON.parse(res.assessData)
  527. deserializeFormData(formData)
  528. }
  529. }
  530. } catch (error) {
  531. message.error('加载评估数据失败')
  532. }
  533. }
  534. defineExpose({ open })
  535. const emit = defineEmits(['success'])
  536. /** 提交表单 */
  537. const submitForm = async () => {
  538. if (!dataForm.value.elderId) {
  539. message.error('请选择长者')
  540. return
  541. }
  542. formLoading.value = true
  543. try {
  544. const formData = serializeFormData()
  545. const payload = {
  546. id: dataForm.value.id,
  547. elderId: dataForm.value.elderId,
  548. tenantId: dataForm.value.tenantId,
  549. elderName: dataForm.value.elderName,
  550. elderSex: dataForm.value.elderSex,
  551. elderAge: dataForm.value.elderAge,
  552. bedName: dataForm.value.bedName,
  553. assessData: JSON.stringify(formData),
  554. riskLevel: form.riskLevel,
  555. assessor: form.assessment.assessor,
  556. assessDate: form.assessment.assessDate ? dayjs(form.assessment.assessDate).format('YYYY-MM-DD') : ''
  557. }
  558. if (dataForm.value.id) {
  559. await wanderAwayUpdate(payload)
  560. message.success(t('common.updateSuccess'))
  561. } else {
  562. await wanderAwayCreate(payload)
  563. message.success(t('common.createSuccess'))
  564. }
  565. dialogVisible.value = false
  566. emit('success')
  567. } catch (error) {
  568. message.error('提交失败')
  569. } finally {
  570. formLoading.value = false
  571. }
  572. }
  573. /** 关闭弹窗 */
  574. const handleClosed = () => {
  575. dialogVisible.value = false
  576. }
  577. /** 导出/打印 */
  578. const handleExport = () => {
  579. message.info('打印功能开发中')
  580. }
  581. const rules = {
  582. elderName: [{ required: true, message: '请选择长者', trigger: 'change' }]
  583. }
  584. </script>
  585. <style scoped lang="scss">
  586. .assessment-form {
  587. padding: 0 20px;
  588. .form-header {
  589. margin-bottom: 20px;
  590. }
  591. .risk-factors-section {
  592. margin-bottom: 20px;
  593. .section-title {
  594. font-size: 16px;
  595. font-weight: bold;
  596. margin-bottom: 15px;
  597. color: #333;
  598. border-left: 4px solid #409eff;
  599. padding-left: 10px;
  600. }
  601. .assessment-table {
  602. width: 100%;
  603. border-collapse: collapse;
  604. border: 1px solid #e4e7ed;
  605. border-radius: 4px;
  606. overflow: hidden;
  607. thead {
  608. background-color: #f5f7fa;
  609. font-weight: bold;
  610. th {
  611. padding: 12px;
  612. border: 1px solid #e4e7ed;
  613. text-align: center;
  614. font-weight: bold;
  615. }
  616. }
  617. tbody {
  618. td {
  619. padding: 12px;
  620. border: 1px solid #e4e7ed;
  621. vertical-align: middle;
  622. }
  623. }
  624. .col-category {
  625. width: 12%;
  626. text-align: center;
  627. font-weight: bold;
  628. background-color: #fafafa;
  629. }
  630. .col-item {
  631. width: 30%;
  632. text-align: left;
  633. }
  634. .col-option {
  635. width: 30%;
  636. text-align: left;
  637. .el-radio-group {
  638. display: flex;
  639. flex-direction: column;
  640. gap: 8px;
  641. }
  642. }
  643. .col-score {
  644. width: 14%;
  645. text-align: center;
  646. }
  647. .col-result {
  648. width: 14%;
  649. text-align: center;
  650. font-weight: bold;
  651. color: #409eff;
  652. }
  653. }
  654. .risk-judgment {
  655. margin-top: 15px;
  656. padding: 15px;
  657. background-color: #f5f7fa;
  658. border-radius: 4px;
  659. .judgment-title {
  660. font-weight: bold;
  661. margin-right: 15px;
  662. }
  663. }
  664. }
  665. .assessment-records {
  666. margin-top: 20px;
  667. .record-section {
  668. margin-bottom: 20px;
  669. padding: 15px;
  670. border: 1px solid #e4e7ed;
  671. border-radius: 4px;
  672. .record-header {
  673. font-size: 14px;
  674. font-weight: bold;
  675. margin-bottom: 15px;
  676. color: #409eff;
  677. border-bottom: 1px solid #e4e7ed;
  678. padding-bottom: 10px;
  679. }
  680. .score-text {
  681. font-size: 16px;
  682. font-weight: bold;
  683. color: #409eff;
  684. }
  685. }
  686. }
  687. .prevention-section {
  688. margin-top: 20px;
  689. .section-title {
  690. font-size: 16px;
  691. font-weight: bold;
  692. margin-bottom: 15px;
  693. color: #333;
  694. border-left: 4px solid #409eff;
  695. padding-left: 10px;
  696. }
  697. .prevention-group {
  698. .el-checkbox {
  699. margin-bottom: 10px;
  700. margin-right: 20px;
  701. }
  702. }
  703. }
  704. .api-params-section {
  705. margin-top: 30px;
  706. padding: 20px;
  707. background-color: #f5f7fa;
  708. border: 1px solid #e4e7ed;
  709. border-radius: 4px;
  710. .section-title {
  711. font-size: 16px;
  712. font-weight: bold;
  713. margin-bottom: 15px;
  714. color: #333;
  715. border-left: 4px solid #67c23a;
  716. padding-left: 10px;
  717. }
  718. .risk-rules {
  719. margin-top: 15px;
  720. padding: 10px;
  721. background-color: #fff;
  722. border-radius: 4px;
  723. .rules-title {
  724. font-weight: bold;
  725. margin-bottom: 10px;
  726. color: #606266;
  727. }
  728. .rule-tag {
  729. margin-right: 10px;
  730. margin-bottom: 5px;
  731. }
  732. }
  733. }
  734. }
  735. </style>