AddForm.vue 51 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424
  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>若营养不良风险评估总分(初筛+评估)&gt;24分,当BMI≥24(或男性腰围&gt;90cm,女性腰围&gt;80cm)时,提示可能是肥胖/超重型营养不良或有营养不良风险;</p>
  419. <p>若营养不良风险评估总分(初筛+评估)17分~24分,表示有营养不良风险;</p>
  420. <p>若营养不良风险评估总分(初筛+评估)≤17分,表示有营养不良。</p>
  421. </div>
  422. <div class="current-result" v-if="form.resultLevel">
  423. <span class="result-label">当前评估结果:</span>
  424. <el-tag :type="getResultTagType(form.resultLevel)" size="large">
  425. {{ getResultText(form.resultLevel) }}
  426. </el-tag>
  427. </div>
  428. </div>
  429. <!-- 评估人签名 -->
  430. <div class="assessor-section">
  431. <el-form-item label="评估人签名:" label-width="100px">
  432. <el-input v-model="form.assessor" :disabled="isDetail" style="width: 300px" />
  433. </el-form-item>
  434. </div>
  435. </div>
  436. </div>
  437. <template #footer>
  438. <div style="flex: auto">
  439. <el-button v-if="!isDetail" type="primary" @click="submitForm">保存</el-button>
  440. <el-button v-if="!isDetail" @click="handleClosed">取消</el-button>
  441. <el-button v-if="isDetail" @click="handleClosed">关闭</el-button>
  442. <el-button v-if="isDetail" type="primary" @click="handleExport">打印</el-button>
  443. </div>
  444. </template>
  445. </el-drawer>
  446. </template>
  447. <script setup lang="ts">
  448. import { ref, reactive, nextTick } from 'vue'
  449. import { useAppStore } from '@/store/modules/app'
  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 appStore = useAppStore()
  459. const emit = defineEmits(['success'])
  460. const dialogVisible = ref(false)
  461. const title = ref('新增营养风险评估')
  462. const isDetail = ref(false)
  463. const formRef = ref()
  464. const selectElderRef = ref()
  465. const dataForm = reactive({
  466. id: undefined as number | undefined,
  467. elderId: undefined as number | undefined,
  468. tenantId: appStore.getTenantId,
  469. elderName: '',
  470. elderSex: '',
  471. bedName: '',
  472. elderAge: ''
  473. })
  474. const form = reactive({
  475. assessDate: '',
  476. height: undefined as number | undefined,
  477. weight: undefined as number | undefined,
  478. bmi: undefined as number | undefined,
  479. // 初筛分数(6项,每项0-3分)
  480. initialScores: [undefined, undefined, undefined, undefined, undefined, undefined] as (number | undefined)[],
  481. // 评估分数(11项)
  482. assessScores: [undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined] as (number | undefined)[],
  483. // 测量分数(2项:18.蔬菜水果, 19.小腿围)
  484. measureScores: [undefined, undefined] as (number | undefined)[],
  485. // 腰围分数(0:男>90cm, 1:男≤90cm, 2:女>80cm, 3:女≤80cm)
  486. waistScore: undefined as number | undefined,
  487. // 测量值
  488. calfCircumference: undefined as number | undefined,
  489. waistCircumference: undefined as number | undefined,
  490. // 分数汇总
  491. initialScore: 0,
  492. assessScore: 0,
  493. measureScore: 0,
  494. ageAdjust: 0,
  495. totalScore: 0,
  496. resultLevel: '',
  497. assessor: ''
  498. })
  499. const calculateBMI = () => {
  500. if (form.height && form.weight) {
  501. form.bmi = form.weight / (form.height * form.height)
  502. // 根据BMI自动计算第1题分数
  503. if (form.bmi < 19 || form.bmi >= 28) {
  504. form.initialScores[0] = 0
  505. } else if ((form.bmi >= 19 && form.bmi < 21) || (form.bmi >= 26 && form.bmi < 28)) {
  506. form.initialScores[0] = 1
  507. } else if ((form.bmi >= 21 && form.bmi < 23) || (form.bmi >= 24 && form.bmi < 26)) {
  508. form.initialScores[0] = 2
  509. } else if (form.bmi >= 23 && form.bmi <= 24) {
  510. form.initialScores[0] = 3
  511. }
  512. calculateScores()
  513. }
  514. }
  515. const calculateScores = () => {
  516. // 计算初筛分数(满分14分)
  517. form.initialScore = form.initialScores.reduce((sum, score) => sum + (score || 0), 0)
  518. // 计算评估分数(满分15分)- 11项
  519. form.assessScore = form.assessScores.reduce((sum, score) => sum + (score || 0), 0)
  520. // 计算测量分数(满分3分:18题1分 + 19题1分 + 20题1分)
  521. let measureScore = form.measureScores.reduce((sum, score) => sum + (score || 0), 0)
  522. // 第20题腰围分数(0或1分)
  523. if (form.waistScore !== undefined) {
  524. // 0:男>90cm(0分), 1:男≤90cm(1分), 2:女>80cm(0分), 3:女≤80cm(1分)
  525. measureScore += (form.waistScore === 1 || form.waistScore === 3) ? 1 : 0
  526. }
  527. form.measureScore = measureScore
  528. // 年龄调整(≥70岁加1分)
  529. const age = parseInt(dataForm.elderAge) || 0
  530. form.ageAdjust = age >= 70 ? 1 : 0
  531. // 计算总分
  532. form.totalScore = form.initialScore + form.assessScore + form.measureScore + form.ageAdjust
  533. // 判断结果等级
  534. if (form.initialScore >= 12) {
  535. // 初筛通过,无营养不良风险
  536. form.resultLevel = 'good'
  537. } else {
  538. // 初筛未通过,根据总分判断
  539. if (form.totalScore >= 24) {
  540. // 检查是否肥胖/超重
  541. if (form.bmi && form.bmi >= 24) {
  542. form.resultLevel = 'at_risk' // 肥胖/超重型营养不良或有营养不良风险
  543. } else {
  544. form.resultLevel = 'good'
  545. }
  546. } else if (form.totalScore > 17 && form.totalScore < 24) {
  547. form.resultLevel = 'at_risk'
  548. } else {
  549. form.resultLevel = 'malnutrition'
  550. }
  551. }
  552. }
  553. // 腰围选择变化处理(男女互斥)
  554. const onWaistChange = () => {
  555. calculateScores()
  556. }
  557. const getResultTagType = (level: string) => {
  558. const typeMap: Record<string, string> = {
  559. 'good': 'success',
  560. 'at_risk': 'warning',
  561. 'malnutrition': 'danger'
  562. }
  563. return typeMap[level] || 'info'
  564. }
  565. const getResultText = (level: string) => {
  566. const textMap: Record<string, string> = {
  567. 'good': '营养状况良好',
  568. 'at_risk': '有营养不良风险',
  569. 'malnutrition': '有营养不良'
  570. }
  571. return textMap[level] || level
  572. }
  573. const resetForm = () => {
  574. dataForm.id = undefined
  575. dataForm.elderId = undefined
  576. dataForm.elderName = ''
  577. dataForm.elderSex = ''
  578. dataForm.elderAge = ''
  579. form.assessDate = ''
  580. form.height = undefined
  581. form.weight = undefined
  582. form.bmi = undefined
  583. form.initialScores = [undefined, undefined, undefined, undefined, undefined, undefined]
  584. form.assessScores = [undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined]
  585. form.measureScores = [undefined, undefined]
  586. form.waistScore = undefined
  587. form.calfCircumference = undefined
  588. form.waistCircumference = undefined
  589. form.initialScore = 0
  590. form.assessScore = 0
  591. form.measureScore = 0
  592. form.ageAdjust = 0
  593. form.totalScore = 0
  594. form.resultLevel = ''
  595. form.assessor = ''
  596. }
  597. const elderUp = (e: any) => {
  598. dataForm.elderName = e.elderName
  599. dataForm.elderId = e.id
  600. dataForm.elderSex = e.elderSex === 1 ? '男' : '女'
  601. dataForm.bedName = e.bedName || ''
  602. dataForm.elderAge = e.elderAge
  603. // 年龄变化时重新计算
  604. calculateScores()
  605. }
  606. const open = async (id?: number) => {
  607. resetForm()
  608. title.value = '新增营养风险评估'
  609. isDetail.value = false
  610. dialogVisible.value = true
  611. dataForm.tenantId = getTenantId()
  612. await nextTick()
  613. selectElderRef.value?.reset()
  614. }
  615. const openEdit = async (row: any, id: number) => {
  616. resetForm()
  617. title.value = '编辑营养风险评估'
  618. isDetail.value = false
  619. dialogVisible.value = true
  620. await nextTick()
  621. await loadData(row, id)
  622. }
  623. const openDetail = async (row: any, id: number) => {
  624. resetForm()
  625. title.value = '营养风险评估详情'
  626. isDetail.value = true
  627. dialogVisible.value = true
  628. await nextTick()
  629. await loadData(row, id)
  630. }
  631. const loadData = async (row: any, id: number) => {
  632. try {
  633. const res = await nutritionalRiskGetById(id)
  634. if (res) {
  635. Object.assign(dataForm, {
  636. id: res.id,
  637. elderId: res.elderId,
  638. elderName: res.elderName,
  639. elderSex: res.elderSex,
  640. elderAge: res.elderAge
  641. })
  642. // 解析assessData
  643. if (res.assessData) {
  644. const assessData = JSON.parse(res.assessData)
  645. Object.assign(form, assessData)
  646. // 从assessData中解析分数(优先使用assessData中的值)
  647. form.initialScore = assessData.initialScore ?? res.initialScore ?? 0
  648. form.assessScore = assessData.assessScore ?? res.assessScore ?? 0
  649. form.measureScore = assessData.measureScore ?? res.measureScore ?? 0
  650. form.totalScore = assessData.totalScore ?? res.totalScore ?? 0
  651. }
  652. form.assessor = res.assessor || ''
  653. form.assessDate = res.assessDate || ''
  654. form.ageAdjust = res.ageAdjust || 0
  655. form.resultLevel = res.riskLevel || ''
  656. dataForm.tenantId = res.tenantId || ''
  657. await selectElderRef.value.upData(res.elderName, res.elderId)
  658. }
  659. } catch (error) {
  660. console.error('加载数据失败:', error)
  661. }
  662. }
  663. const submitForm = async () => {
  664. if (!dataForm.elderId) {
  665. message.error('请选择长者')
  666. return
  667. }
  668. const assessData = {
  669. assessDate: form.assessDate,
  670. height: form.height,
  671. weight: form.weight,
  672. bmi: form.bmi,
  673. tenantId: dataForm.tenantId,
  674. initialScores: form.initialScores,
  675. assessScores: form.assessScores,
  676. measureScores: form.measureScores,
  677. waistScore: form.waistScore,
  678. calfCircumference: form.calfCircumference,
  679. waistCircumference: form.waistCircumference,
  680. initialScore: form.initialScore,
  681. assessScore: form.assessScore,
  682. measureScore: form.measureScore,
  683. ageAdjust: form.ageAdjust,
  684. totalScore: form.totalScore,
  685. riskLevel: form.resultLevel
  686. }
  687. const submitData: NutritionalRiskFormData = {
  688. id: dataForm.id,
  689. elderId: dataForm.elderId,
  690. tenantId: dataForm.tenantId,
  691. assessData: JSON.stringify(assessData),
  692. assessor: form.assessor,
  693. riskLevel: form.resultLevel,
  694. assessScore: form.totalScore,
  695. assessDate: form.assessDate
  696. }
  697. try {
  698. if (dataForm.id) {
  699. await nutritionalRiskUpdate(submitData)
  700. message.success('更新成功')
  701. } else {
  702. await nutritionalRiskCreate(submitData)
  703. message.success('创建成功')
  704. }
  705. dialogVisible.value = false
  706. emit('success')
  707. } catch (error) {
  708. console.error('提交失败:', error)
  709. message.error('提交失败')
  710. }
  711. }
  712. const handleClosed = () => {
  713. dialogVisible.value = false
  714. }
  715. const handleExport = () => {
  716. // 创建打印窗口
  717. const printWindow = window.open('', '_blank')
  718. if (!printWindow) {
  719. message.error('请允许弹出窗口')
  720. return
  721. }
  722. // 初筛项目数据
  723. const initialItems = [
  724. { name: '1. 近三个月有无饮食量变化', options: [{ score: 0, text: '严重增加或减少' }, { score: 1, text: '增加或减少' }, { score: 2, text: '无变化' }, { score: null, text: '—' }] },
  725. { 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' }] },
  726. { name: '3. 活动能力', options: [{ score: 0, text: '卧床' }, { score: 1, text: '需要依赖工具活动' }, { score: 2, text: '独立户外活动' }, { score: null, text: '—' }] },
  727. { name: '4. 牙齿状况', options: [{ score: 0, text: '全口或半口缺' }, { score: 1, text: '用义齿' }, { score: 2, text: '正常' }, { score: null, text: '—' }] },
  728. { name: '5. 神经精神疾病', options: [{ score: 0, text: '严重认知障碍或抑郁' }, { score: 1, text: '轻度认知障碍或抑郁' }, { score: 2, text: '无认知障碍或抑郁' }, { score: null, text: '—' }] },
  729. { 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' }] }
  730. ]
  731. // 评估项目数据
  732. const assessItems = [
  733. { name: '7. 患慢性病数>3种', options: [{ score: 0, text: '是' }, { score: null, text: '—' }, { score: 1, text: '否' }, { score: null, text: '—' }] },
  734. { name: '8. 服药时间在一个月以上的药物种类>3种', options: [{ score: 0, text: '是' }, { score: null, text: '—' }, { score: 1, text: '否' }, { score: null, text: '—' }] },
  735. { name: '9. 是否独居', options: [{ score: 0, text: '是' }, { score: null, text: '—' }, { score: 1, text: '否' }, { score: null, text: '—' }] },
  736. { name: '10. 睡眠时间', options: [{ score: 0, text: '<5h/d' }, { score: null, text: '—' }, { score: 1, text: '≥5h/d' }, { score: null, text: '—' }] },
  737. { name: '11. 户外独立活动时间', options: [{ score: 0, text: '<1h/d' }, { score: null, text: '—' }, { score: 1, text: '≥1h/d' }, { score: null, text: '—' }] },
  738. { name: '12. 文化程度', options: [{ score: 0, text: '小学及以下' }, { score: null, text: '—' }, { score: 1, text: '中学及以上' }, { score: null, text: '—' }] },
  739. { name: '13. 自我感觉经济状况', options: [{ score: 0, text: '差' }, { score: 0.5, text: '一般' }, { score: 1, text: '良好' }, { score: null, text: '—' }] },
  740. { name: '14. 进食能力', options: [{ score: 0, text: '依靠别人' }, { score: null, text: '—' }, { score: 1, text: '自行进食稍有困难' }, { score: 2, text: '自行进食' }] },
  741. { name: '15. 一天餐次', options: [{ score: 0, text: '1次' }, { score: null, text: '—' }, { score: 1, text: '2次' }, { score: 2, text: '3次及以上' }] },
  742. { name: '16. 每天摄入奶类/豆制品/鱼肉类', options: [{ score: 0, text: '0-1项' }, { score: 0.5, text: '2项' }, { score: 1, text: '3项' }, { score: null, text: '—' }] },
  743. { name: '17. 每天烹调油摄入量', options: [{ score: 0, text: '≥25g' }, { score: null, text: '—' }, { score: 1, text: '<25g' }, { score: null, text: '—' }] },
  744. { name: '18. 是否每天吃蔬菜水果500g及以上', options: [{ score: 0, text: '否' }, { score: null, text: '—' }, { score: 1, text: '是' }, { score: null, text: '—' }] },
  745. { name: '19. 小腿围', options: [{ score: 0, text: '<31cm' }, { score: null, text: '—' }, { score: 1, text: '≥31cm' }, { score: null, text: '—' }] },
  746. { name: '20. 腰围', options: [{ score: '男>90cm/女>80cm', text: '0分' }, { score: null, text: '—' }, { score: '男≤90cm/女≤80cm', text: '1分' }, { score: null, text: '—' }] }
  747. ]
  748. // 构建打印内容
  749. const printContent = `
  750. <!DOCTYPE html>
  751. <html>
  752. <head>
  753. <meta charset="UTF-8">
  754. <title>营养风险评估表 - ${dataForm.elderName || ''}</title>
  755. <style>
  756. @media print {
  757. @page { size: A4 portrait; margin: 15mm; }
  758. }
  759. body {
  760. font-family: 'SimSun', 'Microsoft YaHei', serif;
  761. font-size: 8pt;
  762. line-height: 1.2;
  763. color: #333;
  764. }
  765. .header {
  766. text-align: center;
  767. margin-bottom: 15px;
  768. border-bottom: 2px solid #333;
  769. padding-bottom: 10px;
  770. }
  771. .header h1 {
  772. font-size: 14pt;
  773. margin: 0;
  774. letter-spacing: 2px;
  775. }
  776. .info-section {
  777. margin-bottom: 15px;
  778. padding: 10px;
  779. border: 1px solid #999;
  780. background: #fafafa;
  781. }
  782. .info-row {
  783. display: flex;
  784. flex-wrap: wrap;
  785. gap: 20px;
  786. }
  787. .info-item {
  788. display: flex;
  789. align-items: center;
  790. }
  791. .info-item .label {
  792. font-weight: bold;
  793. margin-right: 8px;
  794. color: #555;
  795. }
  796. .info-item .value {
  797. border-bottom: 1px solid #333;
  798. min-width: 60px;
  799. padding: 0 5px;
  800. text-align: center;
  801. }
  802. .subsection-title {
  803. font-size: 11pt;
  804. font-weight: bold;
  805. margin: 15px 0 10px 0;
  806. padding: 5px 10px;
  807. background: #e8e8e8;
  808. border-left: 4px solid #409eff;
  809. }
  810. .assessment-table {
  811. width: 100%;
  812. border-collapse: collapse;
  813. margin-bottom: 15px;
  814. font-size: 7.5pt;
  815. }
  816. .assessment-table th, .assessment-table td {
  817. border: 1px solid #333;
  818. padding: 4px;
  819. text-align: center;
  820. vertical-align: middle;
  821. }
  822. .assessment-table th {
  823. background: #e8e8e8;
  824. font-weight: bold;
  825. }
  826. .assessment-table .col-item {
  827. width: 20%;
  828. font-weight: bold;
  829. background: #f5f5f5;
  830. text-align: left;
  831. }
  832. .assessment-table .col-score {
  833. width: 20%;
  834. }
  835. .initial-tip {
  836. margin: 10px 0;
  837. padding: 10px;
  838. border: 1px solid #999;
  839. background: #fff3cd;
  840. font-size: 9pt;
  841. }
  842. .score-value {
  843. color: #d9534f;
  844. font-weight: bold;
  845. font-size: 12pt;
  846. }
  847. .score-summary {
  848. margin: 15px 0;
  849. padding: 10px;
  850. border: 1px solid #999;
  851. background: #fafafa;
  852. }
  853. .summary-item {
  854. display: flex;
  855. justify-content: space-between;
  856. margin-bottom: 5px;
  857. }
  858. .summary-item .label {
  859. font-weight: bold;
  860. }
  861. .summary-item .value {
  862. font-weight: bold;
  863. }
  864. .summary-item .value.total {
  865. color: #d9534f;
  866. font-size: 14pt;
  867. }
  868. .scoring-standard {
  869. margin: 15px 0;
  870. padding: 10px;
  871. border: 1px solid #999;
  872. background: #fafafa;
  873. }
  874. .standard-title {
  875. font-weight: bold;
  876. margin-bottom: 8px;
  877. }
  878. .standard-content {
  879. font-size: 8pt;
  880. line-height: 1.5;
  881. }
  882. .standard-content p {
  883. margin: 3px 0;
  884. }
  885. .current-result {
  886. margin-top: 10px;
  887. padding-top: 10px;
  888. border-top: 1px solid #ccc;
  889. }
  890. .result-label {
  891. font-weight: bold;
  892. margin-right: 10px;
  893. }
  894. .assessor-section {
  895. margin: 15px 0;
  896. padding: 10px;
  897. border: 1px solid #999;
  898. background: #fafafa;
  899. }
  900. .assessor-row {
  901. display: flex;
  902. gap: 30px;
  903. }
  904. .assessor-item {
  905. display: flex;
  906. align-items: center;
  907. }
  908. .assessor-item .label {
  909. font-weight: bold;
  910. margin-right: 8px;
  911. }
  912. .assessor-item .value {
  913. border-bottom: 1px solid #333;
  914. min-width: 120px;
  915. padding: 0 5px;
  916. text-align: center;
  917. }
  918. </style>
  919. </head>
  920. <body>
  921. <div class="header">
  922. <h1>营养风险评估表</h1>
  923. </div>
  924. <div class="info-section">
  925. <div class="info-row">
  926. <div class="info-item">
  927. <span class="label">长者姓名:</span>
  928. <span class="value">${dataForm.elderName || ''}</span>
  929. </div>
  930. <div class="info-item">
  931. <span class="label">性别:</span>
  932. <span class="value">${dataForm.elderSex || ''}</span>
  933. </div>
  934. <div class="info-item">
  935. <span class="label">年龄:</span>
  936. <span class="value">${dataForm.elderAge || ''}</span>
  937. </div>
  938. <div class="info-item">
  939. <span class="label">床位号:</span>
  940. <span class="value">${dataForm.bedName || ''}</span>
  941. </div>
  942. <div class="info-item">
  943. <span class="label">评估日期:</span>
  944. <span class="value">${form.assessDate || ''}</span>
  945. </div>
  946. <div class="info-item">
  947. <span class="label">身高:</span>
  948. <span class="value">${form.height || ''} m</span>
  949. </div>
  950. <div class="info-item">
  951. <span class="label">体重:</span>
  952. <span class="value">${form.weight || ''} Kg</span>
  953. </div>
  954. <div class="info-item">
  955. <span class="label">BMI:</span>
  956. <span class="value">${form.bmi ? form.bmi.toFixed(1) : ''}</span>
  957. </div>
  958. </div>
  959. </div>
  960. <!-- 初筛部分 -->
  961. <div class="subsection-title">初筛(满分14分)</div>
  962. <table class="assessment-table">
  963. <thead>
  964. <tr>
  965. <th class="col-item">项目</th>
  966. <th class="col-score">0分</th>
  967. <th class="col-score">1分</th>
  968. <th class="col-score">2分</th>
  969. <th class="col-score">3分</th>
  970. </tr>
  971. </thead>
  972. <tbody>
  973. ${initialItems.map((item, index) => `
  974. <tr>
  975. <td class="col-item">${item.name}</td>
  976. ${item.options.map(opt => `
  977. <td class="col-score">${form.initialScores[index] === opt.score ? '☑' : '☐'} ${opt.text}</td>
  978. `).join('')}
  979. </tr>
  980. `).join('')}
  981. </tbody>
  982. </table>
  983. <div class="initial-tip">
  984. <p>总分14分,<12分提示有营养不良风险,继续以下评估;≥12分提示无营养不良风险,无需以下评估。</p>
  985. <p>初筛分数(小计满分14分):<span class="score-value">${form.initialScore}</span> 分</p>
  986. </div>
  987. <!-- 评估部分 -->
  988. <div class="subsection-title">评估(满分16分)</div>
  989. <table class="assessment-table">
  990. <thead>
  991. <tr>
  992. <th class="col-item">项目</th>
  993. <th class="col-score">0分</th>
  994. <th class="col-score">0.5分</th>
  995. <th class="col-score">1分</th>
  996. <th class="col-score">2分</th>
  997. </tr>
  998. </thead>
  999. <tbody>
  1000. ${assessItems.map((item, index) => `
  1001. <tr>
  1002. <td class="col-item">${item.name}</td>
  1003. ${item.options.map((opt, optIndex) => {
  1004. let isSelected = false
  1005. if (index < 11) {
  1006. isSelected = form.assessScores[index] === opt.score
  1007. } else if (index === 11) {
  1008. isSelected = form.measureScores[0] === opt.score
  1009. } else if (index === 12) {
  1010. isSelected = form.measureScores[1] === opt.score
  1011. } else if (index === 13) {
  1012. // 腰围特殊处理
  1013. if (optIndex === 0) isSelected = form.waistScore === 0 || form.waistScore === 2
  1014. if (optIndex === 2) isSelected = form.waistScore === 1 || form.waistScore === 3
  1015. }
  1016. return `<td class="col-score">${isSelected ? '☑' : '☐'} ${opt.text}</td>`
  1017. }).join('')}
  1018. </tr>
  1019. `).join('')}
  1020. </tbody>
  1021. </table>
  1022. <!-- 测量值 -->
  1023. <div class="info-section">
  1024. <div class="info-row">
  1025. <div class="info-item">
  1026. <span class="label">小腿围:</span>
  1027. <span class="value">${form.calfCircumference || ''} cm</span>
  1028. </div>
  1029. <div class="info-item">
  1030. <span class="label">腰围:</span>
  1031. <span class="value">${form.waistCircumference || ''} cm</span>
  1032. </div>
  1033. </div>
  1034. </div>
  1035. <!-- 分数汇总 -->
  1036. <div class="score-summary">
  1037. <div class="summary-item">
  1038. <span class="label">初筛分数(小计满分14分):</span>
  1039. <span class="value">${form.initialScore} 分</span>
  1040. </div>
  1041. <div class="summary-item">
  1042. <span class="label">评估分数(小计满分16分):</span>
  1043. <span class="value">${form.assessScore + form.measureScore} 分</span>
  1044. </div>
  1045. <div class="summary-item">
  1046. <span class="label">年龄调整(≥70岁加1分):</span>
  1047. <span class="value">${form.ageAdjust} 分</span>
  1048. </div>
  1049. <div class="summary-item">
  1050. <span class="label">量表总分(满分30分):</span>
  1051. <span class="value total">${form.totalScore} 分</span>
  1052. </div>
  1053. </div>
  1054. <!-- 评分标准 -->
  1055. <div class="scoring-standard">
  1056. <div class="standard-title">评分标准:</div>
  1057. <div class="standard-content">
  1058. <p>若初筛总分≥12分提示无营养不良风险,无需评估;</p>
  1059. <p>若初筛总分<12分提示有营养不良风险,继续评估;</p>
  1060. <p>若营养不良风险评估总分(初筛+评估)≥24分,表示营养状况良好;</p>
  1061. <p>若营养不良风险评估总分(初筛+评估)>24分,当BMI≥24(或男性腰围>90cm,女性腰围>80cm)时,提示可能是肥胖/超重型营养不良或有营养不良风险;</p>
  1062. <p>若营养不良风险评估总分(初筛+评估)17分~24分,表示有营养不良风险;</p>
  1063. <p>若营养不良风险评估总分(初筛+评估)≤17分,表示有营养不良。</p>
  1064. </div>
  1065. ${form.resultLevel ? `
  1066. <div class="current-result">
  1067. <span class="result-label">当前评估结果:</span>
  1068. <span class="score-value">${getResultText(form.resultLevel)}</span>
  1069. </div>
  1070. ` : ''}
  1071. </div>
  1072. <!-- 评估人签名 -->
  1073. <div class="assessor-section">
  1074. <div class="assessor-row">
  1075. <div class="assessor-item">
  1076. <span class="label">评估人签名:</span>
  1077. <span class="value">${form.assessor || ''}</span>
  1078. </div>
  1079. </div>
  1080. </div>
  1081. </body>
  1082. </html>
  1083. `
  1084. // 写入内容并打印
  1085. printWindow.document.write(printContent)
  1086. printWindow.document.close()
  1087. // 延迟打印,确保样式加载完成
  1088. setTimeout(() => {
  1089. printWindow.print()
  1090. }, 500)
  1091. }
  1092. const rules = {
  1093. elderName: [{ required: true, message: '请选择长者', trigger: 'change' }]
  1094. }
  1095. defineExpose({
  1096. open,
  1097. openEdit,
  1098. openDetail
  1099. })
  1100. </script>
  1101. <style scoped lang="scss">
  1102. .assessment-form {
  1103. padding: 0 20px;
  1104. .form-header {
  1105. margin-bottom: 20px;
  1106. .bmi-value {
  1107. font-size: 16px;
  1108. font-weight: bold;
  1109. color: #409eff;
  1110. }
  1111. }
  1112. .nutritional-section {
  1113. margin-bottom: 20px;
  1114. .section-title {
  1115. font-size: 18px;
  1116. font-weight: bold;
  1117. margin-bottom: 15px;
  1118. color: #333;
  1119. text-align: center;
  1120. border-bottom: 2px solid #409eff;
  1121. padding-bottom: 10px;
  1122. }
  1123. .subsection-title {
  1124. font-size: 16px;
  1125. font-weight: bold;
  1126. margin: 20px 0 10px 0;
  1127. color: #333;
  1128. border-left: 4px solid #409eff;
  1129. padding-left: 10px;
  1130. }
  1131. .assessment-table {
  1132. width: 100%;
  1133. border: 1px solid #e4e7ed;
  1134. border-radius: 4px;
  1135. border-collapse: collapse;
  1136. thead {
  1137. background-color: #f5f7fa;
  1138. font-weight: bold;
  1139. th {
  1140. padding: 12px;
  1141. border: 1px solid #e4e7ed;
  1142. text-align: center;
  1143. }
  1144. .col-item {
  1145. width: 20%;
  1146. }
  1147. .col-score-0,
  1148. .col-score-05,
  1149. .col-score-1,
  1150. .col-score-2,
  1151. .col-score-3 {
  1152. width: 20%;
  1153. }
  1154. }
  1155. tbody {
  1156. tr {
  1157. border-bottom: 1px solid #e4e7ed;
  1158. &:last-child {
  1159. border-bottom: none;
  1160. }
  1161. td {
  1162. padding: 12px;
  1163. border: 1px solid #e4e7ed;
  1164. }
  1165. .col-item {
  1166. padding-left: 30px;
  1167. text-align: left;
  1168. font-weight: bold;
  1169. vertical-align: middle;
  1170. }
  1171. .col-score {
  1172. padding-left: 30px;
  1173. text-align: left;
  1174. vertical-align: middle;
  1175. .el-radio {
  1176. white-space: normal;
  1177. line-height: 1.5;
  1178. height: auto;
  1179. margin-right: 0;
  1180. }
  1181. .waist-row {
  1182. margin-bottom: 5px;
  1183. &:last-child {
  1184. margin-bottom: 0;
  1185. }
  1186. .waist-label {
  1187. font-weight: bold;
  1188. margin-right: 10px;
  1189. }
  1190. }
  1191. }
  1192. }
  1193. }
  1194. }
  1195. .initial-tip {
  1196. margin: 15px 0;
  1197. padding: 15px;
  1198. background-color: #f5f7fa;
  1199. border-radius: 4px;
  1200. p {
  1201. margin: 5px 0;
  1202. }
  1203. .score-display {
  1204. font-weight: bold;
  1205. }
  1206. .score-value {
  1207. font-size: 18px;
  1208. font-weight: bold;
  1209. color: #409eff;
  1210. }
  1211. }
  1212. .measure-inputs {
  1213. margin: 15px 0;
  1214. padding: 15px;
  1215. background-color: #f5f7fa;
  1216. border-radius: 4px;
  1217. }
  1218. .age-adjust {
  1219. margin: 15px 0;
  1220. padding: 15px;
  1221. background-color: #f5f7fa;
  1222. border-radius: 4px;
  1223. .score-value {
  1224. font-size: 18px;
  1225. font-weight: bold;
  1226. color: #409eff;
  1227. }
  1228. }
  1229. .score-summary {
  1230. margin: 20px 0;
  1231. padding: 20px;
  1232. background-color: #f5f7fa;
  1233. border-radius: 4px;
  1234. border: 2px solid #409eff;
  1235. .summary-item {
  1236. margin: 10px 0;
  1237. font-size: 16px;
  1238. .label {
  1239. font-weight: bold;
  1240. }
  1241. .value {
  1242. font-size: 18px;
  1243. font-weight: bold;
  1244. color: #409eff;
  1245. &.total {
  1246. color: #f56c6c;
  1247. font-size: 20px;
  1248. }
  1249. }
  1250. }
  1251. }
  1252. .scoring-standard {
  1253. margin: 20px 0;
  1254. padding: 20px;
  1255. background-color: #f5f7fa;
  1256. border-radius: 4px;
  1257. .standard-title {
  1258. font-size: 16px;
  1259. font-weight: bold;
  1260. margin-bottom: 10px;
  1261. color: #333;
  1262. }
  1263. .standard-content {
  1264. p {
  1265. margin: 5px 0;
  1266. line-height: 1.6;
  1267. }
  1268. }
  1269. .current-result {
  1270. margin-top: 15px;
  1271. padding-top: 15px;
  1272. border-top: 1px solid #e4e7ed;
  1273. .result-label {
  1274. font-weight: bold;
  1275. margin-right: 10px;
  1276. }
  1277. }
  1278. }
  1279. .assessor-section {
  1280. margin-top: 20px;
  1281. padding: 15px;
  1282. border: 1px solid #e4e7ed;
  1283. border-radius: 4px;
  1284. }
  1285. }
  1286. .api-params-section {
  1287. margin-top: 30px;
  1288. padding: 20px;
  1289. background-color: #f5f7fa;
  1290. border: 1px solid #e4e7ed;
  1291. border-radius: 4px;
  1292. .section-title {
  1293. font-size: 16px;
  1294. font-weight: bold;
  1295. margin-bottom: 15px;
  1296. color: #333;
  1297. border-left: 4px solid #67c23a;
  1298. padding-left: 10px;
  1299. }
  1300. }
  1301. }
  1302. </style>