majorIndex.vue 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973
  1. <template>
  2. <div class="box">
  3. <div class="box_left">
  4. <!-- <div class="box_card mb16">
  5. <el-form :inline="true" :model="mForm" class="demo-form-inline">
  6. <el-form-item label="出院时间" style="margin-bottom: 16px; margin-right: 0;">
  7. <el-date-picker
  8. v-model="mForm.startTime"
  9. type="date"
  10. format="yyyy年MM月dd日"
  11. value-format="yyyyMMdd"
  12. placeholder="开始日期"
  13. style="width: 170px;">
  14. </el-date-picker>
  15. <el-date-picker
  16. v-model="mForm.endTime"
  17. type="date"
  18. style="margin-left: 10px; width: 170px; margin-right: 0;"
  19. format="yyyy年MM月dd日"
  20. value-format="yyyyMMdd"
  21. placeholder="结束日期">
  22. </el-date-picker>
  23. </el-form-item>
  24. </el-form>
  25. <div class="text-right">
  26. <el-button type="primary" plain @click="alertText">导出全部指标</el-button>
  27. <el-button type="primary" plain @click="alertText">导出全部详情</el-button>
  28. </div>
  29. </div> -->
  30. <div class="box_card tree-box">
  31. <el-input placeholder="输入关键字进行过滤" v-model="filterText"></el-input>
  32. <el-tree
  33. default-expand-all
  34. class="filter-tree"
  35. node-key="id"
  36. highlight-current
  37. :data="treeData"
  38. :props="defaultProps"
  39. :filter-node-method="filterNode"
  40. ref="tree"
  41. @node-click="handleNodeClick"
  42. :current-node-key="defaultOpenId"
  43. :default-expanded-keys="[defaultOpenId]"
  44. :render-content="renderContent"
  45. >
  46. </el-tree>
  47. </div>
  48. </div>
  49. <div class="box_right">
  50. <div class="box_card mb16">
  51. <el-form :inline="true" :model="formInline" class="demo-form-inline">
  52. <el-form-item label="">
  53. <el-dropdown>
  54. <el-button :class="formInline.year.name ? 'color-btn' : ''">
  55. {{ formInline.year.name || '按年' }}
  56. <i class="el-icon-arrow-down el-icon--right"></i>
  57. </el-button>
  58. <el-dropdown-menu slot="dropdown">
  59. <el-dropdown-item v-for="(item, index) in yearList" :key="index" @click.native="funSeleterYear(item)">{{ item.name }}</el-dropdown-item>
  60. </el-dropdown-menu>
  61. </el-dropdown>
  62. <el-dropdown>
  63. <el-button :disabled="formInline.year.name == ''" :class="formInline.quarter.name ? 'color-btn' : ''">
  64. {{ formInline.quarter.name || '按季' }}
  65. <i class="el-icon-arrow-down el-icon--right"></i>
  66. </el-button>
  67. <el-dropdown-menu slot="dropdown">
  68. <el-dropdown-item v-for="(item, index) in quarterList" :key="index" @click.native="funSeleterQuarter(item)">{{ item.name }}</el-dropdown-item>
  69. </el-dropdown-menu>
  70. </el-dropdown>
  71. </el-form-item>
  72. <el-form-item label="">
  73. <el-date-picker
  74. v-model="formInline.startTime"
  75. style="width: 150px;"
  76. type="month"
  77. format="yyyy 年 MM 月"
  78. value-format="yyyyMMdd"
  79. placeholder="开始日期"
  80. ></el-date-picker>
  81. <el-date-picker
  82. v-model="formInline.endTime"
  83. type="month"
  84. style="margin-left: 10px; width: 150px;"
  85. format="yyyy 年 MM 月"
  86. value-format="yyyyMMdd"
  87. placeholder="结束日期"
  88. ></el-date-picker>
  89. </el-form-item>
  90. <el-form-item label="科室:" style="margin-bottom: 0">
  91. <el-select v-model="formInline.AAC11N" clearable filterable placeholder="请选择">
  92. <el-option
  93. v-for="(item, index) in departmentList"
  94. :key="index"
  95. :label="item.name"
  96. :value="item.name">
  97. </el-option>
  98. </el-select>
  99. </el-form-item>
  100. <el-form-item label="医师:" style="margin-bottom: 0">
  101. <el-select v-model="formInline.AEE03" clearable filterable placeholder="请选择">
  102. <el-option
  103. v-for="(item, index) in staffList"
  104. :key="index"
  105. :label="item.name"
  106. :value="item.name">
  107. </el-option>
  108. </el-select>
  109. </el-form-item>
  110. <el-form-item>
  111. <el-button type="primary" @click="getList">查询</el-button>
  112. <el-button @click="getResult">重置条件</el-button>
  113. </el-form-item>
  114. </el-form>
  115. </div>
  116. <div class="box_card mb16">
  117. <CardTitle :title="indexData.name" >
  118. <div class="title-js-btn-box">
  119. <span class="span-btn" @click="clickJsTitleBtn">{{ jsText }}</span>
  120. <div class="js-pop-box" v-if=" jsPopShow ">
  121. <div class="js-pop-title-box">
  122. <span class="span-l">指标计算</span>
  123. <span class="span-c" @click="jsPopShowOff">X</span>
  124. </div>
  125. <div class="js-pop-centent-box">
  126. <el-form :inline="true" :model="formInline" class="demo-form-inline">
  127. <el-form-item label="出院时间:" style="margin-bottom: 16px; margin-right: 0;">
  128. <el-date-picker
  129. v-model="formInline.startTime"
  130. type="date"
  131. format="yyyy年MM月dd日"
  132. value-format="yyyyMMdd"
  133. placeholder="开始日期"
  134. style="width: 170px;">
  135. </el-date-picker>
  136. <el-date-picker
  137. v-model="formInline.endTime"
  138. type="date"
  139. style="margin-left: 10px; width: 170px; margin-right: 0;"
  140. format="yyyy年MM月dd日"
  141. value-format="yyyyMMdd"
  142. placeholder="结束日期">
  143. </el-date-picker>
  144. </el-form-item>
  145. </el-form>
  146. </div>
  147. <div class="js-pop-foo-box">
  148. <el-button type="primary" @click="reComputed">重新计算指标</el-button>
  149. </div>
  150. </div>
  151. </div>
  152. </CardTitle>
  153. <div class="mb16">
  154. <span>分子: {{ indexData.fenzi_name }}</span>
  155. <el-popover
  156. placement="right-start"
  157. trigger="hover">
  158. <div v-for="(fItem, fIndex) in fenziList" :key="fIndex" class="mb16">
  159. <div class="input_label" style="width: 140px; padding: 8px 15px; line-height: 24px; display: inline-block; border: 1px solid #dcdfe6; border-radius: 4px; vertical-align: top;">{{ fItem.name }}</div>
  160. <div class="input_label" style="width: 280px; margin-left: 16px; padding: 8px 15px; line-height: 24px; display: inline-block; border: 1px solid #dcdfe6; border-radius: 4px; vertical-align: top;">{{ fItem.info }}</div>
  161. </div>
  162. <el-button slot="reference" plain size="mini" type="primary" class="ml16">计算口径</el-button>
  163. </el-popover>
  164. </div>
  165. <div class="mb16">
  166. <span>分母: {{ indexData.fenmu_name }}</span>
  167. <el-popover
  168. placement="right-start"
  169. trigger="hover">
  170. <div v-for="(mItem, mIndex) in fenmuList" :key="mIndex" class="mb16">
  171. <div class="input_label" style="width: 140px; padding: 8px 15px; line-height: 24px; display: inline-block; border: 1px solid #dcdfe6; border-radius: 4px; vertical-align: top;">{{ mItem.name }}</div>
  172. <div class="input_label" style="width: 280px; margin-left: 16px; padding: 8px 15px; line-height: 24px; display: inline-block; border: 1px solid #dcdfe6; border-radius: 4px; vertical-align: top;">{{ mItem.info }}</div>
  173. </div>
  174. <el-button slot="reference" plain size="mini" type="primary" class="ml16">计算口径</el-button>
  175. </el-popover>
  176. </div>
  177. </div>
  178. <div class="box_card table-box">
  179. <div class="table-title-box mb16">
  180. <div class="table-title-l">
  181. <span>统计结果</span>
  182. <el-select v-model="formInline.dimensionality" clearable filterable placeholder="请选择">
  183. <el-option label="指标维度" value="指标维度"></el-option>
  184. <el-option label="科室维度" value="科室维度"></el-option>
  185. <el-option label="医师维度" value="医师维度"></el-option>
  186. </el-select>
  187. </div>
  188. <el-button type="primary" plain @click="onExport">导出数据</el-button>
  189. </div>
  190. <el-table
  191. :data="tableData" height="440"
  192. style="width: 100%">
  193. <el-table-column
  194. prop="date"
  195. label="日期">
  196. <template slot-scope="scope">
  197. <span v-if="scope.row.month">{{ scope.row.year }}-{{ scope.row.month < 10 ? `0${scope.row.month}` : scope.row.month }}</span>
  198. <span v-else>{{ scope.row.year }}</span>
  199. </template>
  200. </el-table-column>
  201. <el-table-column
  202. prop=""
  203. label="指标率">
  204. <template slot-scope="scope">
  205. <span>{{ scope.row.radio }}%</span>
  206. </template>
  207. </el-table-column>
  208. <el-table-column
  209. prop="fenzi"
  210. label="分子">
  211. <template slot-scope="scope">
  212. <span class="link" @click="toPage(scope.row, 1)">{{ scope.row.fenzi }}</span>
  213. </template>
  214. </el-table-column>
  215. <el-table-column
  216. prop="fenmu"
  217. label="分母">
  218. <template slot-scope="scope">
  219. <span class="link" @click="toPage(scope.row, 0)">{{ scope.row.fenmu }}</span>
  220. </template>
  221. </el-table-column>
  222. <el-table-column
  223. label="来源">
  224. <template>
  225. <!-- 接口没有来源字段 -->
  226. <span>系统提取</span>
  227. </template>
  228. </el-table-column>
  229. <el-table-column
  230. prop="status"
  231. label="指标状态">
  232. <template slot-scope="scope">
  233. <div class="status-box" :class="`${scope.row.status == '进行中'?'status-icon-1':(scope.row.status == '成功'?'status-icon-2':'status-icon-3')}`">
  234. <span class="status-icon"></span>
  235. <span>{{ scope.row.status }}</span>
  236. </div>
  237. </template>
  238. </el-table-column>
  239. <el-table-column
  240. prop="update_time"
  241. label="更新时间">
  242. <template slot-scope="scope">
  243. <span>{{ scope.row.update_time }}</span>
  244. </template>
  245. </el-table-column>
  246. </el-table>
  247. </div>
  248. </div>
  249. </div>
  250. </template>
  251. <script>
  252. import { majorIndexExport } from '@/api/excel';
  253. import { Number } from 'core-js';
  254. export default {
  255. data() {
  256. return {
  257. mForm: {
  258. startTime: '',
  259. endTime: ''
  260. },
  261. filterText: '',
  262. defaultProps: {
  263. children: 'children',
  264. label: 'name',
  265. },
  266. defaultOpenId: '',
  267. indexData: {
  268. name: '',
  269. fenzi: '',
  270. fenmu: ''
  271. },
  272. // treeData: [],
  273. treeData: [
  274. {
  275. "id": 36,
  276. "pid": 0,
  277. "level": 0,
  278. "name": "八、呼吸内科专业医疗质量控制指标(2019年版)",
  279. "fenzi": null,
  280. "fenmu": null,
  281. "img": null,
  282. "url": "0",
  283. "updated_at": "2024-01-12 08:47:02",
  284. "created_at": "2024-01-03 21:12:26",
  285. "fenmu_name": null,
  286. "fenzi_name": null,
  287. "sort_num": null,
  288. "children": [
  289. {
  290. "id": 37,
  291. "pid": 36,
  292. "level": 0,
  293. "name": "(十六)住院成人社区获得性肺炎(CAP)患者进行CAP严重程度评估的比例",
  294. "fenzi": "[{\"name\":\"1\",\"info\":\"病程记录(全部)中搜索“CURB-65”,列出每个患者的评分\"}]",
  295. "fenmu": "[{\"name\":\"1\",\"info\":\"入院科室为“呼吸内科”或“呼吸与危重症医学科”\"},{\"name\":\"2\",\"info\":\"主要诊断编码J13至J16,J18的出院患者\"},{\"name\":\"3\",\"info\":\"年龄≥18岁\"}]",
  296. "img": null,
  297. "url": "1",
  298. "updated_at": "2024-01-16 08:55:17",
  299. "created_at": "2024-01-03 21:13:14",
  300. "fenmu_name": "同期住院CAP患者总数",
  301. "fenzi_name": "进行了CAP严重程度评估的住院CAP患者数",
  302. "sort_num": null
  303. },
  304. {
  305. "id": 45,
  306. "pid": 36,
  307. "level": 0,
  308. "name": "(十七)低危CAP患者住院比例",
  309. "fenzi": "[{\"name\":\"1\",\"info\":\"评分为0分或1分,为低危患者\"}]",
  310. "fenmu": "[{\"name\":\"1\",\"info\":\"入院科室为“呼吸内科”或“呼吸与危重症医学科”\"},{\"name\":\"2\",\"info\":\"主要诊断编码J13至J16,J18的出院患者\"},{\"name\":\"3\",\"info\":\"年龄≥18岁\"}]",
  311. "img": null,
  312. "url": "2",
  313. "updated_at": "2024-01-16 08:58:31",
  314. "created_at": "2024-01-12 11:21:11",
  315. "fenmu_name": "同期住院CAP患者总数",
  316. "fenzi_name": "住院低危CAP患者数",
  317. "sort_num": null
  318. }
  319. ]
  320. },
  321. {
  322. "id": 46,
  323. "pid": 0,
  324. "level": 0,
  325. "name": "九、产科专业医疗质量控制指标(2019年版)",
  326. "fenzi": null,
  327. "fenmu": null,
  328. "img": null,
  329. "url": null,
  330. "updated_at": null,
  331. "created_at": "2024-01-12 11:34:22",
  332. "fenmu_name": null,
  333. "fenzi_name": null,
  334. "sort_num": 0,
  335. "children": [
  336. {
  337. "id": 47,
  338. "pid": 46,
  339. "level": 0,
  340. "name": "(一)剖宫产\/初产妇剖宫产率",
  341. "fenzi": "[{\"name\":\"1\",\"info\":\"主要手术或其他手术编码为74.0或74.1或74.2或74.4或74.99\"}]",
  342. "fenmu": "[{\"name\":\"1\",\"info\":\"其他诊断编码为O26.900x403至O26.900x408,O26.900x501至O26.900x510且其他诊断编码为Z37.0、Z37.1、Z37.900、Z37.900x002、Z37.900x003、Z37.900x004,且 医生病案首页诊断中取“P1”\"},{\"name\":\"2\",\"info\":\"其他诊断编码为O26.900x403至O26.900x408,O26.900x501至O26.900x510且其他诊断编码为Z37.2、Z37.3、Z37.4,医生病案首页诊断中取“P2”\"},{\"name\":\"3\",\"info\":\"其他诊断编码为O26.900x403至O26.900x408,O26.900x501至O26.900x510且其他诊断编码为Z37.5、Z37.6、Z37.7、Z37.900x001,医生病案首页诊断中取“P3”\"}]",
  343. "img": null,
  344. "url": "3",
  345. "updated_at": "2024-01-16 09:19:26",
  346. "created_at": "2024-01-12 11:36:12",
  347. "fenmu_name": "同期初产妇总人数",
  348. "fenzi_name": "初产妇剖宫产人数",
  349. "sort_num": 0
  350. },
  351. {
  352. "id": 56,
  353. "pid": 46,
  354. "level": 0,
  355. "name": "(十)足月新生儿5分钟Apgar评分<7分发生率",
  356. "fenzi": "[{\"name\":\"1\",\"info\":\"从“剖宫产记录”或从分娩记录中取\"}]",
  357. "fenmu": "[{\"name\":\"1\",\"info\":\"其他诊断编码为O26.900x504至O26.900x510\"},{\"name\":\"2\",\"info\":\"Z37.0+Z37.2*2+Z37.3+Z37.5*3+Z37.600x011\"}]",
  358. "img": null,
  359. "url": "10",
  360. "updated_at": "2024-01-16 09:27:07",
  361. "created_at": "2024-01-16 09:27:07",
  362. "fenmu_name": "同期足月活产儿总数",
  363. "fenzi_name": "足月新生儿5分钟Apgar评分<7分人数",
  364. "sort_num": 0
  365. }
  366. ]
  367. },
  368. {
  369. "id": 48,
  370. "pid": 0,
  371. "level": 0,
  372. "name": "十七、康复医学专业医疗质量控制指标(2022年版)",
  373. "fenzi": null,
  374. "fenmu": null,
  375. "img": null,
  376. "url": null,
  377. "updated_at": null,
  378. "created_at": "2024-01-12 11:41:33",
  379. "fenmu_name": null,
  380. "fenzi_name": null,
  381. "sort_num": 0,
  382. "children": [
  383. {
  384. "id": 49,
  385. "pid": 48,
  386. "level": 0,
  387. "name": "日常生活活动能力(ADL)改善率(REH-ADL-01)",
  388. "fenzi": "[{\"name\":\"单位时间内ADL改善的康复医学科住院患者数\",\"info\":\"\"}]",
  389. "fenmu": "[{\"name\":\"同期康复医学科住院患者总数\",\"info\":\"\"}]",
  390. "img": null,
  391. "url": "4",
  392. "updated_at": "2024-01-12 13:40:11",
  393. "created_at": "2024-01-12 13:40:11",
  394. "fenmu_name": "同期康复医学科住院患者总数",
  395. "fenzi_name": "单位时间内ADL改善的康复医学科住院患者数",
  396. "sort_num": 0
  397. },
  398. {
  399. "id": 50,
  400. "pid": 48,
  401. "level": 0,
  402. "name": "脊髓损伤患者ADL改善率(REH-ADL-02)",
  403. "fenzi": "[{\"name\":\"单位时间内ADL改善的康复医学科住院脊髓损伤患者数\",\"info\":\"1.分别提取出院记录中“入院情况”的“Barthel”具体分值和出院记录中“出院情况”的“Barthel”具体分值; 2.出院记录中出院情况的“Barthel”分值-入院情况的“Barthel”具体分值>0,为ADL改善; 3.分子满足分母条件\"}]",
  404. "fenmu": "[{\"name\":\"同期康复医学科住院脊髓损伤患者总数\",\"info\":\"1.病案首页出院科室为康复医学科的患者总数; 2.主要诊断编码S14.101或S24.101或S34.100x001或T06.000或T06.000x001或T06.100或T06.100x001或T09.300或T88.800x001\"}]",
  405. "img": null,
  406. "url": "5",
  407. "updated_at": "2024-01-12 13:49:46",
  408. "created_at": "2024-01-12 13:49:46",
  409. "fenmu_name": "同期康复医学科住院脊髓损伤患者总数",
  410. "fenzi_name": "单位时间内ADL改善的康复医学科住院脊髓损伤患者数",
  411. "sort_num": 0
  412. },
  413. {
  414. "id": 51,
  415. "pid": 48,
  416. "level": 0,
  417. "name": "脑卒中患者 ADL 改善率(REH-ADL-03)",
  418. "fenzi": "[{\"name\":\"单位时间内ADL改善的康复医学科住院脑卒中患者数\",\"info\":\"1.分别提取出院记录中“入院情况”的“Barthel”具体分值和出院记录中“出院情况”的“Barthel”具体分值; 2.出院记录中出院情况的“Barthel”分值-入院情况的“Barthel”具体分值>0,为ADL改善; 3.分子满足分母条件\"}]",
  419. "fenmu": "[{\"name\":\"\",\"info\":\"1.病案首页出院科室为康复医学科的患者总数; 2.主要诊断编码I63.0-I63.9、I61.0-I61.9或I64.x00\"}]",
  420. "img": null,
  421. "url": "6",
  422. "updated_at": "2024-01-12 13:54:06",
  423. "created_at": "2024-01-12 13:54:06",
  424. "fenmu_name": "同期康复医学科住院脑卒中患者总数",
  425. "fenzi_name": "单位时间内ADL改善的康复医学科住院脑卒中患者数",
  426. "sort_num": 0
  427. },
  428. {
  429. "id": 52,
  430. "pid": 48,
  431. "level": 0,
  432. "name": "康复评定率",
  433. "fenzi": "[{\"name\":\"\",\"info\":\"\"}]",
  434. "fenmu": "[{\"name\":\"\",\"info\":\"\"}]",
  435. "img": null,
  436. "url": null,
  437. "updated_at": "2024-01-12 18:47:57",
  438. "created_at": "2024-01-12 18:47:57",
  439. "fenmu_name": "11",
  440. "fenzi_name": "11",
  441. "sort_num": 0,
  442. "children": [
  443. {
  444. "id": 53,
  445. "pid": 52,
  446. "level": 0,
  447. "name": "脑卒中患者运动功能评定率(REH-EVA-01)",
  448. "fenzi": "[{\"name\":\"1\",\"info\":\"fff\"}]",
  449. "fenmu": "[{\"name\":\"2\",\"info\":\"1.病案首页出院科室为康复医学科; 2.主要诊断编码I63.0-I63.9、I61.0-I61.9或I64.x00\"}]",
  450. "img": null,
  451. "url": "7",
  452. "updated_at": "2024-01-12 18:53:54",
  453. "created_at": "2024-01-12 18:49:42",
  454. "fenmu_name": "同期康复医学科住院脑卒中患者总数",
  455. "fenzi_name": "单位时间内进行运动功能评定的康复医学科住院脑卒中患者数",
  456. "sort_num": 0
  457. },
  458. {
  459. "id": 54,
  460. "pid": 52,
  461. "level": 0,
  462. "name": "脑卒中患者吞咽功能评定率(REH-EVA-03)",
  463. "fenzi": "[{\"name\":\"1\",\"info\":\"病历中有“洼田饮水试验”\"},{\"name\":\"2\",\"info\":\"分子满足分母条件\"}]",
  464. "fenmu": "[{\"name\":\"1\",\"info\":\"病案首页出院科室为康复医学科;\"},{\"name\":\"2\",\"info\":\"主要诊断编码I63.0-I63.9、I61.0-I61.9或I64.x00\"}]",
  465. "img": null,
  466. "url": "8",
  467. "updated_at": "2024-01-16 08:39:42",
  468. "created_at": "2024-01-16 08:39:42",
  469. "fenmu_name": "同期康复医学科住院脑卒中患者总数",
  470. "fenzi_name": "单位时间内进行吞咽功能评定的康复医学科住院脑卒中患者数",
  471. "sort_num": 0
  472. },
  473. {
  474. "id": 55,
  475. "pid": 52,
  476. "level": 0,
  477. "name": "脊髓损伤患者神经功能评定率(REH-EVA-04)",
  478. "fenzi": "[{\"name\":\"1\",\"info\":\"入院记录有“ASIA”ANd“感觉平面”AND“运动平面”\"}]",
  479. "fenmu": "[{\"name\":\"1\",\"info\":\"病案首页出院科室为康复医学科;\"},{\"name\":\"2\",\"info\":\"主要诊断编码S14.101或S24.101或S34.100x001或T06.000或T06.000x001或T06.100或T06.100x001或T09.300或T88.800x001\"}]",
  480. "img": null,
  481. "url": "9",
  482. "updated_at": "2024-01-16 08:42:55",
  483. "created_at": "2024-01-16 08:42:55",
  484. "fenmu_name": "同期康复医学科住院脊髓损伤患者总数",
  485. "fenzi_name": "单位时间内进行神经功能评定的康复医学科住院脊髓损伤患者数",
  486. "sort_num": 0
  487. }
  488. ]
  489. }
  490. ]
  491. }
  492. ],
  493. // 右侧
  494. formInline: {
  495. year: {
  496. name: '',
  497. },
  498. month: {
  499. name: '',
  500. },
  501. quarter: {
  502. name: '',
  503. },
  504. startTime: '',
  505. endTime: '',
  506. AAC11N: '',
  507. AEE03: '',
  508. dimensionality: '指标维度',
  509. type: '1',
  510. },
  511. departmentList: [], // 科室
  512. staffList: [], // 主治医师
  513. jsText: '指标计算',
  514. jsPopShow: false,
  515. // pickerOptions: {
  516. // disabledDate(time) {
  517. // const date = new Date();
  518. // const year = date.getFullYear();
  519. // const timeYear = time.getFullYear();
  520. // return year < timeYear;
  521. // },
  522. // },
  523. tableData: [],
  524. quarterList: [],
  525. monthList: [],
  526. yearList: [],
  527. };
  528. },
  529. computed: {
  530. fenziList() {
  531. return this.indexData.fenzi ? JSON.parse(this.indexData.fenzi) : []
  532. },
  533. fenmuList() {
  534. return this.indexData.fenmu ? JSON.parse(this.indexData.fenmu) : []
  535. }
  536. },
  537. watch: {
  538. filterText(val) {
  539. this.$refs.tree.filter(val);
  540. }
  541. },
  542. async created() {
  543. // this.formInline.year = new Date().getFullYear().toString();
  544. // 默认获取当前本年日期
  545. this.getdaTe();
  546. this.getDepartmentList();
  547. this.getstaffList();
  548. this.selectInfo();
  549. await this.getTreeData();
  550. },
  551. methods: {
  552. // 获取默认当前日期
  553. getdaTe(){
  554. let date = new Date();
  555. let yy = date.getFullYear();
  556. let mm = date.getMonth() + 1;
  557. let dd = date.getDate();
  558. mm = mm > 9 ? mm : '0' + mm;
  559. dd = dd > 9 ? dd : '0' + dd;
  560. this.formInline.startTime = yy + '0101';
  561. this.formInline.endTime = `${yy}${mm}${dd}`;
  562. // this.storageSet('endTime', this.formInline.endTime || '');
  563. // this.storageSet('startTime', this.formInline.startTime || '');
  564. },
  565. selectInfo() {
  566. // let pramse = {};
  567. this.$axios.post('/selectInfo').then(res => {
  568. this.quarterList = res.data.quarter;
  569. // 季度
  570. this.monthList = res.data.month;
  571. //月
  572. this.yearList = res.data.year;
  573. });
  574. },
  575. funSeleterYear(val) {
  576. console.log(val)
  577. this.formInline.year = val;
  578. this.formInline.type = '1';
  579. this.formInline.endTime = this.goTimeTwe(val.end);
  580. this.formInline.startTime = this.goTimeTwe(val.start);
  581. },
  582. // 点击月份下下拉框
  583. funSeleterMonth(val) {
  584. this.formInline.month = val;
  585. this.formInline.type = '3';
  586. this.formInline.endTime =this.formInline.year.name+val.end;
  587. this.formInline.startTime = this.formInline.year.name+val.start;
  588. },
  589. // 点击按季度下拉框
  590. funSeleterQuarter(val) {
  591. this.formInline.type = '2';
  592. this.formInline.quarter = val;
  593. this.formInline.endTime =this.formInline.year.name+this.zh(val.end);
  594. this.formInline.startTime = this.formInline.year.name+this.zh(val.start);
  595. },
  596. zh(str){
  597. let arr = str.split('-');
  598. return arr.join('');
  599. },
  600. // 获取部门集合
  601. getDepartmentList() {
  602. this.$axios.post('/get_omr_department_list').then(res => {
  603. this.departmentList = res.data;
  604. });
  605. },
  606. // 点击重置条件
  607. getResult() {
  608. this.formInline.year.name = '';
  609. this.formInline.month.name = '';
  610. this.formInline.type = '1';
  611. this.formInline.quarter.name = '';
  612. this.formInline.startTime = '';
  613. this.formInline.endTime = '';
  614. this.formInline.AAC11N = '';
  615. this.formInline.AEE03 = '';
  616. this.selectInfo();
  617. this.funQuery();
  618. },
  619. getstaffList(){
  620. this.$axios2.get('/get_staff?ygjb=主治医师').then(res => {
  621. this.staffList = res.data;
  622. });
  623. },
  624. clickJsTitleBtn(){
  625. this.jsPopShow = !this.jsPopShow;
  626. },
  627. jsPopShowOff(){
  628. this.jsPopShow = false;
  629. },
  630. renderContent(h, { node }) {
  631. return h('span', {
  632. // 自定义class类名
  633. class: 'custom-node',
  634. // 设置样式(样式权限仅次于 !important,可能会覆盖掉原有定义的其他选择器样式)
  635. style: {
  636. fontWeight: node.isLeaf ? 'normal' : 'bold'
  637. }
  638. }, node.label);
  639. },
  640. getDaysInMonth(year, month) {
  641. month = parseInt(month, 10);
  642. var temp = new Date(year, month ,0);
  643. return temp.getDate();
  644. },
  645. toPage(row, status) {
  646. let startTime = '';
  647. let endTime = '';
  648. if(row.month){
  649. var month = Number(row.month) + 1 <= 10 ? "0" + Number(row.month) : Number(row.month);
  650. let num = this.getDaysInMonth(row.year,month);
  651. startTime = row.year+month+'01';
  652. endTime = row.year+month+num;
  653. }else{
  654. if(this.formInline.startTime && this.formInline.endTime){
  655. startTime = this.formInline.startTime;
  656. endTime = this.formInline.endTime;
  657. }else{
  658. let date = new Date();
  659. let yy = date.getFullYear();
  660. let mm = date.getMonth() + 1;
  661. let dd = date.getDate();
  662. mm = mm > 9 ? mm : '0' + mm;
  663. dd = dd > 9 ? dd : '0' + dd;
  664. startTime = yy + '0101';
  665. endTime = `${yy}${mm}${dd}`;
  666. }
  667. }
  668. localStorage.setItem('majorIndexData', JSON.stringify(this.indexData))
  669. this.$router.push({ path: '/majorIndexDetail', query: { startTime,endTime,year: row.year, month,AAC11N:this.formInline.AAC11N,AEE03:this.formInline.AEE03, status }})
  670. },
  671. alertText() {
  672. this.$message.info('接口没有,待开放')
  673. },
  674. // defaultOpenMenu
  675. defaultOpenMenu(list) {
  676. if (list.length && list[0].children && list[0].children.length) {
  677. if (list[0].children[0].children && list[0].children[0].children.length) {
  678. this.indexData = list[0].children[0].children[0]
  679. return list[0].children[0].children[0].id
  680. } else {
  681. this.indexData = list[0].children[0]
  682. return list[0].children[0].id
  683. }
  684. } else {
  685. this.indexData = list[0]
  686. return list[0].id
  687. }
  688. },
  689. getTreeData() {
  690. this.$axios2.get('/catalog_lists').then(res => {
  691. this.treeData = Array.isArray(res.data) ? res.data : []
  692. this.defaultOpenId = this.defaultOpenMenu(this.treeData)
  693. this.getList()
  694. });
  695. },
  696. // 菜单筛选
  697. filterNode(value, data) {
  698. if (!value) return true;
  699. return data.name.indexOf(value) !== -1;
  700. },
  701. handleNodeClick(data) {
  702. const { children, fenzi, fenmu } = data
  703. if (!children || children.length === 0) {
  704. if (fenzi.length && fenmu.length) {
  705. this.indexData = data
  706. this.getList()
  707. }
  708. }
  709. },
  710. reComputed() {
  711. const params = {
  712. category: this.indexData.url,
  713. cysj_start: this.formInline.startTime,
  714. cysj_end: this.formInline.endTime
  715. }
  716. this.$axios2.post('/quality_index_recalculate', params, {
  717. headers:{ isNoLoading: true}
  718. }).then(res => {
  719. if(res.code == 200) {
  720. //更改为发起请求后2秒刷新数据
  721. }
  722. });
  723. let timer = setTimeout(() => {
  724. clearTimeout(timer)
  725. this.jsPopShow = false
  726. this.getList()
  727. }, 2000);
  728. },
  729. getList() {
  730. this.$axios2.get(`/quality_index_list?type=1&cysj_start=${this.formInline.startTime}&cysj_end=${this.formInline.endTime}&AAC11N=${this.formInline.AAC11N}&AEE03=${this.formInline.AEE03}&is_export=0&category=${this.indexData.url}`).then(res => {
  731. this.tableData = Array.isArray(res.data) ? res.data : []
  732. });
  733. },
  734. onExport() {
  735. const params = {
  736. cysj_start:this.formInline.startTime,
  737. cysj_end:this.formInline.endTime,
  738. category: this.indexData.url,
  739. AAC11N: this.formInline.AAC11N,
  740. AEE03: this.formInline.AEE03,
  741. is_export: 1
  742. }
  743. majorIndexExport(params).then(res => {
  744. const content = res.data; // 后台返回二进制数据
  745. const blob = new Blob([content]);
  746. const fileName = `${this.indexData.name}.csv`;
  747. if ('download' in document.createElement('a')) {
  748. // 非IE下载
  749. const elink = document.createElement('a');
  750. elink.download = fileName;
  751. elink.style.display = 'none';
  752. elink.href = URL.createObjectURL(blob);
  753. document.body.appendChild(elink);
  754. elink.click();
  755. URL.revokeObjectURL(elink.href); // 释放URL 对象
  756. document.body.removeChild(elink);
  757. } else {
  758. // IE10+下载
  759. navigator.msSaveBlob(blob, fileName);
  760. }
  761. });
  762. }
  763. }
  764. };
  765. </script>
  766. <style lang="scss" scoped>
  767. .box {
  768. padding: 0 16px 16px;
  769. overflow: hidden;
  770. .link {
  771. color: #409eff;
  772. cursor: pointer;
  773. }
  774. .mb16 {
  775. margin-bottom: 16px;
  776. }
  777. .ml16 {
  778. margin-left: 16px;
  779. }
  780. .box_card {
  781. background: #fff;
  782. padding: 16px;
  783. border-radius: 4px;
  784. }
  785. .text-right {
  786. text-align: right;
  787. }
  788. .box_left {
  789. width: 460px;
  790. float: left;
  791. .tree-box {
  792. height: calc(100vh - 84px);
  793. overflow-y: scroll;
  794. }
  795. }
  796. .box_right {
  797. width: calc(100% - 476px);
  798. float: right;
  799. .table-box {
  800. height: calc(100vh - 110px - 275px);
  801. overflow-y: scroll;
  802. }
  803. &::v-deep .el-form-item{
  804. margin-right: 10px !important;
  805. }
  806. &::v-deep .el-input__inner{
  807. height: 35px;
  808. line-height: 35px;
  809. }
  810. &::v-deep .el-button{
  811. padding: 9px 20px;
  812. }
  813. }
  814. }
  815. .table-title-box{
  816. width: 100%;
  817. display: flex;
  818. align-items: center;
  819. justify-content: space-between;
  820. & .table-title-l{
  821. display: flex;
  822. align-items: center;
  823. &>span{
  824. font-size: 14px;
  825. font-weight: bold;
  826. padding-right: 10px;
  827. }
  828. &::v-deep .el-input__inner{
  829. height: 35px;
  830. line-height: 35px;
  831. }
  832. &::v-deep .el-input__icon{
  833. line-height: 35px;
  834. }
  835. }
  836. }
  837. .filter-tree {
  838. margin-top: 16px;
  839. ::v-deep .el-tree-node__content {
  840. height: 36px;
  841. line-height: 36px;
  842. .el-tree-node__expand-icon {
  843. padding: 12px 6px;
  844. }
  845. }
  846. }
  847. ::v-deep .el-tree-node {
  848. white-space: normal;
  849. outline: 0;
  850. .el-tree-node__content {
  851. text-align: left;
  852. align-items: start;
  853. margin: 4px;
  854. height: 100%;
  855. }
  856. }
  857. .title-js-btn-box{
  858. display: inline-block;
  859. position: relative;
  860. .span-btn{
  861. display: inline-block;
  862. background: #2b8f53;
  863. font-size: 12px;
  864. color: #fff;
  865. padding: 6px 12px;
  866. border-radius: 4px;
  867. text-align: center;
  868. cursor: pointer;
  869. }
  870. .js-pop-box{
  871. position: fixed;
  872. top: 40%;
  873. left: 50%;
  874. transform: translate(-50%,-50%);
  875. z-index: 999;
  876. width: 400px;
  877. height: auto;
  878. border-radius: 4px;
  879. background: #fff;
  880. border: 1px solid #f2f2f2;
  881. box-shadow: 0 1px 4px rgba(0, 21, 41, 0.08);
  882. overflow: hidden;
  883. .js-pop-title-box{
  884. width: 100%;
  885. display: flex;
  886. align-items: center;
  887. justify-content: space-between;
  888. padding: 6px 16px;
  889. padding-right: 6px;
  890. background: #17509a;
  891. font-size: 12px;
  892. color: #fff;
  893. .span-l{
  894. font-weight: 100;
  895. font-size: 12px;
  896. line-height: normal;
  897. }
  898. .span-c{
  899. display: inline-block;
  900. height: 100%;
  901. padding: 0 10px;
  902. cursor: pointer;
  903. }
  904. }
  905. .js-pop-centent-box{
  906. width: 100%;
  907. padding: 10px 16px;
  908. &::v-deep .el-input__inner{
  909. height: 35px;
  910. line-height: 35px;
  911. }
  912. }
  913. .js-pop-foo-box{
  914. width: 100%;
  915. padding: 0 16px 10px 16px;
  916. display: flex;
  917. align-items: center;
  918. justify-content: flex-end;
  919. &::v-deep .el-button{
  920. height: 35px;
  921. line-height: normal;
  922. padding: 0 20px;
  923. }
  924. }
  925. }
  926. }
  927. .status-box{
  928. display: flex;
  929. align-items: center;
  930. .status-icon{
  931. display: inline-block;
  932. width: 6px;
  933. height: 6px;
  934. border-radius: 50%;
  935. margin-right: 6px;
  936. }
  937. }
  938. .status-box.status-icon-1{
  939. & span{
  940. color: #b1b1b1;
  941. }
  942. .status-icon{
  943. background: #b1b1b1;
  944. }
  945. }
  946. .status-box.status-icon-2{
  947. & span{
  948. color: #2b8f53;
  949. }
  950. .status-icon{
  951. background: #2b8f53;
  952. }
  953. }
  954. .status-box.status-icon-3{
  955. & span{
  956. color: #ff0000;
  957. }
  958. .status-icon{
  959. background: #ff0000;
  960. }
  961. }
  962. </style>