CaseQualityBox2.vue 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511
  1. <template>
  2. <div>
  3. <div ref="box" class="box22" :style="{width: width ? width + 'px' : '100%'}" :class="{'nocopy': $route.meta.nocopy}">
  4. <div class="score-box" :class="scoreLevel == '甲'? 'scoreLevel_1' : ( scoreLevel == '乙'?'scoreLevel_2': (scoreLevel == '丙'?'scoreLevel_3':'' ) ) ">
  5. <div>病案评分<span class="score-f">{{ data.score }}分</span></div>
  6. <!-- <h2 class="score-dj">{{ scoreLevel }}</h2> -->
  7. </div>
  8. <div class="card-box" v-if="data.is_case">
  9. <div class="title">
  10. <span class="font-size12">智能结果更新时间:</span>
  11. <span class="font-size12">{{ data.quality_time }}</span>
  12. </div>
  13. <el-tag type="danger" v-if="data.is_case == 1" class="font-size12">质控中</el-tag>
  14. <el-tag v-if="data.is_case == 2" class="font-size12">已质控</el-tag>
  15. </div>
  16. <el-scrollbar ref="scrollRef" class="scrollBox" :style="`height: ${scrollHeight};padding-bottom:60px;`">
  17. <template v-for="(item, index) in tableData">
  18. <!-- is_appeal: 是否申述 -->
  19. <div class="list-box box-card" :key="index" v-if="is_show && (!item.is_appeal || (item.is_appeal == 1 && item.appeal_status == 2))">
  20. <div class="list-score-tips-box">
  21. <div class="list-left-score" :class=" item.level == 1 ? 'hover-1' : 'hover-2' ">
  22. <div> {{ item.level == 1? '必改':'建议' }} </div>
  23. <div>-{{ item.score }}</div>
  24. </div>
  25. <div class="list-right-tips">
  26. <div><span class="title-color">字段:</span><span>{{ item.category }}</span></div>
  27. <div class="notice-box"><span class="title-color">提示:</span><span>{{ item.notice }}</span></div>
  28. </div>
  29. </div>
  30. <div class="list-basis-box">
  31. <div class="list-basis-title" @click="clickListItem(index)">
  32. <span>质控依据</span>
  33. <span> >> </span>
  34. <el-image class="typeImg" v-if="item.is_ai" :src="require('../../../assets/images/jiqiren.png')" fit="contain">
  35. </el-image>
  36. <el-image v-else class="typeImg" :src="require('../../../assets/images/kefu.png')" fit="contain">
  37. </el-image>
  38. </div>
  39. <div class="list-basis-text">
  40. <div class="list-basis-text-t" :class="item.show?'show':''">
  41. <div v-for="(yItem, yIndex) of item.basis" :key="yIndex" style="margin-bottom: 10px;">
  42. <div v-if="item.rule_id !== 6">
  43. <span class="span-index">{{ yIndex+1 }}</span>
  44. <span v-if="item.category=='入院记录'">
  45. <span v-for="(cItem, cIndex) of yItem" :key="cIndex" @click="hightRight(cItem,292,item.JZHM)" v-html="cItem"></span>
  46. </span>
  47. <span v-else>
  48. <span v-for="(cItem, cIndex) of yItem" :key="cIndex" v-html="cItem"></span>
  49. </span>
  50. </div>
  51. <div v-else>
  52. <span class="span-index">1</span>
  53. <span style="font-size: 13px;">{{ yItem[0] }}</span>
  54. </div>
  55. </div>
  56. </div>
  57. <div class="list-basis-bottom-box">
  58. <div class="list-basis-bottom-tips">
  59. <el-tooltip class="appeal-status-box" effect="dark" :content="item.reject_content" placement="top">
  60. <el-button type="danger" class="appeal-status-2" v-if="item.appeal_status == 2">驳回</el-button>
  61. </el-tooltip>
  62. </div>
  63. <div class="list-basis-bottom-btn" v-if="data.valData != 'sl_001'">
  64. <el-button type="primary" @click="clickAppeal( item,index,2 )">申诉</el-button>
  65. <el-button @click="clickAppeal( item,index,1 )">忽略</el-button>
  66. </div>
  67. </div>
  68. </div>
  69. </div>
  70. </div>
  71. </template>
  72. </el-scrollbar>
  73. </div>
  74. </div>
  75. </template>
  76. <script>
  77. export default {
  78. props: {
  79. data: {
  80. type: Object,
  81. default() {
  82. return {
  83. data: {}
  84. }
  85. }
  86. },
  87. type:{
  88. type: String,
  89. default() {
  90. return ''
  91. }
  92. },
  93. height: {
  94. type: Number,
  95. default() {
  96. return 0
  97. }
  98. },
  99. width: {
  100. type: Number,
  101. default() {
  102. return 0
  103. }
  104. }
  105. },
  106. data(){
  107. return {
  108. tableData: [],
  109. is_show: true,
  110. quality_type: 2, // 1、首页质控 2、病例质控
  111. }
  112. },
  113. computed: {
  114. scoreLevel() {
  115. /**
  116. * 甲>90分
  117. * 乙75-90分
  118. * 丙<75分
  119. * */
  120. let str
  121. const { score } = this.data
  122. if (score > 90) {
  123. str = '甲'
  124. } else if (score < 75) {
  125. str = '丙'
  126. } else if ( score <= 90 && score >= 75 ) {
  127. str = '乙'
  128. }
  129. return str
  130. },
  131. scrollHeight() {
  132. // if (this.height) {
  133. // return (this.height - 214)+'px'
  134. // } else {
  135. // return `calc(100vh - 314px)`
  136. // }
  137. return `100%`
  138. }
  139. },
  140. created(){
  141. this.getTableData();
  142. },
  143. methods: {
  144. getTableData(){
  145. let data = this.data.data;
  146. for(let i=0; i<data.length; i++) {
  147. data[i].show = true;
  148. }
  149. this.tableData = data;
  150. console.log(this.tableData)
  151. },
  152. onScroll(index) {
  153. const el = this.$el.querySelector(`.category${index}`);
  154. const node = el.parentNode.parentNode.parentNode
  155. this.$refs["scrollRef"].wrap.scrollTop = node.offsetTop;
  156. },
  157. hightRight(hightKeyWord, bllb, zyh) {
  158. this.$emit('hightRight',hightKeyWord,bllb,zyh)
  159. },
  160. clickListItem(idx){
  161. let tableData = this.tableData;
  162. tableData[idx].show = !tableData[idx].show;
  163. this.is_show = false;
  164. this.$nextTick( () =>{
  165. this.tableData = tableData;
  166. this.is_show = true;
  167. })
  168. console.log(tableData)
  169. },
  170. // 点击申诉、忽略按钮
  171. clickAppeal(i,idx,type){
  172. let that = this;
  173. let item = i;
  174. let index = idx;
  175. let tableData = that.tableData;
  176. let params = {
  177. id: item.id, // 质控错误结果的数据ID
  178. zyh: item.JZHM,
  179. type: type,
  180. quality_type: that.quality_type, // 1、首页质控 2、病例质控
  181. appeal_document: that.data.appeal_document, //申诉科室名称
  182. appeal_docter: that.data.appeal_docter, // 申诉医生名称
  183. }
  184. that.$axios2.post('/appeal', params).then(res => {
  185. if(res.code == 200){
  186. that.$message({
  187. type: 'success',
  188. message: res.msg
  189. });
  190. setTimeout( () =>{
  191. tableData.splice(index,1);
  192. that.tableData = tableData;
  193. },2000)
  194. }else{
  195. that.$message({
  196. type: 'error',
  197. message: res.msg
  198. });
  199. }
  200. })
  201. }
  202. }
  203. }
  204. </script>
  205. <style lang="scss" scoped>
  206. ::v-deep .el-scrollbar__wrap {
  207. overflow-x: hidden;
  208. }
  209. ::v-deep .el-divider--horizontal {
  210. margin: 10px 0;
  211. }
  212. .box22 {
  213. padding: 16px;
  214. background: #FFFFFF;
  215. border-radius: 5px;
  216. height: 100vh;
  217. .score-box{
  218. width: 100%;
  219. margin-bottom: 16px;
  220. padding: 30px 50px 30px 20px;
  221. border-radius: 4px;
  222. display: flex;
  223. align-items: center;
  224. justify-content: space-between;
  225. color: #fff;
  226. div{
  227. font-size: 20px;
  228. }
  229. .score-f{
  230. padding-left: 20px;
  231. font-size: 20px;
  232. }
  233. .score-dj,.score-f{
  234. font-weight: bold;
  235. }
  236. }
  237. .score-box.scoreLevel_1{
  238. background: rgb(11, 133, 63);
  239. background-image: url('../../../assets/images/icon-jia.png');
  240. background-repeat: no-repeat;
  241. background-size: 60px 52px;
  242. background-position:80% 50%;
  243. }
  244. .score-box.scoreLevel_2{
  245. background: rgb(152, 112, 20);
  246. background-image: url('../../../assets/images/icon-yi.png');
  247. background-repeat: no-repeat;
  248. background-size: 60px 52px;
  249. background-position:80% 50%;
  250. }
  251. .score-box.scoreLevel_3{
  252. background: rgb(199, 54, 13);
  253. background-image: url('../../../assets/images/icon-bing.png');
  254. background-repeat: no-repeat;
  255. background-size: 60px 52px;
  256. background-position:80% 50%;
  257. }
  258. .card-box {
  259. // height: 175px;
  260. // background: #FFFFFF;
  261. // border: 1px solid #E2E2E2;
  262. background: #f1f5fe;
  263. padding: 10px;
  264. box-sizing: border-box;
  265. margin-bottom: 14px;
  266. display: flex;
  267. align-items: center;
  268. justify-content: space-between;
  269. .title {
  270. font-size: 12px;
  271. font-family: PingFang-SC-Bold, PingFang-SC;
  272. // font-weight: bold;
  273. color: #333333;
  274. line-height: 22px;
  275. // span {
  276. // margin-left: 7px;
  277. // }
  278. }
  279. .card-icon-btn{
  280. width: auto;
  281. padding: 4px 8px;
  282. border-radius: 4px;
  283. background: rgb(254, 240, 240);
  284. color: rgb(245, 128, 140);
  285. border: 1px solid rgb(245, 128, 140);
  286. font-size: 10px;
  287. }
  288. .title2 {
  289. font-size: 14px;
  290. font-family: PingFang-SC-Bold, PingFang-SC;
  291. // font-weight: bold;
  292. color: #333333;
  293. line-height: 26px;
  294. cursor: pointer;
  295. span {
  296. margin-left: 7px;
  297. }
  298. }
  299. .error {
  300. color: #D81E06;
  301. }
  302. }
  303. .box-card {
  304. margin-bottom: 10px;
  305. position: relative;
  306. background: rgb(241, 245, 254);
  307. .category {
  308. font-family: PingFangSC-Semibold, PingFang SC;
  309. font-weight: bold;
  310. color: #333333;
  311. }
  312. .koufen {
  313. font-weight: bold;
  314. vertical-align: middle;
  315. margin-left: 16px;
  316. }
  317. .typeImg {
  318. width: 53px;
  319. height: 53px;
  320. position: absolute;
  321. top: 12px;
  322. right: 12px;
  323. z-index: 999;
  324. }
  325. }
  326. .box-card .el-table ::v-deep tr{
  327. background: transparent;
  328. }
  329. ::v-deep .el-table__row {
  330. background: #185DA6 !important;
  331. color: #FFFFFF;
  332. .el-icon-arrow-right {
  333. color: #FFFFFF;
  334. }
  335. }
  336. ::v-deep .el-descriptions__body{
  337. background: transparent;
  338. }
  339. ::v-deep .el-table tr{
  340. background: transparent;
  341. }
  342. ::v-deep .el-table--enable-row-hover .el-table__body tr:hover>td.el-table__cell {
  343. background: #185DA6;
  344. }
  345. ::v-deep .el-table_1_column_1 {
  346. border-radius: 8px 0 0 8px;
  347. }
  348. ::v-deep .el-table_1_column_2 {
  349. border-radius: 0 8px 8px 0;
  350. font-weight: bold;
  351. }
  352. ::v-deep .el-descriptions-item__label {
  353. font-family: PingFang-SC-Bold, PingFang-SC;
  354. font-weight: bold;
  355. color: #333333;
  356. }
  357. }
  358. .span-index{
  359. width: 20px;
  360. height: 20px;
  361. line-height: 20px;
  362. text-align: center;
  363. display: inline-block;
  364. border-radius: 50%;
  365. background: #185DA6;
  366. color: #fff;
  367. margin-right: 10px;
  368. margin-bottom: 4px;
  369. font-size: 12px;
  370. }
  371. ::v-deep .el-table .el-table__row td {
  372. color: #fff;
  373. }
  374. ::v-deep .el-tag{
  375. height: auto;
  376. line-height: 22px;
  377. }
  378. // ================= 2024-07-27 新样式 ↓ ===============
  379. .font-size12{
  380. font-size: 12px;
  381. }
  382. .list-box{
  383. width: 100%;
  384. padding: 10px 0;
  385. .title-color{
  386. color: rgba(27,100,176,1);
  387. font-weight: bold;
  388. }
  389. .list-score-tips-box{
  390. width: 100%;
  391. display: flex;
  392. .list-left-score{
  393. width: 70px;
  394. text-align: center;
  395. font-size: 20px;
  396. font-weight: 700;
  397. position: relative;
  398. display: flex;
  399. flex-direction: column;
  400. align-items: center;
  401. justify-content: center;
  402. padding: 10px 0;
  403. &.hover-1{
  404. background: rgb(254, 240, 240);
  405. color: rgb(238, 14, 14);
  406. border-right: 3px solid rgb(238, 14, 14);
  407. }
  408. &.hover-2{
  409. background: rgb(236, 245, 255);
  410. color: rgb(52, 140, 235);
  411. border-right: 3px solid rgb(52, 140, 235);
  412. }
  413. &>div{
  414. font-size: 20px;
  415. }
  416. }
  417. .list-right-tips{
  418. flex: 1;
  419. font-size: 12px;
  420. padding-left: 10px;
  421. .notice-box{
  422. margin-top: 8px;
  423. }
  424. }
  425. }
  426. .list-basis-box{
  427. .list-basis-title{
  428. padding: 10px 0 10px 10px;
  429. position: relative;
  430. &>span{
  431. font-size: 12px;
  432. color: rgba(27,100,176,1);
  433. font-weight: bold;
  434. }
  435. .typeImg {
  436. width: 34px;
  437. height: 34px;
  438. position: absolute;
  439. top: 0;
  440. right: 12px;
  441. z-index: 999;
  442. }
  443. }
  444. .list-basis-text {
  445. height: auto;
  446. .list-basis-text-t{
  447. height: 0;
  448. overflow: hidden;
  449. position: relative;
  450. &.show{
  451. height: auto;
  452. padding: 10px 0 10px 10px;
  453. }
  454. }
  455. }
  456. .list-basis-bottom-box{
  457. margin-top: 14px;
  458. width: 100%;
  459. display: flex;
  460. align-items: center;
  461. justify-content: space-between;
  462. .list-basis-bottom-tips{
  463. flex: 1;
  464. &::v-deep .el-button{
  465. padding: 0;
  466. font-size: 12px;
  467. width: 40px;
  468. height: 40px;
  469. border-radius: 50%;
  470. &>span{
  471. font-size: 12px;
  472. }
  473. }
  474. }
  475. .list-basis-bottom-btn{
  476. width: auto;
  477. &::v-deep .el-button{
  478. padding: 6px 14px;
  479. }
  480. &::v-deep .el-button--primary,&::v-deep .el-button--primary:focus,&::v-deep .el-button--primary:hover{
  481. background: #185DA6;
  482. border-color: #185DA6;
  483. }
  484. }
  485. }
  486. }
  487. }
  488. </style>