Print.vue 40 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122
  1. <template>
  2. <Dialog v-model="dialogVisible" title="预览" width="60%" scroll>
  3. <div class="synthetic-ability-print" id="printArea" v-loading="loading">
  4. <h2>老年人能力评估基本信息表</h2>
  5. <!-- 评估信息表 -->
  6. <div class="page">
  7. <h4>A.1 评估信息表</h4>
  8. <table style="width: 100%" border="2">
  9. <tr>
  10. <td style="width: 180px">A.1.1 评估编号</td>
  11. <td>{{ dataForm.evaluationCode }}</td>
  12. </tr>
  13. <tr>
  14. <td>A.1.2 评估基准日期</td>
  15. <td>{{ formatDate(dataForm.evaluatorDate, 'YYYY-MM-DD') }}</td>
  16. </tr>
  17. <tr v-if="dataForm.evaluationAgency == '1' && (templateType == 0 || templateType == 1)">
  18. <td>A.1.4 评估原因</td>
  19. <td>{{ getDictLabel(DICT_TYPE.EVALUATION_REASON, dataForm.evaluateReasons) }}</td>
  20. </tr>
  21. </table>
  22. </div>
  23. <!-- 评估对象基本信息表 -->
  24. <div class="page">
  25. <h4>A.2 评估对象基本信息表</h4>
  26. <table style="width: 100%" border="2">
  27. <tr>
  28. <td :colspan="templateType == 0 || templateType == 1 ? 2 : ''" style="width: 180px"
  29. >A.2.1 姓名</td
  30. >
  31. <td :style="templateType == 0 || templateType == 1 ? 'width: 100%' : ''">{{
  32. dataForm.elderName
  33. }}</td>
  34. </tr>
  35. <tr>
  36. <td :colspan="templateType == 0 || templateType == 1 ? 2 : ''" style="width: 180px"
  37. >A.2.2 性别</td
  38. >
  39. <td :style="templateType == 0 || templateType == 1 ? 'width: 100%' : ''">{{
  40. dataForm.elderSex == 1 ? '男' : '女'
  41. }}</td>
  42. </tr>
  43. <tr>
  44. <td :colspan="templateType == 0 || templateType == 1 ? 2 : ''" style="width: 180px"
  45. >A.2.3 出生日期</td
  46. >
  47. <td :style="templateType == 0 || templateType == 1 ? 'width: 100%' : ''">{{
  48. formatDate(dataForm.birthday, 'YYYY-MM-DD')
  49. }}</td>
  50. </tr>
  51. <template
  52. v-if="dataForm.evaluationAgency == 1 && (templateType == 0 || templateType == 1)"
  53. >
  54. <tr>
  55. <td colspan="2">A.2.4 身高</td>
  56. <td>{{ dataForm.elderHeight ? dataForm.elderHeight + ' cm' : '______cm' }}</td>
  57. </tr>
  58. <tr>
  59. <td colspan="2">A.2.5 体重</td>
  60. <td>{{ dataForm.elderWeight ? dataForm.elderWeight + ' kg' : '______kg' }}</td>
  61. </tr>
  62. <tr>
  63. <td colspan="2">A.2.6 民族</td>
  64. <td>{{ getDictLabel(DICT_TYPE.NATION_ARR, dataForm.nationId) }}</td>
  65. </tr>
  66. <tr>
  67. <td colspan="2">A.2.7 宗教信仰</td>
  68. <td>{{ getDictLabel(DICT_TYPE.RELIGIOUS_BELIEF_ARR, dataForm.religiousBelief) }}</td>
  69. </tr>
  70. <tr>
  71. <td colspan="2">A.2.8 公民身份号码</td>
  72. <td> {{ dataForm.idCard }}</td>
  73. </tr>
  74. <tr>
  75. <td colspan="2">A.2.9 文化程度</td>
  76. <td>
  77. <div class="flex">
  78. <div class="left">
  79. <span
  80. v-for="(item, d) in getIntDictOptions(DICT_TYPE.DEGREE_EDUCATION_ARR)"
  81. :key="item.value"
  82. :label="item.value"
  83. class="item-info"
  84. >{{ d + 1 }} {{ item.label }}</span
  85. >
  86. </div>
  87. <div class="right">{{
  88. findValueIndex(DICT_TYPE.DEGREE_EDUCATION_ARR, dataForm.degreeEducation)
  89. }}</div>
  90. </div>
  91. </td>
  92. </tr>
  93. <tr>
  94. <td colspan="2">A.2.10 居住情况</td>
  95. <td>
  96. <div class="flex">
  97. <div class="left">
  98. <span
  99. v-for="(item, d) in getStrDictOptions(DICT_TYPE.LIVE_ARR)"
  100. :key="item.value"
  101. :label="item.value"
  102. class="item-info"
  103. >{{ d + 1 }} {{ item.label }}</span
  104. >
  105. </div>
  106. <div class="right">{{
  107. findValueIndex(DICT_TYPE.LIVE_ARR, dataForm.liveSituation)
  108. }}</div>
  109. </div>
  110. </td>
  111. </tr>
  112. <tr>
  113. <td colspan="2">A.2.11 婚姻状况</td>
  114. <td>
  115. <div class="flex">
  116. <div class="left">
  117. <span
  118. v-for="(item, d) in getStrDictOptions(DICT_TYPE.MARITAL_STATUS_ARR)"
  119. :key="item.value"
  120. :label="item.value"
  121. class="item-info"
  122. >{{ d + 1 }} {{ item.label }}</span
  123. >
  124. </div>
  125. <div class="right">{{
  126. findValueIndex(DICT_TYPE.MARITAL_STATUS_ARR, dataForm.maritalStatus)
  127. }}</div>
  128. </div>
  129. </td>
  130. </tr>
  131. <tr>
  132. <td colspan="2">A.2.12 医疗费用支付方式(多选)</td>
  133. <td>
  134. <div class="flex">
  135. <div class="left">
  136. <span
  137. v-for="(item, d) in getStrDictOptions(DICT_TYPE.MEDICAL_INSURANCE_ARR)"
  138. :key="item.value"
  139. :label="item.value"
  140. class="item-info"
  141. >{{ d + 1 }} {{ item.label }}</span
  142. >
  143. </div>
  144. <div class="right">{{
  145. findValueIndex(DICT_TYPE.MEDICAL_INSURANCE_ARR, dataForm.medicalInsurance)
  146. }}</div>
  147. </div>
  148. </td>
  149. </tr>
  150. <tr>
  151. <td colspan="2">A.2.13 经济来源(多选)</td>
  152. <td>
  153. <div class="flex">
  154. <div class="left">
  155. <span
  156. v-for="(item, d) in getStrDictOptions(DICT_TYPE.ECONOMY_SOURCE_ARR)"
  157. :key="item.value"
  158. :label="item.value"
  159. class="item-info"
  160. >{{ d + 1 }} {{ item.label }}</span
  161. >
  162. </div>
  163. <div class="right">{{
  164. findValueIndex(DICT_TYPE.ECONOMY_SOURCE_ARR, dataForm.economySource)
  165. }}</div>
  166. </div>
  167. </td>
  168. </tr>
  169. <tr v-if="templateType != 8">
  170. <td width="60px" rowspan="5">A.2.14 近 30 天内照护风险事件</td>
  171. <td>A3.14.1 跌到</td>
  172. <td>{{ getDictLabel(DICT_TYPE.ACCIDENT_ARR, dataForm.accidentalFall) }}</td>
  173. </tr>
  174. <tr v-if="templateType != 8">
  175. <td>A3.14.2 走失</td>
  176. <td>{{ getDictLabel(DICT_TYPE.ACCIDENT_ARR, dataForm.accidentalLoss) }}</td>
  177. </tr>
  178. <tr v-if="templateType != 8">
  179. <td>A3.14.3 噎食</td>
  180. <td>{{ getDictLabel(DICT_TYPE.ACCIDENT_ARR, dataForm.accidentalChoking) }}</td>
  181. </tr>
  182. <tr v-if="templateType != 8">
  183. <td>A3.14.4 自杀、自伤</td>
  184. <td>{{ getDictLabel(DICT_TYPE.ACCIDENT_ARR, dataForm.accidentalSuicide) }}</td>
  185. </tr>
  186. <tr v-if="templateType != 8">
  187. <td>A3.14.5 其他</td>
  188. <td>{{ dataForm.accidentalOther }}</td>
  189. </tr>
  190. </template>
  191. </table>
  192. </div>
  193. <!-- 补充信息表:信息提供者、疾病诊断、长期服药、健康相关问题(仅能力评估大表填写这些字段) -->
  194. <div
  195. class="page"
  196. v-if="dataForm.evaluationAgency == '1' && (templateType == 0 || templateType == 1)"
  197. >
  198. <h4>A.3 补充信息表</h4>
  199. <table style="width: 100%" border="2">
  200. <tr>
  201. <td style="width: 180px">信息提供者姓名</td>
  202. <td>{{ dataForm.informationProviderName }}</td>
  203. <td style="width: 140px">与老年人关系</td>
  204. <td>{{ dataForm.relation }}</td>
  205. </tr>
  206. <tr>
  207. <td>联系人姓名</td>
  208. <td>{{ dataForm.contactName }}</td>
  209. <td>联系人电话</td>
  210. <td>{{ dataForm.contactPhone }}</td>
  211. </tr>
  212. <tr>
  213. <td>疾病诊断(可多选)</td>
  214. <td colspan="3">{{
  215. dictLabels(DICT_TYPE.DISEASE_DIAGNOSIS, dataForm.diseaseDiagnosis)
  216. }}</td>
  217. </tr>
  218. <tr>
  219. <td>长期服药情况</td>
  220. <td colspan="3">{{ medicationText(dataForm.medicationSituation) }}</td>
  221. </tr>
  222. <tr>
  223. <td>压力性损伤</td>
  224. <td>{{ getDictLabel(DICT_TYPE.PRESSURE_INJURY, dataForm.pressureInjury) }}</td>
  225. <td>关节活动度</td>
  226. <td>{{ motionOfJointText(dataForm.motionOfJoint) }}</td>
  227. </tr>
  228. <tr>
  229. <td>伤口情况(可多选)</td>
  230. <td>{{ dictLabels(DICT_TYPE.WOUND_SITUATION, dataForm.woundCondition) }}</td>
  231. <td>特殊护理情况(可多选)</td>
  232. <td>{{ dictLabels(DICT_TYPE.SPECIAL_CARE, dataForm.specialCareSituation) }}</td>
  233. </tr>
  234. <tr>
  235. <td>疼痛感</td>
  236. <td>{{ getDictLabel(DICT_TYPE.PAIN, dataForm.pain) }}</td>
  237. <td>牙齿缺失情况(可多选)</td>
  238. <td>{{ absenceOfTeethText(dataForm.absenceOfTeeth) }}</td>
  239. </tr>
  240. <tr>
  241. <td>义齿佩戴情况(可多选)</td>
  242. <td>{{ dictLabels(DICT_TYPE.DENTISTRY_WEAR, dataForm.dentureWearingCondition) }}</td>
  243. <td>吞咽困难的情形和症状(可多选)</td>
  244. <td>{{ dictLabels(DICT_TYPE.SYMPTOMS_DYSPHAGIA, dataForm.dysphagia) }}</td>
  245. </tr>
  246. <tr>
  247. <td>营养不良(BMI低于正常值)</td>
  248. <td>{{ getDictLabel(DICT_TYPE.COMMON_STATUS4, dataForm.malnutrition) }}</td>
  249. <td>清理呼吸道无效</td>
  250. <td>{{
  251. getDictLabel(DICT_TYPE.COMMON_STATUS4, dataForm.ineffectiveAirwayClearance)
  252. }}</td>
  253. </tr>
  254. <tr>
  255. <td>昏迷</td>
  256. <td>{{ getDictLabel(DICT_TYPE.COMMON_STATUS4, dataForm.coma) }}</td>
  257. <td>其他(请补充)</td>
  258. <td>{{ dataForm.otherSupplements }}</td>
  259. </tr>
  260. </table>
  261. </div>
  262. <template v-if="dataForm.evaluationAgency == '1'">
  263. <div class="page" v-for="(item, index) in temArr" :key="item.id + index">
  264. <h4>{{ item.name }}</h4>
  265. <table style="width: 100%" border="2">
  266. <template v-for="(l, index2) in item.list" :key="index2">
  267. <tr>
  268. <td colspan="2">{{
  269. l.type == 'input' ? l.title + ': ' + (l.value ? l.value : '') : l.title
  270. }}</td>
  271. </tr>
  272. <tr v-for="(r, i) in l.options" :key="index2 + i + l.title">
  273. <td
  274. :rowspan="l.options.length"
  275. v-if="i == 0"
  276. style="text-align: center; width: 50px"
  277. >{{ l.type == 'checkbox' ? (l.value ? l.value.join() : '') : l.value
  278. }}{{ l.type == 'checkbox' || index2 == 0 ? '' : '分' }}</td
  279. >
  280. <td>{{ r.label }}</td>
  281. </tr>
  282. </template>
  283. <!-- <tr>
  284. <td colspan="2">总计得分:{{ item.total }}分</td>
  285. </tr> -->
  286. </table>
  287. <div style="margin-top: 12px" v-if="templateType != 8">
  288. <table style="width: 100%" border="2">
  289. <tr>
  290. <td>{{ item.name }}小计:</td>
  291. </tr>
  292. <tr>
  293. <td>
  294. <div class="mb1">{{ item.total }}分</div>
  295. (上述{{ item.list.length }}个项目得分综合)
  296. </td>
  297. </tr>
  298. </table>
  299. <!-- <table style="width: 100%" border="2">-->
  300. <!-- <tr>-->
  301. <!-- <td :colspan="item.templateList.length">{{item.name}}分级</td>-->
  302. <!-- </tr>-->
  303. <!-- <tr>-->
  304. <!-- <td v-for="(t, u) in item.templateList" :key="u">-->
  305. <!-- <div>{{ item.propertiesName }}</div>-->
  306. <!-- <div>(总分{{ t.minValue }}-{{ t.maxValue }}分)</div>-->
  307. <!-- </td>-->
  308. <!-- </tr>-->
  309. <!-- </table>-->
  310. </div>
  311. <div v-if="templateType == 8" style="margin-top: 16px">
  312. <h4>评估结果</h4>
  313. <table style="width: 100%" border="2">
  314. <tr>
  315. <td style="width: 180px">能力评估最终等级</td>
  316. <td>
  317. {{ jsonRes.length > 0 ? jsonRes[0].value : '' }}-{{
  318. jsonRes.length > 0 ? jsonRes[0].dsc : ''
  319. }}</td
  320. >
  321. </tr>
  322. <tr>
  323. <td style="width: 180px">照护评估最终等级</td>
  324. <td> {{ jsonRes.length > 0 ? jsonRes[9].value : '' }}</td>
  325. </tr>
  326. <tr>
  327. <td style="width: 180px">护理等级</td>
  328. <td>
  329. {{
  330. dataForm.recommendedNursingLevel
  331. ? findValue(
  332. nurseLevelList,
  333. dataForm.recommendedNursingLevel,
  334. 'id',
  335. 'nurseLevelName'
  336. )
  337. : dataForm && dataForm.elder && dataForm.elder.nurseLevelName
  338. ? dataForm.elder.nurseLevelName
  339. : ''
  340. }}</td
  341. >
  342. </tr>
  343. <tr>
  344. <td style="width: 180px">日常生活评估等级</td>
  345. <td>
  346. {{ jsonRes.length > 0 ? jsonRes[1].dsc : '' }}({{
  347. jsonRes.length > 0 ? jsonRes[1].value + '分' : ''
  348. }})</td
  349. >
  350. </tr>
  351. <tr>
  352. <td style="width: 180px">认知能力评估等级</td>
  353. <td>
  354. {{ jsonRes.length > 0 ? jsonRes[2].dsc : '' }}({{
  355. jsonRes.length > 0 ? jsonRes[2].value + '分' : ''
  356. }})</td
  357. >
  358. </tr>
  359. <tr>
  360. <td style="width: 180px">感知与沟通评估等级</td>
  361. <td>
  362. {{ jsonRes.length > 0 ? jsonRes[3].dsc : '' }}({{
  363. jsonRes.length > 0 ? jsonRes[3].value + '分' : ''
  364. }})</td
  365. >
  366. </tr>
  367. <tr>
  368. <td style="width: 180px">健康状况评估等级</td>
  369. <td> {{ jsonRes.length > 0 ? jsonRes[4].dsc : '' }}</td>
  370. </tr>
  371. <tr>
  372. <td style="width: 180px">社会支持评估等级</td>
  373. <td>
  374. {{ jsonRes.length > 0 ? jsonRes[7].dsc : '' }}({{
  375. jsonRes.length > 0 ? jsonRes[7].value + '分' : ''
  376. }})</td
  377. >
  378. </tr>
  379. </table>
  380. <table style="width: 100%; margin-top: 10px">
  381. <tr>
  382. <td colspan="3">
  383. <div class="flex-column">
  384. <div class="flex" style="padding: 16px 0;">
  385. <span>评估员签名____________________{{ dataForm.evaluator }}____________________</span>
  386. <span
  387. >日期___{{ evaluatorDateList[0] }}___年___{{
  388. evaluatorDateList[1]
  389. }}___月___{{ evaluatorDateList[2] }}___日</span
  390. >
  391. </div>
  392. <!-- <div class="flex">-->
  393. <!-- <span>家属签名____________________</span>-->
  394. <!-- <span>日期_________年_________月_________日</span>-->
  395. <!-- </div>-->
  396. </div>
  397. </td>
  398. </tr>
  399. </table>
  400. </div>
  401. </div>
  402. </template>
  403. <div v-else class="page">
  404. <h4>第三方评估报告</h4>
  405. <template v-for="(item, index) in dataForm.syntheticAbilityInfoList" :key="index">
  406. <table style="width: 100%" border="2">
  407. <tr>
  408. <td style="width: 100px">附件名称</td>
  409. <td>{{ item.fileName }}</td>
  410. </tr>
  411. <tr>
  412. <td>最终评估等级</td>
  413. <td>{{ item.evaluationLevel }}</td>
  414. </tr>
  415. <tr>
  416. <td>推荐护理等级</td>
  417. <td>{{ findValue(nurseLevelList, item.nursingLevel, 'id', 'nurseLevelName') }}</td>
  418. </tr>
  419. <tr>
  420. <td>附件内容</td>
  421. <td>
  422. <a :href="item.fileUrl">{{ item.fileName }}</a>
  423. </td>
  424. </tr>
  425. </table>
  426. </template>
  427. </div>
  428. <!-- 能力评估报告 -->
  429. <div class="page" v-if="dataForm.evaluationAgency == '1' && templateType != 8">
  430. <h4>C.老年人能力评估报告</h4>
  431. <table style="width: 100%" border="2">
  432. <tr>
  433. <td style="width: 200px">C.1一级指标分级</td>
  434. <td v-for="(c, index) in cellArr" :key="index" class="t-flex" style="border: none">
  435. <div
  436. v-for="(item, i) in c"
  437. :key="i"
  438. class="flex-1"
  439. style="display: flex; align-items: center; height: 100%"
  440. >
  441. {{ item.evaluationName }} <span v-if="item.evaluationName"> </span>
  442. </div>
  443. </td>
  444. </tr>
  445. <!-- <tr>-->
  446. <!-- <td>C.2老年人能力初步等级</td>-->
  447. <!-- <td colspan="2">-->
  448. <!-- <div class="flex">-->
  449. <!-- <div class="left">-->
  450. <!-- <span-->
  451. <!-- v-for="(item, index) in evaluations"-->
  452. <!-- :key="index"-->
  453. <!-- :label="item.value"-->
  454. <!-- class="item-info"-->
  455. <!-- >-->
  456. <!-- {{ calculateGradingSystem(dataForm.processSequenceList||[],templateType,dataForm.totalScore) }} (总分: {{dataForm.totalScore}})-->
  457. <!-- </span-->
  458. <!-- >-->
  459. <!-- </div>-->
  460. <!-- <div class="right">{{ active }}</div>-->
  461. <!-- </div>-->
  462. <!-- </td>-->
  463. <!-- </tr>-->
  464. <!-- <tr>-->
  465. <!-- <td>C.3等级变更条款</td>-->
  466. <!-- <td colspan="2">-->
  467. <!-- <div>-->
  468. <!-- <span>1.有认知障碍/痴呆、精神疾病者,在原有能力级别上提高一个等级。</span>-->
  469. <!-- <span>2.近30天内发生过2次及以上跌倒、食、自杀、走失者,在原有能力级别上提高一个等级。</span>-->
  470. <!-- <span>3.处于昏迷状态者,直接评定为重度失能。</span>-->
  471. <!-- <span>若初步等级确定为“3重度失能”,则不考虑上述1-3中各情况对最终等级的影响,等级不再提高。</span>-->
  472. <!-- </div>-->
  473. <!-- </td>-->
  474. <!-- </tr>-->
  475. <tr>
  476. <td>C.2老年人能力最终等级</td>
  477. <td colspan="2">
  478. <div class="flex">
  479. <div class="left">
  480. <span
  481. v-for="(item, index) in evaluations"
  482. :key="index"
  483. :label="item.value"
  484. class="item-info"
  485. >
  486. {{
  487. calculateGradingSystem(
  488. dataForm.processSequenceList || [],
  489. templateType,
  490. dataForm.totalScore
  491. )
  492. }}
  493. (总分: {{ dataForm.totalScore }})
  494. </span>
  495. </div>
  496. <!-- <div class="right">-->
  497. <!-- {{ active }}-->
  498. <!-- </div>-->
  499. </div>
  500. </td>
  501. </tr>
  502. <tr>
  503. <td colspan="3">
  504. <div class="flex-column">
  505. <div class="flex" style="padding: 16px 0;">
  506. <span>评估员签名____________________{{ dataForm.evaluator }}____________________</span>
  507. <span
  508. >日期___{{ evaluatorDateList[0] }}___年___{{
  509. evaluatorDateList[1]
  510. }}___月___{{ evaluatorDateList[2] }}___日</span
  511. >
  512. </div>
  513. <div class="flex">
  514. <span>家属签名____________________</span>
  515. <span>日期_________年_________月_________日</span>
  516. </div>
  517. </div>
  518. </td>
  519. </tr>
  520. <tr>
  521. <td colspan="3">
  522. <span class="ml5">注:老年人能力初步等级划分标准</span>
  523. <div class="mt5" v-if="templateType == 0">
  524. <template v-for="(item, index) in descArr" :key="item.label">
  525. <b>{{ index }} {{ item.label }}:</b>
  526. <div v-for="c in item.desc" :key="c" class="ml5 mb2 mt2">{{ c }}</div>
  527. </template>
  528. </div>
  529. <div v-if="templateType == 1">
  530. <div class="elderly-level-table">
  531. <!-- 一级指标等级评估表 -->
  532. <table>
  533. <thead>
  534. <tr>
  535. <th>一级指标</th>
  536. <th>能力完好</th>
  537. <th>轻度受损</th>
  538. <th>中度受损</th>
  539. <th>重度受损</th>
  540. </tr>
  541. </thead>
  542. <tbody>
  543. <tr>
  544. <td>日常生活活动能力(B1)</td>
  545. <td>100分</td>
  546. <td>65-95分</td>
  547. <td>45-60分</td>
  548. <td>0-40分</td>
  549. </tr>
  550. <tr>
  551. <td>认知能力(B2)</td>
  552. <td>16分</td>
  553. <td>4-15分</td>
  554. <td>2-3分</td>
  555. <td>0-1分</td>
  556. </tr>
  557. <tr>
  558. <td>感知觉与沟通能力(B3)</td>
  559. <td>12分</td>
  560. <td>4-11分</td>
  561. <td>2-3分</td>
  562. <td>0-1分</td>
  563. </tr>
  564. </tbody>
  565. </table>
  566. <!-- 失能等级对应表 -->
  567. <table style="margin-top: 20px">
  568. <thead>
  569. <tr>
  570. <th colspan="2"></th>
  571. <th colspan="4">B2/B3 (以失能等级严重的判断)</th>
  572. </tr>
  573. <tr>
  574. <th>B1失能等级</th>
  575. <th>B2/B3失能等级</th>
  576. <th>能力完好</th>
  577. <th>轻度受损</th>
  578. <th>中度受损</th>
  579. <th>重度受损</th>
  580. </tr>
  581. </thead>
  582. <tbody>
  583. <tr>
  584. <td rowspan="4">B1失能等级</td>
  585. <td>能力完好</td>
  586. <td>0级</td>
  587. <td>0级</td>
  588. <td>1级</td>
  589. <td>1级</td>
  590. </tr>
  591. <tr>
  592. <td>轻度受损</td>
  593. <td>1级</td>
  594. <td>1级</td>
  595. <td>1级</td>
  596. <td>2级</td>
  597. </tr>
  598. <tr>
  599. <td>中度受损</td>
  600. <td>2级</td>
  601. <td>2级</td>
  602. <td>2级</td>
  603. <td>3级</td>
  604. </tr>
  605. <tr>
  606. <td>重度受损</td>
  607. <td>3级</td>
  608. <td>3级</td>
  609. <td>4级</td>
  610. <td>5级</td>
  611. </tr>
  612. </tbody>
  613. </table>
  614. <!-- 老年人能力等级对应表 -->
  615. <div style="margin-top: 20px">
  616. <h4>老年人能力等级对应</h4>
  617. <div class="level-descriptions">
  618. <div v-for="(item, index) in syntheticAbilityRecord2" :key="index">
  619. <div style="margin-bottom: 10px">
  620. <span>{{ item.label }}: {{ item.des }}</span>
  621. </div>
  622. </div>
  623. </div>
  624. </div>
  625. </div>
  626. </div>
  627. <div style="padding: 18px" v-else>
  628. {{ getAbilityDesc(templateType) }}
  629. </div>
  630. </td>
  631. </tr>
  632. </table>
  633. </div>
  634. </div>
  635. <template #footer>
  636. <el-button @click="handleClosed">取消</el-button>
  637. <el-button type="primary" v-print="print">打印</el-button>
  638. </template>
  639. </Dialog>
  640. </template>
  641. <script setup lang="ts">
  642. import {
  643. DICT_TYPE,
  644. getDictLabel,
  645. getDictOptions,
  646. getIntDictOptions,
  647. getStrDictOptions
  648. } from '@/utils/dict'
  649. import { getSyntheticAbilityInfoById } from '@/api/elderly/assess/synthetic-ability'
  650. import { getElderInfoById } from '@/api/elderly/elder/elderly-Info'
  651. import { formatDate } from '@/utils/formatTime'
  652. import { getEvaluationProcessConfigList } from '@/api/elderly/assess/evaluation-process'
  653. import { getEvaluationTemplatesConfigList } from '@/api/elderly/assess/evaluation-process'
  654. import { calculateGradingSystem, getAbilityDesc, getTemplateType } from '@/utils/evaluation'
  655. import { formatTimestampYMD } from '@/utils/dateUtil'
  656. import { getNursingLevelPage } from '@/api/elderly/nursing'
  657. const message = useMessage() // 消息弹窗
  658. const { t } = useI18n() // 国际化
  659. const templateType = ref(0)
  660. const dialogVisible = ref(false) // 弹窗
  661. const dataForm = ref({}) // 表单字段
  662. const loading = ref(false) // 表单的加载中
  663. const temArr = ref([])
  664. const dateList = ref([])
  665. // 评估员签名一行的日期取「评估基准日期」
  666. const evaluatorDateList = computed(() => {
  667. const d = (dataForm.value as any).evaluatorDate ? formatDate((dataForm.value as any).evaluatorDate, 'YYYY-MM-DD') : ''
  668. return d ? d.split('-') : ['', '', '']
  669. })
  670. const descArr = ref([
  671. {
  672. label: '能力完好',
  673. desc: ['日常生活活动、精神状态,感知觉与沟通分级均为0,社会参与分级为0或1']
  674. },
  675. {
  676. label: '轻度失能',
  677. desc: [
  678. '日常生活活动分级为 0,但精神状态,感知觉与沟通中至少一项为1及以上,或者社会参与的分级为 2',
  679. '日常生活活动分级为 1,精神状态,感知觉与沟通、社会参与中至少有意向的分级为0或1'
  680. ]
  681. },
  682. {
  683. label: '能力完好',
  684. desc: [
  685. '日常生活活动分级为 1,但精神状态,感知觉与沟通、社会参与均为2,或有一项为 3',
  686. '日常生活活动分级为 2,且精神状态,感知觉与沟通、社会参与中有1~2项的分级为 1或2'
  687. ]
  688. },
  689. {
  690. label: '能力完好',
  691. desc: [
  692. '日常生活活动的分级为 3:或日常生活活动、精神状态、感知觉与沟通、社会参与分级均为 2',
  693. '日常生活活动分级为 2,且精神状态、感知觉与沟通、社会参与中至少有一项分级为 3'
  694. ]
  695. }
  696. ])
  697. const active = ref()
  698. let syntheticAbilityInfoListTemp = []
  699. // 广州标准的老年人能力等级划分
  700. const syntheticAbilityRecord2 = [
  701. { label: '0级', des: '基本正常', record: '能力完好' },
  702. { label: '1级', des: '轻度失能', record: '能力轻度受损' },
  703. { label: '2级', des: '中度失能', record: '能力中度受损' },
  704. { label: '3级', des: '重度失能I级', record: '能力重度受损' },
  705. { label: '4级', des: '重度失能II级', record: '能力重度受损' },
  706. { label: '5级', des: '重度失能III级', record: '能力重度受损' }
  707. ]
  708. // 打印
  709. const print = {
  710. id: 'printArea',
  711. extraCss: '',
  712. popTitle: '', // 打印配置页上方的标题
  713. extraHead: '', // 最上方的头部文字,附加在head标签上的额外标签,使用逗号分割
  714. preview: false, // 是否启动预览模式,默认是false
  715. previewTitle: '能力评估', // 打印预览的标题
  716. previewPrintBtnLabel: '预览结束,开始打印', // 打印预览的标题下方的按钮文本,点击可进入打印
  717. zIndex: 20002, // 预览窗口的z-index,默认是20002,最好比默认值更高
  718. previewBeforeOpenCallback() {
  719. console.log('正在加载预览窗口!')
  720. }, // 预览窗口打开之前的callback
  721. previewOpenCallback() {
  722. console.log('已经加载完预览窗口,预览打开了!')
  723. }, // 预览窗口打开时的callback
  724. beforeOpenCallback() {
  725. console.log('开始打印之前!')
  726. }, // 开始打印之前的callback
  727. openCallback() {
  728. console.log('执行打印了!')
  729. }, // 调用打印时的callback
  730. closeCallback() {
  731. console.log('关闭了打印工具!')
  732. }, // 关闭打印的callback(无法区分确认or取消)
  733. clickMounted() {
  734. console.log('点击v-print绑定的按钮了!')
  735. },
  736. standard: ''
  737. }
  738. const loadTemplatesConfigList = async (id) => {
  739. const res = await getEvaluationTemplatesConfigList({
  740. pageNo: 1,
  741. pageSize: 20,
  742. evaluationTemplateId: id
  743. })
  744. return res
  745. }
  746. const evaluations: any = ref([])
  747. // 大表评估
  748. const getEvaluationList = async (id) => {
  749. const res = await getEvaluationProcessConfigList({
  750. pageNo: 1,
  751. pageSize: 20,
  752. evaluationProcessId: id
  753. })
  754. evaluations.value = [...res, { propertiesName: '未评估' }]
  755. }
  756. const cellNum = ref()
  757. const cellArr = ref([])
  758. const jsonRes = ref([])
  759. /** 打开弹窗 */
  760. const open = async (id) => {
  761. dialogVisible.value = true
  762. templateType.value = 0
  763. try {
  764. loading.value = true
  765. const res = await getSyntheticAbilityInfoById(id)
  766. // 基础信息字段强制从长者信息接口获取,评估记录仅兜底
  767. const resElder = res.elder || {}
  768. const elderInfo = res.elderId ? await getElderInfoById(res.elderId) : {}
  769. const pick = (key: string) => {
  770. for (const v of [elderInfo[key], resElder[key], res[key]]) {
  771. if (v !== undefined && v !== null && v !== '') return v
  772. }
  773. return ''
  774. }
  775. dataForm.value = {
  776. ...resElder,
  777. ...res,
  778. elderSex: pick('elderSex'),
  779. papersType: pick('papersType'),
  780. idCard: pick('idCard'),
  781. birthday: pick('birthday'),
  782. elderAge: pick('elderAge'),
  783. nationId: pick('nationId'),
  784. elderHeight: pick('elderHeight'),
  785. elderWeight: pick('elderWeight'),
  786. religiousBelief: pick('religiousBelief'),
  787. degreeEducation: pick('degreeEducation'),
  788. maritalStatus: pick('maritalStatus'),
  789. liveSituation: pick('liveSituation'),
  790. economySource: pick('economySource'),
  791. medicalInsurance: pick('medicalInsurance'),
  792. elderName: pick('elderName')
  793. }
  794. syntheticAbilityInfoListTemp = res.syntheticAbilityInfoList
  795. // 打印的标题
  796. print.popTitle = +'-' + res.questionnaireName
  797. // 本院评估
  798. if (res.evaluationAgency == 1) {
  799. await getEvaluationList(res.questionnaireId)
  800. templateType.value = getTemplateType(res.processSequenceList)
  801. console.log('模板A:', templateType.value)
  802. if (templateType.value == 8) {
  803. //一套表
  804. try {
  805. jsonRes.value = JSON.parse(res.result)
  806. } catch (e) {}
  807. }
  808. try {
  809. dateList.value = formatTimestampYMD(res.createDate).split('-')
  810. } catch (e) {}
  811. // 形成一个对象,把标题抽出来
  812. res.syntheticAbilityInfoList.map((item, index) => {
  813. // if(item.evaluationName.includes('广州')){
  814. // templateType.value=1
  815. // }
  816. let obj = { list: [], templateList: [] }
  817. obj.name = item.evaluationName
  818. obj.id = item.id
  819. obj.total = 0
  820. JSON.parse(item.evaluationContent).map((e) => {
  821. if (e.type == 'radio' || e.type == 'checkbox' || e.type == 'input') {
  822. obj.list.push({
  823. value: e.value,
  824. title: e.title,
  825. options: e.options,
  826. info: e.info,
  827. type: e.type
  828. })
  829. obj.total += !isNaN(e.value) ? Number(e.value) : 0
  830. }
  831. })
  832. temArr.value.push(obj)
  833. res.processSequenceList.map(async (r) => {
  834. if (r.templateName == item.evaluationName) {
  835. temArr.value[index].templateList = await loadTemplatesConfigList(r.templateId)
  836. }
  837. })
  838. })
  839. cellArr.value = getArr(res.syntheticAbilityInfoList)
  840. if (res.syntheticAbilityInfoList.length % 2 != 0) {
  841. cellArr.value[cellArr.value.length - 1].push({})
  842. }
  843. // 找到对应的分数段
  844. evaluations.value.map((item, index) => {
  845. if (item.propertiesName == dataForm.value.result) {
  846. active.value = index
  847. }
  848. })
  849. } else {
  850. }
  851. await getNurseLevelList()
  852. } finally {
  853. loading.value = false
  854. }
  855. }
  856. defineExpose({ open }) // 提供 open 方法,用于打开弹窗
  857. // 转化为二维数组
  858. const getArr = (arr) => {
  859. const bigArr = []
  860. let smallArr = []
  861. arr.forEach((item) => {
  862. // 将小数组的内容存放到大数组中,且只存放一次【判断小数组是否为空,如果为空就需要往大数组中添加,如果小数组不为空,那么就不会往大数组中添加】
  863. if (smallArr.length === 0) {
  864. bigArr.push(smallArr)
  865. }
  866. smallArr.push(item)
  867. if (smallArr.length === 2) {
  868. smallArr = []
  869. }
  870. })
  871. return bigArr
  872. }
  873. // 匹配对应的值
  874. const findValue = (arr, value, key = 'id', name = 'label') => {
  875. if (arr) {
  876. let item = arr.find((item) => item[key] == value)
  877. return item ? item[name] : ''
  878. }
  879. return ''
  880. }
  881. // 解析 JSON 字符串数组(兼容已是数组或逗号分隔字符串的情况)
  882. const parseArr = (val: any): any[] => {
  883. if (!val) return []
  884. if (Array.isArray(val)) return val
  885. try {
  886. const arr = JSON.parse(val)
  887. return Array.isArray(arr) ? arr : []
  888. } catch (e) {
  889. return String(val)
  890. .split(',')
  891. .filter((v) => v !== '')
  892. }
  893. }
  894. // 字典值数组转标签文本,支持 '99-自定义内容' 形式
  895. const dictLabels = (dictType: string, val: any): string => {
  896. return parseArr(val)
  897. .map((v: any) => {
  898. const idx = String(v).indexOf('-')
  899. if (idx > -1) {
  900. const code = String(v).slice(0, idx)
  901. const extra = String(v).slice(idx + 1)
  902. return (getDictLabel(dictType, code) || code) + ':' + extra
  903. }
  904. return getDictLabel(dictType, v) || v
  905. })
  906. .join('、')
  907. }
  908. // 牙齿缺失情况(0-3 为表单固定值,2-x/3-x 为字典值)
  909. const absenceOfTeethText = (val: any): string => {
  910. const map = { 0: '无缺损', 1: '牙体缺损(如龋齿、楔状缺损)', 2: '牙列缺损', 3: '牙列缺失' }
  911. return parseArr(val)
  912. .map((v: any) => {
  913. const idx = String(v).indexOf('-')
  914. if (idx > -1) {
  915. const code = String(v).slice(0, idx)
  916. const extra = String(v).slice(idx + 1)
  917. const label = map[code] || code
  918. if (code === '2')
  919. return label + ':' + (getDictLabel(DICT_TYPE.DEFECT_OF_DENTITION, extra) || extra)
  920. if (code === '3')
  921. return label + ':' + (getDictLabel(DICT_TYPE.DENTISTRY_MISSING, extra) || extra)
  922. return label + ':' + extra
  923. }
  924. return map[v] || v
  925. })
  926. .join('、')
  927. }
  928. // 关节活动度(1-部位 形式)
  929. const motionOfJointText = (val: any): string => {
  930. if (!val) return ''
  931. const idx = String(val).indexOf('-')
  932. const code = idx > -1 ? String(val).slice(0, idx) : String(val)
  933. const extra = idx > -1 ? String(val).slice(idx + 1) : ''
  934. if (code === '0') return '无,没有影响日常生活功能'
  935. if (code === '1') return '是,影响日常生活功能' + (extra ? ',部位:' + extra : '')
  936. if (code === '2') return '无法判断'
  937. return String(val)
  938. }
  939. // 长期服药情况(对象数组:药品名称/服药方法/用药剂量/用药频次)
  940. const medicationText = (val: any): string => {
  941. return parseArr(val)
  942. .map((item: any) =>
  943. typeof item === 'object'
  944. ? [item.drugName, item.takeMedicine, item.dosage, item.frequency]
  945. .filter(Boolean)
  946. .join(' / ')
  947. : String(item)
  948. )
  949. .filter(Boolean)
  950. .join(';')
  951. }
  952. // 找到对应值的序号(按字典 value 匹配,兼容按 label 匹配)
  953. const findValueIndex = (arr, value) => {
  954. if (value) {
  955. const options = getDictOptions(arr)
  956. let index = options.findIndex((item) => item.value == value)
  957. if (index == -1) {
  958. index = options.findIndex((item) => item.label == value)
  959. }
  960. if (index > -1) {
  961. return index + 1
  962. }
  963. return ''
  964. }
  965. return ''
  966. }
  967. const nurseLevelList = ref([])
  968. // 获取等级
  969. const getNurseLevelList = async () => {
  970. try {
  971. const data = await getNursingLevelPage({
  972. pageNum: 1,
  973. pageSize: 100
  974. })
  975. nurseLevelList.value = data.list
  976. } finally {
  977. }
  978. }
  979. const handleClosed = () => {
  980. dialogVisible.value = false
  981. temArr.value = []
  982. }
  983. </script>
  984. <style media="print" lang="scss">
  985. @page {
  986. // size: auto;
  987. margin: 3mm;
  988. margin-top: 2cm;
  989. margin-bottom: 2cm;
  990. }
  991. @media print {
  992. html {
  993. background-color: #ffffff;
  994. height: auto;
  995. margin: 0;
  996. }
  997. .synthetic-ability-print {
  998. padding: 10px 15px;
  999. }
  1000. }
  1001. </style>
  1002. <style lang="scss" scoped>
  1003. .synthetic-ability-print {
  1004. h2 {
  1005. text-align: center;
  1006. font-size: 18px;
  1007. }
  1008. .page {
  1009. padding: 20px;
  1010. table:not([cellpadding]) td,
  1011. table:not([cellpadding]) th {
  1012. padding: 0.7rem;
  1013. }
  1014. h4 {
  1015. font-size: 16px;
  1016. }
  1017. .info {
  1018. display: flex;
  1019. .left,
  1020. .right {
  1021. flex: 1;
  1022. }
  1023. p {
  1024. padding: 10px 0;
  1025. }
  1026. }
  1027. .item-info {
  1028. display: inline-block;
  1029. margin-right: 15px;
  1030. }
  1031. .flex {
  1032. display: flex;
  1033. align-items: center;
  1034. .left {
  1035. flex: 23;
  1036. }
  1037. .right {
  1038. flex: 1;
  1039. text-align: center;
  1040. height: 22px;
  1041. width: 22px;
  1042. border: 1px solid;
  1043. border-radius: 5px;
  1044. }
  1045. }
  1046. .flex-column {
  1047. display: flex;
  1048. flex-direction: column;
  1049. .flex {
  1050. display: flex;
  1051. justify-content: space-between;
  1052. padding: 5px 0;
  1053. }
  1054. }
  1055. .grid {
  1056. display: grid;
  1057. grid-template-columns: 1fr 3fr;
  1058. gap: 10px;
  1059. margin-top: 10px;
  1060. }
  1061. .t-flex {
  1062. display: flex;
  1063. .flex-1 {
  1064. flex: 1;
  1065. }
  1066. }
  1067. }
  1068. .table {
  1069. page-break-after: always; /* 可以尝试使用此属性来强制分页 */
  1070. }
  1071. }
  1072. .elderly-level-table table {
  1073. width: 100%;
  1074. border-collapse: collapse;
  1075. margin-bottom: 10px;
  1076. }
  1077. .elderly-level-table th,
  1078. .elderly-level-table td {
  1079. border: 1px solid #ddd;
  1080. padding: 8px 12px;
  1081. text-align: center;
  1082. }
  1083. .elderly-level-table th {
  1084. background-color: #f5f7fa;
  1085. font-weight: bold;
  1086. }
  1087. .elderly-level-table tr:nth-child(even) {
  1088. background-color: #fafafa;
  1089. }
  1090. .level-descriptions {
  1091. margin-top: 10px;
  1092. }
  1093. </style>