394 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			Plaintext
		
	
	
			
		
		
	
	
			394 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			Plaintext
		
	
	
<template>
 | 
						|
  <div class="dicom-container">
 | 
						|
    <div class="dicom-list">
 | 
						|
      <div class="container">
 | 
						|
        <div class="related-study-wrapper">
 | 
						|
          <div class="left">
 | 
						|
            <div class="visit-name-wrapper">
 | 
						|
              <div
 | 
						|
                v-for="s in taskList"
 | 
						|
                :key="s.VisitTaskId"
 | 
						|
                class="visit-item"
 | 
						|
                :class="{'visit-item-active': activeTaskVisitId==s.VisitTaskId}"
 | 
						|
                @click.prevent="handleClick(s)"
 | 
						|
              >
 | 
						|
                {{ s.TaskBlindName }}
 | 
						|
              </div>
 | 
						|
            </div>
 | 
						|
 | 
						|
          </div>
 | 
						|
          <div class="right">
 | 
						|
            <div
 | 
						|
              v-for="s in taskList"
 | 
						|
              v-show="activeTaskVisitId === s.VisitTaskId"
 | 
						|
              :key="s.VisitTaskId"
 | 
						|
              class="study-wrapper"
 | 
						|
            >
 | 
						|
              <StudyList
 | 
						|
                v-if="selectArr.includes(s.VisitTaskId)"
 | 
						|
                :ref="s.VisitTaskId"
 | 
						|
                :visit-task-id="s.VisitTaskId"
 | 
						|
                :trial-id="trialId"
 | 
						|
                :subject-visit-id="s.VisitId"
 | 
						|
                :task-blind-name="s.TaskBlindName"
 | 
						|
                @loadImageStack="loadImageStack"
 | 
						|
              />
 | 
						|
            </div>
 | 
						|
          </div>
 | 
						|
        </div>
 | 
						|
        <!-- <el-tabs v-model="activeName">
 | 
						|
          <el-tab-pane label="检查列表" name="relation-study">
 | 
						|
 | 
						|
          </el-tab-pane>
 | 
						|
        </el-tabs> -->
 | 
						|
      </div>
 | 
						|
    </div>
 | 
						|
    <div class="dicom-viewer">
 | 
						|
      <div class="container">
 | 
						|
        <DicomViewer
 | 
						|
          ref="dicomViewer"
 | 
						|
          :visit-task-id="activeTaskVisitId"
 | 
						|
          :is-current-task="activeTaskIsCurrentTask"
 | 
						|
          :reading-task-state="readingTaskState"
 | 
						|
        />
 | 
						|
      </div>
 | 
						|
 | 
						|
    </div>
 | 
						|
  </div>
 | 
						|
</template>
 | 
						|
<script>
 | 
						|
import { getRelatedVisitTask, getTableAnswerRowInfoList } from '@/api/trials'
 | 
						|
import StudyList from './StudyList'
 | 
						|
import DicomViewer from './DicomViewer'
 | 
						|
import Store from './Store'
 | 
						|
export default {
 | 
						|
  name: 'ReadPage',
 | 
						|
  components: {
 | 
						|
    DicomViewer,
 | 
						|
    StudyList
 | 
						|
  },
 | 
						|
  props: {
 | 
						|
    visitTaskId: {
 | 
						|
      type: String,
 | 
						|
      required: true
 | 
						|
    }
 | 
						|
  },
 | 
						|
  data() {
 | 
						|
    return {
 | 
						|
      activeName: 'relation-study',
 | 
						|
      tabs: ['relation-study'],
 | 
						|
      taskList: [],
 | 
						|
      loading: false,
 | 
						|
      selectArr: [],
 | 
						|
      activeTaskIndex: -1,
 | 
						|
      activeTaskVisitId: '',
 | 
						|
      measuredData: [],
 | 
						|
      trialId: '',
 | 
						|
      activeTaskIsCurrentTask: false,
 | 
						|
      readingTaskState: 2
 | 
						|
    }
 | 
						|
  },
 | 
						|
 | 
						|
  mounted() {
 | 
						|
    this.trialId = this.$router.currentRoute.query.trialId
 | 
						|
    this.getVisitInfo()
 | 
						|
    Store.$on('imageLocation', measuredData => {
 | 
						|
      if (!measuredData) return
 | 
						|
      this.imageLocation(measuredData)
 | 
						|
      console.log('imageLocation')
 | 
						|
    })
 | 
						|
 | 
						|
    Store.$on('addTemporaryMeasuredData', data => {
 | 
						|
      if (!data) return
 | 
						|
      data.VisitTaskId = this.visitTaskId
 | 
						|
      this.$refs[this.visitTaskId][0].addTemporaryMeasuredData(data)
 | 
						|
      console.log('addTemporaryMeasuredData')
 | 
						|
    })
 | 
						|
    Store.$on('toggleVisitList', data => {
 | 
						|
      var index = this.taskList.findIndex(study => study.VisitTaskId === data.visitTaskId)
 | 
						|
      this.activeTaskVisitId = data.visitTaskId
 | 
						|
      this.activeTaskIndex = index
 | 
						|
      this.activeTaskIsCurrentTask = this.taskList[index].IsCurrentTask
 | 
						|
      this.$refs[this.activeTaskVisitId][0].toggleStudy(data)
 | 
						|
      console.log('toggleVisitList')
 | 
						|
    })
 | 
						|
  },
 | 
						|
  beforeDestroy() {
 | 
						|
    Store.$off('imageLocation')
 | 
						|
    Store.$off('addTemporaryMeasuredData')
 | 
						|
    Store.$off('toggleVisitList')
 | 
						|
  },
 | 
						|
  methods: {
 | 
						|
    getVisitInfo() {
 | 
						|
      const loading = this.$loading({ fullscreen: true })
 | 
						|
      // this.loading = true
 | 
						|
      getRelatedVisitTask({ visitTaskId: this.visitTaskId }).then(res => {
 | 
						|
        this.readingTaskState = res.OtherInfo.ReadingTaskState
 | 
						|
        this.taskList = res.Result
 | 
						|
        var index = this.taskList.findIndex(study => study.IsCurrentTask)
 | 
						|
        // this.loading = false
 | 
						|
        loading.close()
 | 
						|
        if (index < 0) return
 | 
						|
        this.activeTaskVisitId = this.taskList[index].VisitTaskId
 | 
						|
        this.activeTaskIndex = index
 | 
						|
        this.activeTaskIsCurrentTask = this.taskList[index].IsCurrentTask
 | 
						|
        this.selectArr.push(this.taskList[index].VisitTaskId)
 | 
						|
        this.$nextTick(() => {
 | 
						|
          this.$refs[this.activeTaskVisitId][0].getStudyInfo()
 | 
						|
        })
 | 
						|
      }).catch(() => {
 | 
						|
        // this.loading = false
 | 
						|
        loading.close()
 | 
						|
      })
 | 
						|
    },
 | 
						|
    getTableAnswerRowInfoList(taskVisitId) {
 | 
						|
      var index = this.taskList.findIndex(study => study.VisitTaskId === taskVisitId)
 | 
						|
      return new Promise((resolve, reject) => {
 | 
						|
        this.loading = true
 | 
						|
        getTableAnswerRowInfoList(this.taskVisitId).then(res => {
 | 
						|
          res.Result.forEach(el => {
 | 
						|
            if (el.MeasureData) {
 | 
						|
              el.MeasureData = JSON.parse(el.MeasureData)
 | 
						|
            }
 | 
						|
          })
 | 
						|
          this.taskList[index].MeasureData = res.Result
 | 
						|
          this.loading = false
 | 
						|
          resolve()
 | 
						|
        }).catch(() => {
 | 
						|
          this.loading = false
 | 
						|
          reject()
 | 
						|
        })
 | 
						|
      })
 | 
						|
    },
 | 
						|
 | 
						|
    handleClick(visitTaskInfo) {
 | 
						|
      if (this.activeTaskIndex === visitTaskInfo.VisitTaskId) return
 | 
						|
      var index = this.taskList.findIndex(study => study.VisitTaskId === visitTaskInfo.VisitTaskId)
 | 
						|
      this.activeTaskIndex = index
 | 
						|
      this.activeTaskVisitId = visitTaskInfo.VisitTaskId
 | 
						|
      this.activeTaskIsCurrentTask = visitTaskInfo.IsCurrentTask
 | 
						|
      if (!this.selectArr.includes()) {
 | 
						|
        this.selectArr.push(visitTaskInfo.VisitTaskId)
 | 
						|
      }
 | 
						|
      this.$nextTick(() => {
 | 
						|
        this.$refs[this.activeTaskVisitId][0].getStudyInfo()
 | 
						|
      })
 | 
						|
      // this.$refs[this.activeTaskVisitId][0].showCurrentSeriesImage()
 | 
						|
    },
 | 
						|
    loadImageStack(series) {
 | 
						|
      this.$nextTick(() => {
 | 
						|
        this.$refs.dicomViewer.loadImageStack(series)
 | 
						|
      })
 | 
						|
    },
 | 
						|
    imageLocation(measuredData) {
 | 
						|
      var studyList = this.$refs[this.activeTaskVisitId][0].studyList
 | 
						|
      var studyIdx = studyList.findIndex(i => measuredData.MeasureData && i.StudyId === measuredData.MeasureData.studyId)
 | 
						|
      if (studyIdx < 0) return
 | 
						|
      var seriesList = studyList[studyIdx].SeriesList
 | 
						|
      var seriesIdx = seriesList.findIndex(i => i.seriesId === measuredData.MeasureData.seriesId)
 | 
						|
      if (seriesIdx < 0) return
 | 
						|
      var instanceList = seriesList[seriesIdx].imageIds
 | 
						|
      var instanceIdx = instanceList.findIndex(i => i === `wadouri:/api/instance/content/${measuredData.MeasureData.instanceId}`)
 | 
						|
      if (instanceIdx < 0) return
 | 
						|
      seriesList[seriesIdx].imageIdIndex = instanceIdx
 | 
						|
 | 
						|
      this.$refs[this.activeTaskVisitId][0].studyIndex = studyIdx
 | 
						|
      this.$refs[this.activeTaskVisitId][0].seriesIndex = seriesIdx
 | 
						|
      seriesList[seriesIdx].measuredData = this.$refs[this.activeTaskVisitId][0].measuredData
 | 
						|
      this.$refs.dicomViewer.loadImageStack(seriesList[seriesIdx])
 | 
						|
    }
 | 
						|
  }
 | 
						|
}
 | 
						|
</script>
 | 
						|
<style lang="scss" scoped>
 | 
						|
.dicom-container{
 | 
						|
  width: 100%;
 | 
						|
  height: 100%;
 | 
						|
  display: flex;
 | 
						|
  flex-direction: row;
 | 
						|
  justify-content: flex-start;
 | 
						|
  background-color: #000;
 | 
						|
  box-sizing: border-box;
 | 
						|
  ::-webkit-scrollbar {
 | 
						|
    width: 5px;
 | 
						|
    height: 5px;
 | 
						|
  }
 | 
						|
  ::-webkit-scrollbar-thumb {
 | 
						|
    border-radius: 10px;
 | 
						|
    background: #d0d0d0;
 | 
						|
  }
 | 
						|
 | 
						|
  .dicom-viewer{
 | 
						|
    flex: 1;
 | 
						|
    width: 100%;
 | 
						|
    box-sizing: border-box;
 | 
						|
 | 
						|
    .container{
 | 
						|
      width: 100%;
 | 
						|
      height: 100%;
 | 
						|
      box-sizing: border-box;
 | 
						|
    }
 | 
						|
  }
 | 
						|
  .dicom-list{
 | 
						|
     width: 200px;
 | 
						|
     padding: 5px 0px;
 | 
						|
    box-sizing: border-box;
 | 
						|
 | 
						|
    .container{
 | 
						|
      width: 100%;
 | 
						|
      height: 100%;
 | 
						|
      box-sizing: border-box;
 | 
						|
      border: 1px solid #727272;
 | 
						|
      // border: 1px solid #ccc;
 | 
						|
 | 
						|
    }
 | 
						|
    .el-tabs{
 | 
						|
      box-sizing: border-box;
 | 
						|
      padding: 0 5px;
 | 
						|
      height: 100%;
 | 
						|
      display: flex;
 | 
						|
      flex-direction: column;
 | 
						|
      // justify-content: flex-start;
 | 
						|
      border: 1px solid #727272;
 | 
						|
      .el-tabs__item{
 | 
						|
        color: #fff;
 | 
						|
      }
 | 
						|
      >>>.el-tabs__header{
 | 
						|
        height: 55px;
 | 
						|
        margin:0px;
 | 
						|
        box-sizing: border-box;
 | 
						|
      }
 | 
						|
      >>>.el-tabs__content{
 | 
						|
        flex: 1;
 | 
						|
        margin:0px;
 | 
						|
        overflow-y: auto;
 | 
						|
        box-sizing: border-box;
 | 
						|
      }
 | 
						|
      >>>.el-tabs__item{
 | 
						|
        color: #fff;
 | 
						|
      }
 | 
						|
 | 
						|
    }
 | 
						|
    .dicom-desc{
 | 
						|
      font-weight: bold;
 | 
						|
      font-size: 13px;
 | 
						|
      text-align: center;
 | 
						|
      // background-color: rgb(88 84 83);
 | 
						|
      color: #d0d0d0;
 | 
						|
      padding: 2px;
 | 
						|
    }
 | 
						|
    .ps {
 | 
						|
      overflow-anchor: none;
 | 
						|
      touch-action: auto;
 | 
						|
    }
 | 
						|
    .series-active {
 | 
						|
      background-color: #607d8b!important;
 | 
						|
      border: 1px solid #607d8b!important;
 | 
						|
    }
 | 
						|
    >>>.el-progress__text{
 | 
						|
      color: #ccc;
 | 
						|
      font-size: 12px;
 | 
						|
    }
 | 
						|
    .series{
 | 
						|
      width: 100%;
 | 
						|
      display: flex;
 | 
						|
      flex-direction: column;
 | 
						|
      justify-content: flex-start;
 | 
						|
      .series-wrapper {
 | 
						|
        display: flex;
 | 
						|
        flex-direction: row;
 | 
						|
        justify-content: space-between;
 | 
						|
        align-items: center;
 | 
						|
        width: 100%;
 | 
						|
        height: 85px;
 | 
						|
        // padding: 1px 2px 1px 8px;
 | 
						|
        // margin: 10px 0px;
 | 
						|
        border-radius: 2px;
 | 
						|
        border: 1px solid #404040;
 | 
						|
        background-color: #3a3a3a;
 | 
						|
        .el-progress__text{
 | 
						|
          display: none;
 | 
						|
        }
 | 
						|
        .el-progress-bar{
 | 
						|
          padding-right:0px;
 | 
						|
        }
 | 
						|
 | 
						|
        .image-preview {
 | 
						|
          height: 75px;
 | 
						|
          width: 75px;
 | 
						|
          border: 2px solid #252525;
 | 
						|
          cursor: pointer;
 | 
						|
        }
 | 
						|
        .image-desc {
 | 
						|
          vertical-align: top;
 | 
						|
          p{
 | 
						|
            width: 100px;
 | 
						|
            white-space: nowrap;
 | 
						|
            overflow: hidden;
 | 
						|
            text-overflow: ellipsis;
 | 
						|
            font-size: 12px;
 | 
						|
            color: #ddd;
 | 
						|
            padding: 1px;
 | 
						|
            margin: 0px;
 | 
						|
          }
 | 
						|
        }
 | 
						|
      }
 | 
						|
    }
 | 
						|
    .related-study-wrapper{
 | 
						|
      box-sizing: border-box;
 | 
						|
      height: 100%;
 | 
						|
      padding-bottom: 5px;
 | 
						|
      display: flex;
 | 
						|
      flex-direction: row;
 | 
						|
      justify-content: space-between;
 | 
						|
 | 
						|
      .left{
 | 
						|
        position: relative;
 | 
						|
        width: 25px;
 | 
						|
        height: 100%;
 | 
						|
        overflow-x: hidden;
 | 
						|
        overflow-y: auto;
 | 
						|
        box-sizing: border-box;
 | 
						|
        .visit-name-wrapper{
 | 
						|
          position: absolute;
 | 
						|
          top: 5px;
 | 
						|
          right: 20px;
 | 
						|
          transform-origin: right top;
 | 
						|
          transform: rotate(-90deg);
 | 
						|
          display: flex;
 | 
						|
          flex-direction: row;
 | 
						|
          align-content: flex-start;
 | 
						|
        }
 | 
						|
        .visit-item{
 | 
						|
          height: 25px;
 | 
						|
          box-sizing: border-box;
 | 
						|
          padding: 2px  5px;
 | 
						|
          border: 1px solid #999999;
 | 
						|
          border-bottom:none ;
 | 
						|
          text-align: center;
 | 
						|
          background-color: #4e4e4e;
 | 
						|
          color: #d5d5d5;
 | 
						|
          cursor: pointer;
 | 
						|
          margin-left: 10px;
 | 
						|
        }
 | 
						|
        .visit-item-active{
 | 
						|
          background-color: #607d8b;
 | 
						|
          border: 1px solid #607d8b;
 | 
						|
        }
 | 
						|
      }
 | 
						|
      .right{
 | 
						|
        width:170px;
 | 
						|
        flex:1;
 | 
						|
        height: 100%;
 | 
						|
        border-left: 1px solid #4a4a4a;
 | 
						|
        color: #d5d5d5;
 | 
						|
        .study-wrapper{
 | 
						|
          width: 100%;
 | 
						|
          height: 100%;
 | 
						|
        }
 | 
						|
      }
 | 
						|
    }
 | 
						|
  }
 | 
						|
}
 | 
						|
</style>
 |