AddForm.vue 50 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421
  1. <template>
  2. <el-drawer v-model="dialogVisible" :title="title" size="95%" :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.bedName" disabled />
  23. </el-form-item>
  24. </el-col>
  25. <el-col :span="6">
  26. <el-form-item label="性别">
  27. <el-input v-model="dataForm.elderSex" disabled />
  28. </el-form-item>
  29. </el-col>
  30. <el-col :span="6">
  31. <el-form-item label="评估日期">
  32. <el-date-picker
  33. v-model="form.assessDate"
  34. type="date"
  35. placeholder="选择日期"
  36. value-format="YYYY-MM-DD"
  37. :disabled="isDetail"
  38. style="width: 100%"
  39. />
  40. </el-form-item>
  41. </el-col>
  42. </el-row>
  43. <el-row :gutter="20">
  44. <el-col :span="6">
  45. <el-form-item label="身高(m)">
  46. <el-input-number v-model="form.height" :min="0" :max="3" :precision="2" :step="0.01" :disabled="isDetail" style="width: 100%" @change="calculateBMI" />
  47. </el-form-item>
  48. </el-col>
  49. <el-col :span="6">
  50. <el-form-item label="体重(Kg)">
  51. <el-input-number v-model="form.weight" :min="0" :max="200" :precision="1" :step="0.5" :disabled="isDetail" style="width: 100%" @change="calculateBMI" />
  52. </el-form-item>
  53. </el-col>
  54. <el-col :span="6" v-if="form.bmi">
  55. <el-form-item label="BMI">
  56. <span class="bmi-value">{{ form.bmi.toFixed(1) }}</span>
  57. </el-form-item>
  58. </el-col>
  59. </el-row>
  60. </el-form>
  61. </div>
  62. <!-- 营养风险评估表 -->
  63. <div class="nutritional-section">
  64. <!-- 初筛部分 -->
  65. <div class="subsection-title">初筛</div>
  66. <table class="assessment-table">
  67. <thead>
  68. <tr>
  69. <th class="col-item">项目</th>
  70. <th class="col-score-0">0分</th>
  71. <th class="col-score-1">1分</th>
  72. <th class="col-score-2">2分</th>
  73. <th class="col-score-3">3分</th>
  74. </tr>
  75. </thead>
  76. <tbody>
  77. <!-- 6. 近三个月有无饮食量变化 -->
  78. <tr>
  79. <td class="col-item">1. 近三个月有无饮食量变化</td>
  80. <td class="col-score">
  81. <el-radio :label="0" v-model="form.initialScores[5]" :disabled="isDetail" @change="calculateScores">严重增加或减少</el-radio>
  82. </td>
  83. <td class="col-score">
  84. <el-radio :label="1" v-model="form.initialScores[5]" :disabled="isDetail" @change="calculateScores">增加或减少</el-radio>
  85. </td>
  86. <td class="col-score">
  87. <el-radio :label="2" v-model="form.initialScores[5]" :disabled="isDetail" @change="calculateScores">无变化</el-radio>
  88. </td>
  89. <td class="col-score">—</td>
  90. </tr>
  91. <!-- 2. 近3个月体重变化 -->
  92. <tr>
  93. <td class="col-item">2. 近3个月体重变化</td>
  94. <td class="col-score">
  95. <el-radio :label="0" v-model="form.initialScores[1]" :disabled="isDetail" @change="calculateScores">减少或增加≥3Kg</el-radio>
  96. </td>
  97. <td class="col-score">
  98. <el-radio :label="1" v-model="form.initialScores[1]" :disabled="isDetail" @change="calculateScores">不知道</el-radio>
  99. </td>
  100. <td class="col-score">
  101. <el-radio :label="2" v-model="form.initialScores[1]" :disabled="isDetail" @change="calculateScores">1Kg≤减少&lt;3Kg<br/>或1Kg≤增加&lt;3Kg</el-radio>
  102. </td>
  103. <td class="col-score">
  104. <el-radio :label="3" v-model="form.initialScores[1]" :disabled="isDetail" @change="calculateScores">0Kg&lt;减少&lt;1Kg<br/>或0Kg&lt;增加&lt;1Kg</el-radio>
  105. </td>
  106. </tr>
  107. <!-- 3. 活动能力 -->
  108. <tr>
  109. <td class="col-item">3. 活动能力</td>
  110. <td class="col-score">
  111. <el-radio :label="0" v-model="form.initialScores[2]" :disabled="isDetail" @change="calculateScores">卧床</el-radio>
  112. </td>
  113. <td class="col-score">
  114. <el-radio :label="1" v-model="form.initialScores[2]" :disabled="isDetail" @change="calculateScores">需要依赖工具活动</el-radio>
  115. </td>
  116. <td class="col-score">
  117. <el-radio :label="2" v-model="form.initialScores[2]" :disabled="isDetail" @change="calculateScores">独立户外活动</el-radio>
  118. </td>
  119. <td class="col-score">—</td>
  120. </tr>
  121. <!-- 4. 牙齿状况 -->
  122. <tr>
  123. <td class="col-item">4. 牙齿状况</td>
  124. <td class="col-score">
  125. <el-radio :label="0" v-model="form.initialScores[3]" :disabled="isDetail" @change="calculateScores">全口或半口缺</el-radio>
  126. </td>
  127. <td class="col-score">
  128. <el-radio :label="1" v-model="form.initialScores[3]" :disabled="isDetail" @change="calculateScores">用义齿</el-radio>
  129. </td>
  130. <td class="col-score">
  131. <el-radio :label="2" v-model="form.initialScores[3]" :disabled="isDetail" @change="calculateScores">正常</el-radio>
  132. </td>
  133. <td class="col-score">—</td>
  134. </tr>
  135. <!-- 5. 神经精神疾病 -->
  136. <tr>
  137. <td class="col-item">5. 神经精神疾病</td>
  138. <td class="col-score">
  139. <el-radio :label="0" v-model="form.initialScores[4]" :disabled="isDetail" @change="calculateScores">严重认知障碍或抑郁</el-radio>
  140. </td>
  141. <td class="col-score">
  142. <el-radio :label="1" v-model="form.initialScores[4]" :disabled="isDetail" @change="calculateScores">轻度认知障碍或抑郁</el-radio>
  143. </td>
  144. <td class="col-score">
  145. <el-radio :label="2" v-model="form.initialScores[4]" :disabled="isDetail" @change="calculateScores">无认知障碍或抑郁</el-radio>
  146. </td>
  147. <td class="col-score">—</td>
  148. </tr>
  149. <!-- 1. BMI -->
  150. <tr>
  151. <td class="col-item">6. BMI</td>
  152. <td class="col-score">
  153. <el-radio :label="0" v-model="form.initialScores[0]" :disabled="isDetail" @change="calculateScores">BMI&lt;19<br/>或 BMI≥28</el-radio>
  154. </td>
  155. <td class="col-score">
  156. <el-radio :label="1" v-model="form.initialScores[0]" :disabled="isDetail" @change="calculateScores">19≤BMI&lt;21<br/>或 26≤BMI&lt;28</el-radio>
  157. </td>
  158. <td class="col-score">
  159. <el-radio :label="2" v-model="form.initialScores[0]" :disabled="isDetail" @change="calculateScores">21≤BMI&lt;23<br/>或24≤BMI&lt;26</el-radio>
  160. </td>
  161. <td class="col-score">
  162. <el-radio :label="3" v-model="form.initialScores[0]" :disabled="isDetail" @change="calculateScores">23≤BMI≤24</el-radio>
  163. </td>
  164. </tr>
  165. </tbody>
  166. </table>
  167. <!-- 初筛提示 -->
  168. <div class="initial-tip">
  169. <p>总分14分,&lt;12分提示有营养不良风险,继续以下评估;≥12分提示无营养不良风险,无需以下评估。</p>
  170. <p class="score-display">初筛分数(小计满分14分):<span class="score-value">{{ form.initialScore }}</span> 分</p>
  171. </div>
  172. <!-- 评估部分 -->
  173. <div class="subsection-title">评估</div>
  174. <table class="assessment-table">
  175. <thead>
  176. <tr>
  177. <th class="col-item">项目</th>
  178. <th class="col-score-0">0分</th>
  179. <th class="col-score-05">0.5分</th>
  180. <th class="col-score-1">1分</th>
  181. <th class="col-score-2">2分</th>
  182. </tr>
  183. </thead>
  184. <tbody>
  185. <!-- 7. 患慢性病数>3种 -->
  186. <tr>
  187. <td class="col-item">7. 患慢性病数&gt;3种</td>
  188. <td class="col-score">
  189. <el-radio :label="0" v-model="form.assessScores[0]" :disabled="isDetail" @change="calculateScores">是</el-radio>
  190. </td>
  191. <td class="col-score">—</td>
  192. <td class="col-score">
  193. <el-radio :label="1" v-model="form.assessScores[0]" :disabled="isDetail" @change="calculateScores">否</el-radio>
  194. </td>
  195. <td class="col-score">—</td>
  196. </tr>
  197. <!-- 8. 服药时间在一个月以上的药物种类>3种 -->
  198. <tr>
  199. <td class="col-item">8. 服药时间在一个月以上的药物种类&gt;3种</td>
  200. <td class="col-score">
  201. <el-radio :label="0" v-model="form.assessScores[1]" :disabled="isDetail" @change="calculateScores">是</el-radio>
  202. </td>
  203. <td class="col-score">—</td>
  204. <td class="col-score">
  205. <el-radio :label="1" v-model="form.assessScores[1]" :disabled="isDetail" @change="calculateScores">否</el-radio>
  206. </td>
  207. <td class="col-score">—</td>
  208. </tr>
  209. <!-- 9. 是否独居 -->
  210. <tr>
  211. <td class="col-item">9. 是否独居</td>
  212. <td class="col-score">
  213. <el-radio :label="0" v-model="form.assessScores[2]" :disabled="isDetail" @change="calculateScores">是</el-radio>
  214. </td>
  215. <td class="col-score">—</td>
  216. <td class="col-score">
  217. <el-radio :label="1" v-model="form.assessScores[2]" :disabled="isDetail" @change="calculateScores">否</el-radio>
  218. </td>
  219. <td class="col-score">—</td>
  220. </tr>
  221. <!-- 10. 睡眠时间 -->
  222. <tr>
  223. <td class="col-item">10. 睡眠时间</td>
  224. <td class="col-score">
  225. <el-radio :label="0" v-model="form.assessScores[3]" :disabled="isDetail" @change="calculateScores">&lt;5h/d</el-radio>
  226. </td>
  227. <td class="col-score">—</td>
  228. <td class="col-score">
  229. <el-radio :label="1" v-model="form.assessScores[3]" :disabled="isDetail" @change="calculateScores">≥5h/d</el-radio>
  230. </td>
  231. <td class="col-score">—</td>
  232. </tr>
  233. <!-- 11. 户外独立活动时间 -->
  234. <tr>
  235. <td class="col-item">11. 户外独立活动时间</td>
  236. <td class="col-score">
  237. <el-radio :label="0" v-model="form.assessScores[4]" :disabled="isDetail" @change="calculateScores">&lt;1h/d</el-radio>
  238. </td>
  239. <td class="col-score">—</td>
  240. <td class="col-score">
  241. <el-radio :label="1" v-model="form.assessScores[4]" :disabled="isDetail" @change="calculateScores">≥1h/d</el-radio>
  242. </td>
  243. <td class="col-score">—</td>
  244. </tr>
  245. <!-- 12. 文化程度 -->
  246. <tr>
  247. <td class="col-item">12. 文化程度</td>
  248. <td class="col-score">
  249. <el-radio :label="0" v-model="form.assessScores[5]" :disabled="isDetail" @change="calculateScores">小学及以下</el-radio>
  250. </td>
  251. <td class="col-score">—</td>
  252. <td class="col-score">
  253. <el-radio :label="1" v-model="form.assessScores[5]" :disabled="isDetail" @change="calculateScores">中学及以上</el-radio>
  254. </td>
  255. <td class="col-score">—</td>
  256. </tr>
  257. <!-- 13. 自我感觉经济状况 -->
  258. <tr>
  259. <td class="col-item">13. 自我感觉经济状况</td>
  260. <td class="col-score">
  261. <el-radio :label="0" v-model="form.assessScores[6]" :disabled="isDetail" @change="calculateScores">差</el-radio>
  262. </td>
  263. <td class="col-score">
  264. <el-radio :label="0.5" v-model="form.assessScores[6]" :disabled="isDetail" @change="calculateScores">一般</el-radio>
  265. </td>
  266. <td class="col-score">
  267. <el-radio :label="1" v-model="form.assessScores[6]" :disabled="isDetail" @change="calculateScores">良好</el-radio>
  268. </td>
  269. <td class="col-score">—</td>
  270. </tr>
  271. <!-- 14. 进食能力 -->
  272. <tr>
  273. <td class="col-item">14. 进食能力</td>
  274. <td class="col-score">
  275. <el-radio :label="0" v-model="form.assessScores[7]" :disabled="isDetail" @change="calculateScores">依靠别人</el-radio>
  276. </td>
  277. <td class="col-score">—</td>
  278. <td class="col-score">
  279. <el-radio :label="1" v-model="form.assessScores[7]" :disabled="isDetail" @change="calculateScores">自行进食稍有困难</el-radio>
  280. </td>
  281. <td class="col-score">
  282. <el-radio :label="2" v-model="form.assessScores[7]" :disabled="isDetail" @change="calculateScores">自行进食</el-radio>
  283. </td>
  284. </tr>
  285. <!-- 15. 一天餐次 -->
  286. <tr>
  287. <td class="col-item">15. 一天餐次</td>
  288. <td class="col-score">
  289. <el-radio :label="0" v-model="form.assessScores[8]" :disabled="isDetail" @change="calculateScores">1次</el-radio>
  290. </td>
  291. <td class="col-score">—</td>
  292. <td class="col-score">
  293. <el-radio :label="1" v-model="form.assessScores[8]" :disabled="isDetail" @change="calculateScores">2次</el-radio>
  294. </td>
  295. <td class="col-score">
  296. <el-radio :label="2" v-model="form.assessScores[8]" :disabled="isDetail" @change="calculateScores">3次及以上</el-radio>
  297. </td>
  298. </tr>
  299. <!-- 16. 每天摄入奶类/豆制品/鱼肉类 -->
  300. <tr>
  301. <td class="col-item">16. 每天摄入奶类:<br/>每天摄入豆制品:<br/>每天摄入鱼/肉/蛋类食品</td>
  302. <td class="col-score">
  303. <el-radio :label="0" v-model="form.assessScores[9]" :disabled="isDetail" @change="calculateScores">0-1项</el-radio>
  304. </td>
  305. <td class="col-score">
  306. <el-radio :label="0.5" v-model="form.assessScores[9]" :disabled="isDetail" @change="calculateScores">2项</el-radio>
  307. </td>
  308. <td class="col-score">
  309. <el-radio :label="1" v-model="form.assessScores[9]" :disabled="isDetail" @change="calculateScores">3项</el-radio>
  310. </td>
  311. <td class="col-score">—</td>
  312. </tr>
  313. <!-- 17. 每天烹调油摄入量 -->
  314. <tr>
  315. <td class="col-item">17. 每天烹调油摄入量</td>
  316. <td class="col-score">
  317. <el-radio :label="0" v-model="form.assessScores[10]" :disabled="isDetail" @change="calculateScores">≥25g</el-radio>
  318. </td>
  319. <td class="col-score">—</td>
  320. <td class="col-score">
  321. <el-radio :label="1" v-model="form.assessScores[10]" :disabled="isDetail" @change="calculateScores">&lt;25g</el-radio>
  322. </td>
  323. <td class="col-score">—</td>
  324. </tr>
  325. <!-- 18. 是否每天吃蔬菜水果500g以上 -->
  326. <tr>
  327. <td class="col-item">18. 是否每天吃蔬菜水果500g及以上</td>
  328. <td class="col-score">
  329. <el-radio :label="0" v-model="form.measureScores[0]" :disabled="isDetail" @change="calculateScores">否</el-radio>
  330. </td>
  331. <td class="col-score">—</td>
  332. <td class="col-score">
  333. <el-radio :label="1" v-model="form.measureScores[0]" :disabled="isDetail" @change="calculateScores">是</el-radio>
  334. </td>
  335. <td class="col-score">—</td>
  336. </tr>
  337. <!-- 19. 小腿围 -->
  338. <tr>
  339. <td class="col-item">19. 小腿围</td>
  340. <td class="col-score">
  341. <el-radio :label="0" v-model="form.measureScores[1]" :disabled="isDetail" @change="calculateScores">&lt;31cm</el-radio>
  342. </td>
  343. <td class="col-score">—</td>
  344. <td class="col-score">
  345. <el-radio :label="1" v-model="form.measureScores[1]" :disabled="isDetail" @change="calculateScores">≥31cm</el-radio>
  346. </td>
  347. <td class="col-score">—</td>
  348. </tr>
  349. <!-- 20. 腰围 -->
  350. <tr>
  351. <td class="col-item">20. 腰围</td>
  352. <td class="col-score" colspan="2">
  353. <div class="waist-row">
  354. <span class="waist-label">男:</span>
  355. <el-radio :label="0" v-model="form.waistScore" :disabled="isDetail" @change="onWaistChange">&gt;90cm</el-radio>
  356. </div>
  357. <div class="waist-row">
  358. <span class="waist-label">女:</span>
  359. <el-radio :label="2" v-model="form.waistScore" :disabled="isDetail" @change="onWaistChange">&gt;80cm</el-radio>
  360. </div>
  361. </td>
  362. <td class="col-score" colspan="2">
  363. <div class="waist-row">
  364. <el-radio :label="1" v-model="form.waistScore" :disabled="isDetail" @change="onWaistChange">≤90cm</el-radio>
  365. </div>
  366. <div class="waist-row">
  367. <el-radio :label="3" v-model="form.waistScore" :disabled="isDetail" @change="onWaistChange">≤80cm</el-radio>
  368. </div>
  369. </td>
  370. </tr>
  371. </tbody>
  372. </table>
  373. <!-- 测量输入 -->
  374. <div class="measure-inputs">
  375. <el-row :gutter="20">
  376. <el-col :span="8">
  377. <el-form-item label="小腿围(cm):">
  378. <el-input-number v-model="form.calfCircumference" :min="0" :max="100" :precision="1" :disabled="isDetail" style="width: 150px" />
  379. </el-form-item>
  380. </el-col>
  381. <el-col :span="8">
  382. <el-form-item label="腰围(cm):">
  383. <el-input-number v-model="form.waistCircumference" :min="0" :max="200" :precision="1" :disabled="isDetail" style="width: 150px" />
  384. </el-form-item>
  385. </el-col>
  386. </el-row>
  387. </div>
  388. <!-- 年龄调整 -->
  389. <div class="age-adjust">
  390. <p>年龄超过70岁总分加1分,即年龄调整增加的分值:<span class="score-value">{{ form.ageAdjust }}</span>分,年龄&lt;70岁:0分,年龄≥70岁:1分</p>
  391. </div>
  392. <!-- 分数汇总 -->
  393. <div class="score-summary">
  394. <div class="summary-item">
  395. <span class="label">初筛分数(小计满分14分):</span>
  396. <span class="value">{{ form.initialScore }} 分</span>
  397. </div>
  398. <div class="summary-item">
  399. <span class="label">评估分数(小计满分16分):</span>
  400. <span class="value">{{ form.assessScore + form.measureScore }} 分</span>
  401. </div>
  402. <div class="summary-item">
  403. <span class="label">年龄调整(≥70岁加1分):</span>
  404. <span class="value">{{ form.ageAdjust }} 分</span>
  405. </div>
  406. <div class="summary-item">
  407. <span class="label">量表总分(满分30分):</span>
  408. <span class="value total">{{ form.totalScore }} 分</span>
  409. </div>
  410. </div>
  411. <!-- 评分标准 -->
  412. <div class="scoring-standard">
  413. <div class="standard-title">评分标准:</div>
  414. <div class="standard-content">
  415. <p>若初筛总分≥12分提示无营养不良风险,无需评估;</p>
  416. <p>若初筛总分&lt;12分提示有营养不良风险,继续评估;</p>
  417. <p>若营养不良风险评估总分(初筛+评估)≥24分,表示营养状况良好;</p>
  418. <p>若营养不良风险评估总分(初筛+评估)17分~24分(不含24分),表示有营养不良风险;</p>
  419. <p>若营养不良风险评估总分(初筛+评估)≤17分,表示有营养不良。</p>
  420. </div>
  421. <div class="current-result" v-if="form.resultLevel">
  422. <span class="result-label">当前评估结果:</span>
  423. <el-tag :type="getResultTagType(form.resultLevel)" size="large">
  424. {{ getResultText(form.resultLevel) }}
  425. </el-tag>
  426. </div>
  427. </div>
  428. <!-- 评估人签名 -->
  429. <div class="assessor-section">
  430. <el-form-item label="评估人签名:" label-width="100px">
  431. <el-input v-model="form.assessor" :disabled="isDetail" style="width: 300px" />
  432. </el-form-item>
  433. </div>
  434. </div>
  435. </div>
  436. <template #footer>
  437. <div style="flex: auto">
  438. <el-button v-if="!isDetail" type="primary" @click="submitForm">保存</el-button>
  439. <el-button v-if="!isDetail" @click="handleClosed">取消</el-button>
  440. <el-button v-if="isDetail" @click="handleClosed">关闭</el-button>
  441. <el-button v-if="isDetail" type="primary" @click="handleExport">打印</el-button>
  442. </div>
  443. </template>
  444. </el-drawer>
  445. </template>
  446. <script setup lang="ts">
  447. import { ref, reactive, nextTick } from 'vue'
  448. import { useAppStore } from '@/store/modules/app'
  449. import { useUserStore } from '@/store/modules/user'
  450. import {
  451. nutritionalRiskCreate,
  452. nutritionalRiskUpdate,
  453. nutritionalRiskGetById,
  454. NutritionalRiskFormData
  455. } from '@/api/social-work'
  456. import {getTenantId} from "@/utils/auth";
  457. const message = useMessage()
  458. const userStore = useUserStore()
  459. const appStore = useAppStore()
  460. const emit = defineEmits(['success'])
  461. const dialogVisible = ref(false)
  462. const title = ref('新增营养风险评估')
  463. const isDetail = ref(false)
  464. const formRef = ref()
  465. const selectElderRef = ref()
  466. const dataForm = reactive({
  467. id: undefined as number | undefined,
  468. elderId: undefined as number | undefined,
  469. tenantId: appStore.getTenantId,
  470. elderName: '',
  471. elderSex: '',
  472. bedName: '',
  473. elderAge: ''
  474. })
  475. const form = reactive({
  476. assessDate: '',
  477. height: undefined as number | undefined,
  478. weight: undefined as number | undefined,
  479. bmi: undefined as number | undefined,
  480. // 初筛分数(6项,每项0-3分)
  481. initialScores: [undefined, undefined, undefined, undefined, undefined, undefined] as (number | undefined)[],
  482. // 评估分数(11项)
  483. assessScores: [undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined] as (number | undefined)[],
  484. // 测量分数(2项:18.蔬菜水果, 19.小腿围)
  485. measureScores: [undefined, undefined] as (number | undefined)[],
  486. // 腰围分数(0:男>90cm, 1:男≤90cm, 2:女>80cm, 3:女≤80cm)
  487. waistScore: undefined as number | undefined,
  488. // 测量值
  489. calfCircumference: undefined as number | undefined,
  490. waistCircumference: undefined as number | undefined,
  491. // 分数汇总
  492. initialScore: 0,
  493. assessScore: 0,
  494. measureScore: 0,
  495. ageAdjust: 0,
  496. totalScore: 0,
  497. resultLevel: '',
  498. assessor: ''
  499. })
  500. const calculateBMI = () => {
  501. if (form.height && form.weight) {
  502. form.bmi = form.weight / (form.height * form.height)
  503. // 根据BMI自动计算第1题分数
  504. if (form.bmi < 19 || form.bmi >= 28) {
  505. form.initialScores[0] = 0
  506. } else if ((form.bmi >= 19 && form.bmi < 21) || (form.bmi >= 26 && form.bmi < 28)) {
  507. form.initialScores[0] = 1
  508. } else if ((form.bmi >= 21 && form.bmi < 23) || (form.bmi >= 24 && form.bmi < 26)) {
  509. form.initialScores[0] = 2
  510. } else if (form.bmi >= 23 && form.bmi <= 24) {
  511. form.initialScores[0] = 3
  512. }
  513. calculateScores()
  514. }
  515. }
  516. const calculateScores = () => {
  517. // 计算初筛分数(满分14分)
  518. form.initialScore = form.initialScores.reduce((sum, score) => sum + (score || 0), 0)
  519. // 计算评估分数(满分15分)- 11项
  520. form.assessScore = form.assessScores.reduce((sum, score) => sum + (score || 0), 0)
  521. // 计算测量分数(满分3分:18题1分 + 19题1分 + 20题1分)
  522. let measureScore = form.measureScores.reduce((sum, score) => sum + (score || 0), 0)
  523. // 第20题腰围分数(0或1分)
  524. if (form.waistScore !== undefined) {
  525. // 0:男>90cm(0分), 1:男≤90cm(1分), 2:女>80cm(0分), 3:女≤80cm(1分)
  526. measureScore += (form.waistScore === 1 || form.waistScore === 3) ? 1 : 0
  527. }
  528. form.measureScore = measureScore
  529. // 年龄调整(≥70岁加1分)
  530. const age = parseInt(dataForm.elderAge) || 0
  531. form.ageAdjust = age >= 70 ? 1 : 0
  532. // 计算总分
  533. form.totalScore = form.initialScore + form.assessScore + form.measureScore + form.ageAdjust
  534. // 判断结果等级
  535. if (form.initialScore >= 12) {
  536. // 初筛通过,无营养不良风险
  537. form.resultLevel = 'good'
  538. } else {
  539. // 初筛未通过,根据总分判断(结果等级仅由总分决定,不受BMI/腰围影响)
  540. if (form.totalScore >= 24) {
  541. form.resultLevel = 'good' // 营养状况良好
  542. } else if (form.totalScore > 17 && form.totalScore < 24) {
  543. form.resultLevel = 'at_risk' // 有营养不良风险
  544. } else {
  545. form.resultLevel = 'malnutrition' // 有营养不良
  546. }
  547. }
  548. }
  549. // 腰围选择变化处理(男女互斥)
  550. const onWaistChange = () => {
  551. calculateScores()
  552. }
  553. const getResultTagType = (level: string) => {
  554. const typeMap: Record<string, string> = {
  555. 'good': 'success',
  556. 'at_risk': 'warning',
  557. 'malnutrition': 'danger'
  558. }
  559. return typeMap[level] || 'info'
  560. }
  561. const getResultText = (level: string) => {
  562. const textMap: Record<string, string> = {
  563. 'good': '营养状况良好',
  564. 'at_risk': '有营养不良风险',
  565. 'malnutrition': '有营养不良'
  566. }
  567. return textMap[level] || level
  568. }
  569. const resetForm = () => {
  570. dataForm.id = undefined
  571. dataForm.elderId = undefined
  572. dataForm.elderName = ''
  573. dataForm.elderSex = ''
  574. dataForm.elderAge = ''
  575. form.assessDate = ''
  576. form.height = undefined
  577. form.weight = undefined
  578. form.bmi = undefined
  579. form.initialScores = [undefined, undefined, undefined, undefined, undefined, undefined]
  580. form.assessScores = [undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined]
  581. form.measureScores = [undefined, undefined]
  582. form.waistScore = undefined
  583. form.calfCircumference = undefined
  584. form.waistCircumference = undefined
  585. form.initialScore = 0
  586. form.assessScore = 0
  587. form.measureScore = 0
  588. form.ageAdjust = 0
  589. form.totalScore = 0
  590. form.resultLevel = ''
  591. form.assessor = ''
  592. }
  593. const elderUp = (e: any) => {
  594. dataForm.elderName = e.elderName
  595. dataForm.elderId = e.id
  596. dataForm.elderSex = e.elderSex === 1 ? '男' : '女'
  597. dataForm.bedName = e.bedName || ''
  598. dataForm.elderAge = e.elderAge
  599. // 年龄变化时重新计算
  600. calculateScores()
  601. }
  602. const open = async (id?: number) => {
  603. resetForm()
  604. title.value = '新增营养风险评估'
  605. isDetail.value = false
  606. dialogVisible.value = true
  607. dataForm.tenantId = getTenantId()
  608. await nextTick()
  609. selectElderRef.value?.reset()
  610. }
  611. const openEdit = async (row: any, id: number) => {
  612. resetForm()
  613. title.value = '编辑营养风险评估'
  614. isDetail.value = false
  615. dialogVisible.value = true
  616. await nextTick()
  617. await loadData(row, id)
  618. }
  619. const openDetail = async (row: any, id: number) => {
  620. resetForm()
  621. title.value = '营养风险评估详情'
  622. isDetail.value = true
  623. dialogVisible.value = true
  624. await nextTick()
  625. await loadData(row, id)
  626. }
  627. const loadData = async (row: any, id: number) => {
  628. try {
  629. const res = await nutritionalRiskGetById(id)
  630. if (res) {
  631. Object.assign(dataForm, {
  632. id: res.id,
  633. elderId: res.elderId,
  634. elderName: res.elderName,
  635. elderSex: res.elderSex,
  636. elderAge: res.elderAge
  637. })
  638. // 解析assessData
  639. if (res.assessData) {
  640. const assessData = JSON.parse(res.assessData)
  641. Object.assign(form, assessData)
  642. // 从assessData中解析分数(优先使用assessData中的值)
  643. form.initialScore = assessData.initialScore ?? res.initialScore ?? 0
  644. form.assessScore = assessData.assessScore ?? res.assessScore ?? 0
  645. form.measureScore = assessData.measureScore ?? res.measureScore ?? 0
  646. form.totalScore = assessData.totalScore ?? res.totalScore ?? 0
  647. }
  648. form.assessor = res.assessor || ''
  649. form.assessDate = res.assessDate || ''
  650. form.ageAdjust = res.ageAdjust || 0
  651. form.resultLevel = res.riskLevel || ''
  652. dataForm.tenantId = res.tenantId || ''
  653. await selectElderRef.value.upData(res.elderName, res.elderId)
  654. }
  655. } catch (error) {
  656. console.error('加载数据失败:', error)
  657. }
  658. }
  659. const submitForm = async () => {
  660. if (!dataForm.elderId) {
  661. message.error('请选择长者')
  662. return
  663. }
  664. const assessData = {
  665. assessDate: form.assessDate,
  666. height: form.height,
  667. weight: form.weight,
  668. bmi: form.bmi,
  669. tenantId: dataForm.tenantId,
  670. initialScores: form.initialScores,
  671. assessScores: form.assessScores,
  672. measureScores: form.measureScores,
  673. waistScore: form.waistScore,
  674. calfCircumference: form.calfCircumference,
  675. waistCircumference: form.waistCircumference,
  676. initialScore: form.initialScore,
  677. assessScore: form.assessScore,
  678. measureScore: form.measureScore,
  679. ageAdjust: form.ageAdjust,
  680. totalScore: form.totalScore,
  681. riskLevel: form.resultLevel
  682. }
  683. const submitData: NutritionalRiskFormData = {
  684. id: dataForm.id,
  685. elderId: dataForm.elderId,
  686. tenantId: dataForm.tenantId,
  687. assessData: JSON.stringify(assessData),
  688. assessor: form.assessor,
  689. riskLevel: form.resultLevel,
  690. assessScore: form.totalScore,
  691. assessDate: form.assessDate
  692. }
  693. try {
  694. if (dataForm.id) {
  695. await nutritionalRiskUpdate(submitData)
  696. message.success('更新成功')
  697. } else {
  698. await nutritionalRiskCreate(submitData)
  699. message.success('创建成功')
  700. }
  701. dialogVisible.value = false
  702. emit('success')
  703. } catch (error) {
  704. console.error('提交失败:', error)
  705. message.error('提交失败')
  706. }
  707. }
  708. const handleClosed = () => {
  709. dialogVisible.value = false
  710. }
  711. const handleExport = () => {
  712. // 创建打印窗口
  713. const printWindow = window.open('', '_blank')
  714. if (!printWindow) {
  715. message.error('请允许弹出窗口')
  716. return
  717. }
  718. // 初筛项目数据
  719. const initialItems = [
  720. { name: '1. 近三个月有无饮食量变化', options: [{ score: 0, text: '严重增加或减少' }, { score: 1, text: '增加或减少' }, { score: 2, text: '无变化' }, { score: null, text: '—' }] },
  721. { name: '2. 近3个月体重变化', options: [{ score: 0, text: '减少或增加≥3Kg' }, { score: 1, text: '不知道' }, { score: 2, text: '1Kg≤减少<3Kg 或 1Kg≤增加<3Kg' }, { score: 3, text: '0Kg<减少<1Kg 或 0Kg<增加<1Kg' }] },
  722. { name: '3. 活动能力', options: [{ score: 0, text: '卧床' }, { score: 1, text: '需要依赖工具活动' }, { score: 2, text: '独立户外活动' }, { score: null, text: '—' }] },
  723. { name: '4. 牙齿状况', options: [{ score: 0, text: '全口或半口缺' }, { score: 1, text: '用义齿' }, { score: 2, text: '正常' }, { score: null, text: '—' }] },
  724. { name: '5. 神经精神疾病', options: [{ score: 0, text: '严重认知障碍或抑郁' }, { score: 1, text: '轻度认知障碍或抑郁' }, { score: 2, text: '无认知障碍或抑郁' }, { score: null, text: '—' }] },
  725. { name: '6. BMI', options: [{ score: 0, text: 'BMI<19 或 BMI≥28' }, { score: 1, text: '19≤BMI<21 或 26≤BMI<28' }, { score: 2, text: '21≤BMI<23 或 24≤BMI<26' }, { score: 3, text: '23≤BMI≤24' }] }
  726. ]
  727. // 评估项目数据
  728. const assessItems = [
  729. { name: '7. 患慢性病数>3种', options: [{ score: 0, text: '是' }, { score: null, text: '—' }, { score: 1, text: '否' }, { score: null, text: '—' }] },
  730. { name: '8. 服药时间在一个月以上的药物种类>3种', options: [{ score: 0, text: '是' }, { score: null, text: '—' }, { score: 1, text: '否' }, { score: null, text: '—' }] },
  731. { name: '9. 是否独居', options: [{ score: 0, text: '是' }, { score: null, text: '—' }, { score: 1, text: '否' }, { score: null, text: '—' }] },
  732. { name: '10. 睡眠时间', options: [{ score: 0, text: '<5h/d' }, { score: null, text: '—' }, { score: 1, text: '≥5h/d' }, { score: null, text: '—' }] },
  733. { name: '11. 户外独立活动时间', options: [{ score: 0, text: '<1h/d' }, { score: null, text: '—' }, { score: 1, text: '≥1h/d' }, { score: null, text: '—' }] },
  734. { name: '12. 文化程度', options: [{ score: 0, text: '小学及以下' }, { score: null, text: '—' }, { score: 1, text: '中学及以上' }, { score: null, text: '—' }] },
  735. { name: '13. 自我感觉经济状况', options: [{ score: 0, text: '差' }, { score: 0.5, text: '一般' }, { score: 1, text: '良好' }, { score: null, text: '—' }] },
  736. { name: '14. 进食能力', options: [{ score: 0, text: '依靠别人' }, { score: null, text: '—' }, { score: 1, text: '自行进食稍有困难' }, { score: 2, text: '自行进食' }] },
  737. { name: '15. 一天餐次', options: [{ score: 0, text: '1次' }, { score: null, text: '—' }, { score: 1, text: '2次' }, { score: 2, text: '3次及以上' }] },
  738. { name: '16. 每天摄入奶类/豆制品/鱼肉类', options: [{ score: 0, text: '0-1项' }, { score: 0.5, text: '2项' }, { score: 1, text: '3项' }, { score: null, text: '—' }] },
  739. { name: '17. 每天烹调油摄入量', options: [{ score: 0, text: '≥25g' }, { score: null, text: '—' }, { score: 1, text: '<25g' }, { score: null, text: '—' }] },
  740. { name: '18. 是否每天吃蔬菜水果500g及以上', options: [{ score: 0, text: '否' }, { score: null, text: '—' }, { score: 1, text: '是' }, { score: null, text: '—' }] },
  741. { name: '19. 小腿围', options: [{ score: 0, text: '<31cm' }, { score: null, text: '—' }, { score: 1, text: '≥31cm' }, { score: null, text: '—' }] },
  742. { name: '20. 腰围', options: [{ score: '男>90cm/女>80cm', text: '0分' }, { score: null, text: '—' }, { score: '男≤90cm/女≤80cm', text: '1分' }, { score: null, text: '—' }] }
  743. ]
  744. // 构建打印内容
  745. const tenantName = userStore.getTenantName || '' // 当前登录的机构名称
  746. const printContent =`
  747. <!DOCTYPE html>
  748. <html>
  749. <head>
  750. <meta charset="UTF-8">
  751. <title>营养风险评估表 - ${dataForm.elderName || ''}</title>
  752. <style>
  753. @media print {
  754. @page { size: A4 portrait; margin: 15mm; }
  755. }
  756. body {
  757. font-family: 'SimSun', 'Microsoft YaHei', serif;
  758. font-size: 8pt;
  759. line-height: 1.2;
  760. color: #333;
  761. }
  762. .header {
  763. text-align: center;
  764. margin-bottom: 15px;
  765. border-bottom: 2px solid #333;
  766. padding-bottom: 10px;
  767. }
  768. .header h1 {
  769. font-size: 14pt;
  770. margin: 0;
  771. letter-spacing: 2px;
  772. }
  773. .info-section {
  774. margin-bottom: 15px;
  775. padding: 10px;
  776. border: 1px solid #999;
  777. background: #fafafa;
  778. }
  779. .info-row {
  780. display: flex;
  781. flex-wrap: wrap;
  782. gap: 20px;
  783. }
  784. .info-item {
  785. display: flex;
  786. align-items: center;
  787. }
  788. .info-item .label {
  789. font-weight: bold;
  790. margin-right: 8px;
  791. color: #555;
  792. }
  793. .info-item .value {
  794. border-bottom: 1px solid #333;
  795. min-width: 60px;
  796. padding: 0 5px;
  797. text-align: center;
  798. }
  799. .subsection-title {
  800. font-size: 11pt;
  801. font-weight: bold;
  802. margin: 15px 0 10px 0;
  803. padding: 5px 10px;
  804. background: #e8e8e8;
  805. border-left: 4px solid #409eff;
  806. }
  807. .assessment-table {
  808. width: 100%;
  809. border-collapse: collapse;
  810. margin-bottom: 15px;
  811. font-size: 7.5pt;
  812. }
  813. .assessment-table th, .assessment-table td {
  814. border: 1px solid #333;
  815. padding: 4px;
  816. text-align: center;
  817. vertical-align: middle;
  818. }
  819. .assessment-table th {
  820. background: #e8e8e8;
  821. font-weight: bold;
  822. }
  823. .assessment-table .col-item {
  824. width: 20%;
  825. font-weight: bold;
  826. background: #f5f5f5;
  827. text-align: left;
  828. }
  829. .assessment-table .col-score {
  830. width: 20%;
  831. }
  832. .initial-tip {
  833. margin: 10px 0;
  834. padding: 10px;
  835. border: 1px solid #999;
  836. background: #fff3cd;
  837. font-size: 9pt;
  838. }
  839. .score-value {
  840. color: #d9534f;
  841. font-weight: bold;
  842. font-size: 12pt;
  843. }
  844. .score-summary {
  845. margin: 15px 0;
  846. padding: 10px;
  847. border: 1px solid #999;
  848. background: #fafafa;
  849. }
  850. .summary-item {
  851. display: flex;
  852. justify-content: space-between;
  853. margin-bottom: 5px;
  854. }
  855. .summary-item .label {
  856. font-weight: bold;
  857. }
  858. .summary-item .value {
  859. font-weight: bold;
  860. }
  861. .summary-item .value.total {
  862. color: #d9534f;
  863. font-size: 14pt;
  864. }
  865. .scoring-standard {
  866. margin: 15px 0;
  867. padding: 10px;
  868. border: 1px solid #999;
  869. background: #fafafa;
  870. }
  871. .standard-title {
  872. font-weight: bold;
  873. margin-bottom: 8px;
  874. }
  875. .standard-content {
  876. font-size: 8pt;
  877. line-height: 1.5;
  878. }
  879. .standard-content p {
  880. margin: 3px 0;
  881. }
  882. .current-result {
  883. margin-top: 10px;
  884. padding-top: 10px;
  885. border-top: 1px solid #ccc;
  886. }
  887. .result-label {
  888. font-weight: bold;
  889. margin-right: 10px;
  890. }
  891. .assessor-section {
  892. margin: 15px 0;
  893. padding: 10px;
  894. border: 1px solid #999;
  895. background: #fafafa;
  896. }
  897. .assessor-row {
  898. display: flex;
  899. gap: 30px;
  900. }
  901. .assessor-item {
  902. display: flex;
  903. align-items: center;
  904. }
  905. .assessor-item .label {
  906. font-weight: bold;
  907. margin-right: 8px;
  908. }
  909. .assessor-item .value {
  910. border-bottom: 1px solid #333;
  911. min-width: 120px;
  912. padding: 0 5px;
  913. text-align: center;
  914. }
  915. </style>
  916. </head>
  917. <body>
  918. <div class="tenant-name" style="text-align: end;width: 100%;font-size: 16px; font-weight: bold; margin-bottom: 10px;">${tenantName}</div>
  919. <div class="header">
  920. <h1>营养风险评估表</h1>
  921. </div>
  922. <div class="info-section">
  923. <div class="info-row">
  924. <div class="info-item">
  925. <span class="label">长者姓名:</span>
  926. <span class="value">${dataForm.elderName || ''}</span>
  927. </div>
  928. <div class="info-item">
  929. <span class="label">性别:</span>
  930. <span class="value">${dataForm.elderSex || ''}</span>
  931. </div>
  932. <div class="info-item">
  933. <span class="label">年龄:</span>
  934. <span class="value">${dataForm.elderAge || ''}</span>
  935. </div>
  936. <div class="info-item">
  937. <span class="label">床位号:</span>
  938. <span class="value">${dataForm.bedName || ''}</span>
  939. </div>
  940. <div class="info-item">
  941. <span class="label">评估日期:</span>
  942. <span class="value">${form.assessDate || ''}</span>
  943. </div>
  944. <div class="info-item">
  945. <span class="label">身高:</span>
  946. <span class="value">${form.height || ''} m</span>
  947. </div>
  948. <div class="info-item">
  949. <span class="label">体重:</span>
  950. <span class="value">${form.weight || ''} Kg</span>
  951. </div>
  952. <div class="info-item">
  953. <span class="label">BMI:</span>
  954. <span class="value">${form.bmi ? form.bmi.toFixed(1) : ''}</span>
  955. </div>
  956. </div>
  957. </div>
  958. <!-- 初筛部分 -->
  959. <div class="subsection-title">初筛(满分14分)</div>
  960. <table class="assessment-table">
  961. <thead>
  962. <tr>
  963. <th class="col-item">项目</th>
  964. <th class="col-score">0分</th>
  965. <th class="col-score">1分</th>
  966. <th class="col-score">2分</th>
  967. <th class="col-score">3分</th>
  968. </tr>
  969. </thead>
  970. <tbody>
  971. ${initialItems.map((item, index) => `
  972. <tr>
  973. <td class="col-item">${item.name}</td>
  974. ${item.options.map(opt => `
  975. <td class="col-score">${form.initialScores[index] === opt.score ? '☑' : '☐'} ${opt.text}</td>
  976. `).join('')}
  977. </tr>
  978. `).join('')}
  979. </tbody>
  980. </table>
  981. <div class="initial-tip">
  982. <p>总分14分,<12分提示有营养不良风险,继续以下评估;≥12分提示无营养不良风险,无需以下评估。</p>
  983. <p>初筛分数(小计满分14分):<span class="score-value">${form.initialScore}</span> 分</p>
  984. </div>
  985. <!-- 评估部分 -->
  986. <div class="subsection-title">评估(满分16分)</div>
  987. <table class="assessment-table">
  988. <thead>
  989. <tr>
  990. <th class="col-item">项目</th>
  991. <th class="col-score">0分</th>
  992. <th class="col-score">0.5分</th>
  993. <th class="col-score">1分</th>
  994. <th class="col-score">2分</th>
  995. </tr>
  996. </thead>
  997. <tbody>
  998. ${assessItems.map((item, index) => `
  999. <tr>
  1000. <td class="col-item">${item.name}</td>
  1001. ${item.options.map((opt, optIndex) => {
  1002. let isSelected = false
  1003. if (index < 11) {
  1004. isSelected = form.assessScores[index] === opt.score
  1005. } else if (index === 11) {
  1006. isSelected = form.measureScores[0] === opt.score
  1007. } else if (index === 12) {
  1008. isSelected = form.measureScores[1] === opt.score
  1009. } else if (index === 13) {
  1010. // 腰围特殊处理
  1011. if (optIndex === 0) isSelected = form.waistScore === 0 || form.waistScore === 2
  1012. if (optIndex === 2) isSelected = form.waistScore === 1 || form.waistScore === 3
  1013. }
  1014. return `<td class="col-score">${isSelected ? '☑' : '☐'} ${opt.text}</td>`
  1015. }).join('')}
  1016. </tr>
  1017. `).join('')}
  1018. </tbody>
  1019. </table>
  1020. <!-- 测量值 -->
  1021. <div class="info-section">
  1022. <div class="info-row">
  1023. <div class="info-item">
  1024. <span class="label">小腿围:</span>
  1025. <span class="value">${form.calfCircumference || ''} cm</span>
  1026. </div>
  1027. <div class="info-item">
  1028. <span class="label">腰围:</span>
  1029. <span class="value">${form.waistCircumference || ''} cm</span>
  1030. </div>
  1031. </div>
  1032. </div>
  1033. <!-- 分数汇总 -->
  1034. <div class="score-summary">
  1035. <div class="summary-item">
  1036. <span class="label">初筛分数(小计满分14分):</span>
  1037. <span class="value">${form.initialScore} 分</span>
  1038. </div>
  1039. <div class="summary-item">
  1040. <span class="label">评估分数(小计满分16分):</span>
  1041. <span class="value">${form.assessScore + form.measureScore} 分</span>
  1042. </div>
  1043. <div class="summary-item">
  1044. <span class="label">年龄调整(≥70岁加1分):</span>
  1045. <span class="value">${form.ageAdjust} 分</span>
  1046. </div>
  1047. <div class="summary-item">
  1048. <span class="label">量表总分(满分30分):</span>
  1049. <span class="value total">${form.totalScore} 分</span>
  1050. </div>
  1051. </div>
  1052. <!-- 评分标准 -->
  1053. <div class="scoring-standard">
  1054. <div class="standard-title">评分标准:</div>
  1055. <div class="standard-content">
  1056. <p>若初筛总分≥12分提示无营养不良风险,无需评估;</p>
  1057. <p>若初筛总分<12分提示有营养不良风险,继续评估;</p>
  1058. <p>若营养不良风险评估总分(初筛+评估)≥24分,表示营养状况良好;</p>
  1059. <p>若营养不良风险评估总分(初筛+评估)17分~24分(不含24分),表示有营养不良风险;</p>
  1060. <p>若营养不良风险评估总分(初筛+评估)≤17分,表示有营养不良。</p>
  1061. </div>
  1062. ${form.resultLevel ? `
  1063. <div class="current-result">
  1064. <span class="result-label">当前评估结果:</span>
  1065. <span class="score-value">${getResultText(form.resultLevel)}</span>
  1066. </div>
  1067. ` : ''}
  1068. </div>
  1069. <!-- 评估人签名 -->
  1070. <div class="assessor-section">
  1071. <div class="assessor-row">
  1072. <div class="assessor-item">
  1073. <span class="label">评估人签名:</span>
  1074. <span class="value">${form.assessor || ''}</span>
  1075. </div>
  1076. </div>
  1077. </div>
  1078. </body>
  1079. </html>
  1080. `
  1081. // 写入内容并打印
  1082. printWindow.document.write(printContent)
  1083. printWindow.document.close()
  1084. // 延迟打印,确保样式加载完成
  1085. setTimeout(() => {
  1086. printWindow.print()
  1087. }, 500)
  1088. }
  1089. const rules = {
  1090. elderName: [{ required: true, message: '请选择长者', trigger: 'change' }]
  1091. }
  1092. defineExpose({
  1093. open,
  1094. openEdit,
  1095. openDetail
  1096. })
  1097. </script>
  1098. <style scoped lang="scss">
  1099. .assessment-form {
  1100. padding: 0 20px;
  1101. .form-header {
  1102. margin-bottom: 20px;
  1103. .bmi-value {
  1104. font-size: 16px;
  1105. font-weight: bold;
  1106. color: #409eff;
  1107. }
  1108. }
  1109. .nutritional-section {
  1110. margin-bottom: 20px;
  1111. .section-title {
  1112. font-size: 18px;
  1113. font-weight: bold;
  1114. margin-bottom: 15px;
  1115. color: #333;
  1116. text-align: center;
  1117. border-bottom: 2px solid #409eff;
  1118. padding-bottom: 10px;
  1119. }
  1120. .subsection-title {
  1121. font-size: 16px;
  1122. font-weight: bold;
  1123. margin: 20px 0 10px 0;
  1124. color: #333;
  1125. border-left: 4px solid #409eff;
  1126. padding-left: 10px;
  1127. }
  1128. .assessment-table {
  1129. width: 100%;
  1130. border: 1px solid #e4e7ed;
  1131. border-radius: 4px;
  1132. border-collapse: collapse;
  1133. thead {
  1134. background-color: #f5f7fa;
  1135. font-weight: bold;
  1136. th {
  1137. padding: 12px;
  1138. border: 1px solid #e4e7ed;
  1139. text-align: center;
  1140. }
  1141. .col-item {
  1142. width: 20%;
  1143. }
  1144. .col-score-0,
  1145. .col-score-05,
  1146. .col-score-1,
  1147. .col-score-2,
  1148. .col-score-3 {
  1149. width: 20%;
  1150. }
  1151. }
  1152. tbody {
  1153. tr {
  1154. border-bottom: 1px solid #e4e7ed;
  1155. &:last-child {
  1156. border-bottom: none;
  1157. }
  1158. td {
  1159. padding: 12px;
  1160. border: 1px solid #e4e7ed;
  1161. }
  1162. .col-item {
  1163. padding-left: 30px;
  1164. text-align: left;
  1165. font-weight: bold;
  1166. vertical-align: middle;
  1167. }
  1168. .col-score {
  1169. padding-left: 30px;
  1170. text-align: left;
  1171. vertical-align: middle;
  1172. .el-radio {
  1173. white-space: normal;
  1174. line-height: 1.5;
  1175. height: auto;
  1176. margin-right: 0;
  1177. }
  1178. .waist-row {
  1179. margin-bottom: 5px;
  1180. &:last-child {
  1181. margin-bottom: 0;
  1182. }
  1183. .waist-label {
  1184. font-weight: bold;
  1185. margin-right: 10px;
  1186. }
  1187. }
  1188. }
  1189. }
  1190. }
  1191. }
  1192. .initial-tip {
  1193. margin: 15px 0;
  1194. padding: 15px;
  1195. background-color: #f5f7fa;
  1196. border-radius: 4px;
  1197. p {
  1198. margin: 5px 0;
  1199. }
  1200. .score-display {
  1201. font-weight: bold;
  1202. }
  1203. .score-value {
  1204. font-size: 18px;
  1205. font-weight: bold;
  1206. color: #409eff;
  1207. }
  1208. }
  1209. .measure-inputs {
  1210. margin: 15px 0;
  1211. padding: 15px;
  1212. background-color: #f5f7fa;
  1213. border-radius: 4px;
  1214. }
  1215. .age-adjust {
  1216. margin: 15px 0;
  1217. padding: 15px;
  1218. background-color: #f5f7fa;
  1219. border-radius: 4px;
  1220. .score-value {
  1221. font-size: 18px;
  1222. font-weight: bold;
  1223. color: #409eff;
  1224. }
  1225. }
  1226. .score-summary {
  1227. margin: 20px 0;
  1228. padding: 20px;
  1229. background-color: #f5f7fa;
  1230. border-radius: 4px;
  1231. border: 2px solid #409eff;
  1232. .summary-item {
  1233. margin: 10px 0;
  1234. font-size: 16px;
  1235. .label {
  1236. font-weight: bold;
  1237. }
  1238. .value {
  1239. font-size: 18px;
  1240. font-weight: bold;
  1241. color: #409eff;
  1242. &.total {
  1243. color: #f56c6c;
  1244. font-size: 20px;
  1245. }
  1246. }
  1247. }
  1248. }
  1249. .scoring-standard {
  1250. margin: 20px 0;
  1251. padding: 20px;
  1252. background-color: #f5f7fa;
  1253. border-radius: 4px;
  1254. .standard-title {
  1255. font-size: 16px;
  1256. font-weight: bold;
  1257. margin-bottom: 10px;
  1258. color: #333;
  1259. }
  1260. .standard-content {
  1261. p {
  1262. margin: 5px 0;
  1263. line-height: 1.6;
  1264. }
  1265. }
  1266. .current-result {
  1267. margin-top: 15px;
  1268. padding-top: 15px;
  1269. border-top: 1px solid #e4e7ed;
  1270. .result-label {
  1271. font-weight: bold;
  1272. margin-right: 10px;
  1273. }
  1274. }
  1275. }
  1276. .assessor-section {
  1277. margin-top: 20px;
  1278. padding: 15px;
  1279. border: 1px solid #e4e7ed;
  1280. border-radius: 4px;
  1281. }
  1282. }
  1283. .api-params-section {
  1284. margin-top: 30px;
  1285. padding: 20px;
  1286. background-color: #f5f7fa;
  1287. border: 1px solid #e4e7ed;
  1288. border-radius: 4px;
  1289. .section-title {
  1290. font-size: 16px;
  1291. font-weight: bold;
  1292. margin-bottom: 15px;
  1293. color: #333;
  1294. border-left: 4px solid #67c23a;
  1295. padding-left: 10px;
  1296. }
  1297. }
  1298. }
  1299. </style>