临床试验影像库中的患者影像可以查询新增检查,并可以从PACS拉取到影像库
continuous-integration/drone/push Build is passing Details

main
wangxiaoshuang 2025-03-21 11:08:52 +08:00
parent 7254622c6d
commit 836d2ffc22
5 changed files with 889 additions and 430 deletions

View File

@ -188,4 +188,11 @@ export function cMoveVerify(data) {
method: 'post',
data
})
}
// 获取参加项目
export function getUserJoinedTrialPatientList() {
return request({
url: '/Patient/getUserJoinedTrialPatientList',
method: 'get',
})
}

View File

@ -1,59 +1,25 @@
<template>
<el-dialog
:visible.sync="visible"
:close-on-click-modal="false"
:fullscreen="true"
custom-class="upload-dialog"
:before-close="beforeCloseStudyDig"
>
<span slot="title">
<div>
<span class="title">
{{ $t('trials:inspection:title:pullImage') }}
<span>{{ tip }}</span>
</span>
<div class="search">
<el-form :inline="true" class="base-search-form">
<!-- pacsDicomAEId -->
<el-form-item
class="my_multiple"
:label="$t('trials:inspection:pullImage:search:pacsDicomAEId')"
>
<el-select
v-model="searchData.PacsDicomAEId"
style="width: 140px"
@change="pacsDicomAEIdChange"
>
<el-option
v-for="(item, index) of AElist"
:key="index.Id"
:label="item.CalledAE"
:value="item.Id"
>
<el-form-item class="my_multiple" :label="$t('trials:inspection:pullImage:search:pacsDicomAEId')">
<el-select v-model="searchData.PacsDicomAEId" style="width: 140px" @change="pacsDicomAEIdChange">
<el-option v-for="(item, index) of AElist" :key="index.Id" :label="item.CalledAE" :value="item.Id">
</el-option>
</el-select>
</el-form-item>
<!-- patientID -->
<el-form-item
class="my_multiple"
:label="$t('trials:inspection:pullImage:search:patientID')"
>
<el-input
v-model="searchData.PatientID"
clearable
style="width: 100px"
:maxlength="400"
></el-input>
<el-form-item class="my_multiple" :label="$t('trials:inspection:pullImage:search:patientID')">
<el-input v-model="searchData.PatientID" clearable style="width: 100px" :maxlength="400"></el-input>
</el-form-item>
<!-- patientName -->
<el-form-item
class="my_multiple"
:label="$t('trials:inspection:pullImage:search:patientName')"
>
<el-input
v-model="searchData.PatientName"
clearable
style="width: 100px"
:maxlength="400"
></el-input>
<el-form-item class="my_multiple" :label="$t('trials:inspection:pullImage:search:patientName')">
<el-input v-model="searchData.PatientName" clearable style="width: 100px" :maxlength="400"></el-input>
</el-form-item>
<!-- patientSex -->
<!-- <el-form-item
@ -112,38 +78,16 @@
></el-input>
</el-form-item> -->
<!-- modalitiesInStudy -->
<el-form-item
:label="$t('trials:inspection:pullImage:search:modalitiesInStudy')"
>
<el-select
v-model="searchData.ModalitiesInStudyList"
placeholder=""
clearable
multiple
collapse-tags
style="width: 140px"
>
<el-option
v-for="item in ModalityList"
:key="item"
:label="item"
:value="item"
/>
<el-form-item :label="$t('trials:inspection:pullImage:search:modalitiesInStudy')">
<el-select v-model="searchData.ModalitiesInStudyList" placeholder="" clearable multiple collapse-tags
style="width: 140px">
<el-option v-for="item in ModalityList" :key="item" :label="item" :value="item" />
</el-select>
</el-form-item>
<!-- studyDate -->
<el-form-item
:label="$t('trials:inspection:pullImage:search:studyDate')"
>
<el-date-picker
v-model="StudyDate"
type="daterange"
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期"
value-format="yyyyMMdd"
:picker-options="pickerOptions"
>
<el-form-item :label="$t('trials:inspection:pullImage:search:studyDate')">
<el-date-picker v-model="StudyDate" type="daterange" range-separator="" start-placeholder=""
end-placeholder="结束日期" value-format="yyyyMMdd" :picker-options="pickerOptions">
</el-date-picker>
</el-form-item>
<!-- studyTime -->
@ -200,97 +144,52 @@
{{ $t('common:button:search') }}
</el-button>
<!-- 重置 -->
<el-button
type="primary"
icon="el-icon-refresh-left"
@click="handleReset"
>
<el-button type="primary" icon="el-icon-refresh-left" @click="handleReset">
{{ $t('common:button:reset') }}
</el-button>
<!-- 拉取 -->
<el-button
type="primary"
:disabled="!multipleSelection || multipleSelection.length <= 0"
@click="pullImage()"
>
<el-button type="primary" :disabled="!multipleSelection || multipleSelection.length <= 0"
@click="pullImage()">
{{ $t('trials:inspection:button:pull') }}
</el-button>
</el-form-item>
</el-form>
</div>
<!--检查列表-->
<el-table
ref="viewStudyList"
v-loading="loading"
v-adaptive="{ bottomOffset: 60 }"
:data="PageList"
stripe
height="100"
@sort-change="handleSortByColumn"
@selection-change="handleSelectionChange"
>
<el-table ref="viewStudyList" v-loading="loading" v-adaptive="{ bottomOffset: 60 }" :data="PageList" stripe
height="100" @sort-change="handleSortByColumn" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" />
<el-table-column type="index" width="50">
<template slot-scope="scope">
<span
style="
<span style="
display: flex;
align-items: center;
justify-content: flex-end;
"
>
<el-tooltip
class="item"
effect="dark"
:content="$t('trials:inspection:pullImage:tip:has')"
placement="top"
style="margin-right: 3px"
>
<i
v-if="scope.row.IsStudyExist"
class="el-icon-success icon-i"
></i>
">
<el-tooltip class="item" effect="dark" :content="$t('trials:inspection:pullImage:tip:has')" placement="top"
style="margin-right: 3px">
<i v-if="scope.row.IsStudyExist" class="el-icon-success icon-i"></i>
</el-tooltip>
<span>{{ scope.$index + 1 }}</span>
</span>
</template>
</el-table-column>
<!--patientID-->
<el-table-column
prop="PatientID"
:label="$t('trials:inspection:pullImage:table:patientID')"
show-overflow-tooltip
min-width="120"
sortable="custom"
/>
<el-table-column prop="PatientID" :label="$t('trials:inspection:pullImage:table:patientID')" show-overflow-tooltip
min-width="120" sortable="custom" />
<!--patientName-->
<el-table-column
prop="PatientName"
:label="$t('trials:inspection:pullImage:table:patientName')"
show-overflow-tooltip
min-width="120"
sortable="custom"
/>
<el-table-column prop="PatientName" :label="$t('trials:inspection:pullImage:table:patientName')"
show-overflow-tooltip min-width="120" sortable="custom" />
<!--patientSex-->
<el-table-column
prop="PatientSex"
:label="$t('trials:inspection:pullImage:table:patientSex')"
show-overflow-tooltip
min-width="80"
sortable="custom"
>
<el-table-column prop="PatientSex" :label="$t('trials:inspection:pullImage:table:patientSex')"
show-overflow-tooltip min-width="80" sortable="custom">
<template slot-scope="scope">
<span>{{ $fd('Sex', scope.row.PatientSex) }}</span>
</template>
</el-table-column>
<!--patientBirthDate-->
<el-table-column
prop="PatientBirthDate"
:label="$t('trials:inspection:pullImage:table:patientBirthDate')"
show-overflow-tooltip
min-width="120"
sortable="custom"
/>
<el-table-column prop="PatientBirthDate" :label="$t('trials:inspection:pullImage:table:patientBirthDate')"
show-overflow-tooltip min-width="120" sortable="custom" />
<!--studyID-->
<!-- <el-table-column
prop="StudyID"
@ -299,37 +198,17 @@
min-width="120"
/> -->
<!--AccessionNumber-->
<el-table-column
prop="AccessionNumber"
:label="$t('trials:inspection:pullImage:table:AccessionNumber')"
show-overflow-tooltip
min-width="120"
sortable="custom"
/>
<el-table-column prop="AccessionNumber" :label="$t('trials:inspection:pullImage:table:AccessionNumber')"
show-overflow-tooltip min-width="120" sortable="custom" />
<!--modalitiesInStudy-->
<el-table-column
prop="ModalitiesInStudy"
:label="$t('trials:inspection:pullImage:table:modalitiesInStudy')"
show-overflow-tooltip
min-width="120"
sortable="custom"
/>
<el-table-column prop="ModalitiesInStudy" :label="$t('trials:inspection:pullImage:table:modalitiesInStudy')"
show-overflow-tooltip min-width="120" sortable="custom" />
<!--studyDate-->
<el-table-column
prop="StudyDate"
:label="$t('trials:inspection:pullImage:table:studyDate')"
show-overflow-tooltip
min-width="120"
sortable="custom"
/>
<el-table-column prop="StudyDate" :label="$t('trials:inspection:pullImage:table:studyDate')" show-overflow-tooltip
min-width="120" sortable="custom" />
<!--studyTime-->
<el-table-column
prop="StudyTime"
:label="$t('trials:inspection:pullImage:table:studyTime')"
show-overflow-tooltip
min-width="120"
sortable="custom"
/>
<el-table-column prop="StudyTime" :label="$t('trials:inspection:pullImage:table:studyTime')" show-overflow-tooltip
min-width="120" sortable="custom" />
<!--bodyPartExamined-->
<!-- <el-table-column
prop="BodyPartExamined"
@ -339,47 +218,26 @@
sortable="custom"
/> -->
<!--studyDescription-->
<el-table-column
prop="StudyDescription"
:label="$t('trials:inspection:pullImage:table:studyDescription')"
show-overflow-tooltip
min-width="120"
sortable="custom"
/>
<el-table-column prop="StudyDescription" :label="$t('trials:inspection:pullImage:table:studyDescription')"
show-overflow-tooltip min-width="120" sortable="custom" />
<!--studyInstanceUID-->
<el-table-column
prop="StudyInstanceUID"
:label="$t('trials:inspection:pullImage:table:studyInstanceUID')"
show-overflow-tooltip
min-width="120"
sortable="custom"
/>
<el-table-column prop="StudyInstanceUID" :label="$t('trials:inspection:pullImage:table:studyInstanceUID')"
show-overflow-tooltip min-width="120" sortable="custom" />
<!--操作-->
<el-table-column :label="$t('common:action:action')" min-width="80">
<template slot-scope="scope">
<el-button
circle
icon="el-icon-refresh"
class="refreshBtn"
:title="$t('trials:inspection:button:pull')"
@click.stop="pullImage(scope.row)"
/>
<el-button circle icon="el-icon-refresh" class="refreshBtn" :title="$t('trials:inspection:button:pull')"
@click.stop="pullImage(scope.row)" />
</template>
</el-table-column>
</el-table>
<!-- 分页组件 -->
<pagination
class="page"
:total="total"
:page.sync="PageIndex"
:limit.sync="PageSize"
@pagination="paging"
/>
</el-dialog>
<pagination class="page" :total="total" :page.sync="PageIndex" :limit.sync="PageSize" @pagination="paging" />
</div>
</template>
<script>
<script>
import Pagination from '@/components/Pagination'
import {
getCFindStudyList,
@ -406,13 +264,9 @@ const defaultSearchData = () => {
}
}
export default {
name: 'pushRecordList',
name: 'byPatient',
components: { Pagination },
props: {
visible: {
required: true,
default: false,
},
calledAeList: {
required: true,
default: () => {
@ -435,11 +289,6 @@ export default {
MaxStudyCount: null,
PatientBirthDate: [],
StudyDate: [],
// StudyTime: [
// new Date(2016, 9, 10, 0, 0, 0),
// new Date(2016, 9, 10, 23, 59, 59),
// ],
// StudyTime: [new Date(new Date().getTime() - 10800000), new Date()],
//
loading: false,
list: [],
@ -724,10 +573,6 @@ export default {
}
this.paging()
},
beforeCloseStudyDig() {
this.$setOpenWindow()
this.$emit('update:visible', false)
},
// pacs
async pullImage(row) {
try {
@ -794,9 +639,11 @@ export default {
color: #67c23a;
cursor: pointer;
}
.refreshBtn {
// transform: rotate(0);
transition: 0.5s;
&:hover {
transform: rotate(180deg);
transition: 0.5s;

View File

@ -0,0 +1,689 @@
<template>
<div>
<span class="title">
{{ $t('trials:inspection:title:pullImage') }}
<span>{{ tip }}</span>
</span>
<div class="search">
<el-form :inline="true" class="base-search-form">
<!-- TrialId -->
<el-form-item class="my_multiple" :label="$t('trials:inspection:pullImage:search:TrialId')">
<el-select v-model="searchData.TrialId" style="width: 140px" @change="searchData.PatientID = null">
<el-option v-for="(item, index) of trialList" :key="index.TrialId" :label="item.ExperimentName"
:value="item.TrialId">
</el-option>
</el-select>
</el-form-item>
<!-- pacsDicomAEId -->
<el-form-item class="my_multiple" :label="$t('trials:inspection:pullImage:search:pacsDicomAEId')">
<el-select v-model="searchData.PacsDicomAEId" style="width: 140px" @change="pacsDicomAEIdChange">
<el-option v-for="(item, index) of AElist" :key="index.Id" :label="item.CalledAE"
:value="item.Id">
</el-option>
</el-select>
</el-form-item>
<!-- patientID -->
<el-form-item class="my_multiple" :label="$t('trials:inspection:pullImage:search:patientID')">
<el-select v-model="searchData.PatientID" style="width: 140px">
<el-option v-for="(item, index) of patientList" :key="index.PatientIdStr"
:label="item.PatientName" :value="item.PatientIdStr">
</el-option>
</el-select>
</el-form-item>
<!-- patientName -->
<!-- <el-form-item class="my_multiple" :label="$t('trials:inspection:pullImage:search:patientName')">
<el-input v-model="searchData.PatientName" clearable style="width: 100px"
:maxlength="400"></el-input>
</el-form-item> -->
<!-- patientSex -->
<!-- <el-form-item
class="my_multiple"
:label="$t('trials:inspection:pullImage:search:patientSex')"
>
<el-select
v-model="searchData.PatientSex"
clearable
style="width: 140px"
>
<el-option
v-for="item of $d.Sex"
:key="item.id"
:label="item.label"
:value="item.value"
>
</el-option>
</el-select>
</el-form-item> -->
<!-- patientBirthDate -->
<!-- <el-form-item
:label="$t('trials:inspection:pullImage:search:patientBirthDate')"
>
<el-date-picker
v-model="PatientBirthDate"
type="daterange"
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期"
value-format="yyyyMMDD"
>
</el-date-picker>
</el-form-item> -->
<!-- studyID -->
<!-- <el-form-item
class="my_multiple"
:label="$t('trials:inspection:pullImage:search:studyID')"
>
<el-input
v-model="searchData.StudyID"
clearable
:maxlength="400"
></el-input>
</el-form-item> -->
<!-- AccessionNumber -->
<!-- <el-form-item
class="my_multiple"
:label="$t('trials:inspection:pullImage:search:AccessionNumber')"
>
<el-input
v-model="searchData.AccessionNumber"
clearable
style="width: 100px"
:maxlength="400"
></el-input>
</el-form-item> -->
<!-- modalitiesInStudy -->
<el-form-item :label="$t('trials:inspection:pullImage:search:modalitiesInStudy')">
<el-select v-model="searchData.ModalitiesInStudyList" placeholder="" clearable multiple
collapse-tags style="width: 140px">
<el-option v-for="item in ModalityList" :key="item" :label="item" :value="item" />
</el-select>
</el-form-item>
<!-- studyDate -->
<el-form-item :label="$t('trials:inspection:pullImage:search:studyDate')">
<el-date-picker v-model="StudyDate" type="daterange" range-separator="" start-placeholder=""
end-placeholder="结束日期" value-format="yyyyMMdd" :picker-options="pickerOptions">
</el-date-picker>
</el-form-item>
<!-- studyTime -->
<!-- <el-form-item
:label="$t('trials:inspection:pullImage:search:studyTime')"
>
<el-time-picker
is-range
arrow-control
v-model="StudyTime"
range-separator="至"
start-placeholder="开始时间"
end-placeholder="结束时间"
placeholder="选择时间范围"
>
</el-time-picker>
</el-form-item> -->
<!-- bodyPartExamined -->
<!-- <el-form-item
class="my_multiple"
:label="$t('trials:inspection:pullImage:search:bodyPartExamined')"
>
<el-input
v-model="searchData.BodyPartExamined"
clearable
:maxlength="400"
></el-input>
</el-form-item> -->
<!-- studyDescription -->
<!-- <el-form-item
class="my_multiple"
:label="$t('trials:inspection:pullImage:search:studyDescription')"
>
<el-input
v-model="searchData.StudyDescription"
clearable
:maxlength="400"
></el-input>
</el-form-item> -->
<!-- studyInstanceUID -->
<!-- <el-form-item
class="my_multiple"
:label="$t('trials:inspection:pullImage:search:studyInstanceUID')"
>
<el-input
v-model="searchData.StudyInstanceUID"
clearable
:maxlength="400"
></el-input>
</el-form-item> -->
<el-form-item>
<!-- 查询 -->
<el-button type="primary" icon="el-icon-search" @click="handleSearch">
{{ $t('common:button:search') }}
</el-button>
<!-- 重置 -->
<el-button type="primary" icon="el-icon-refresh-left" @click="handleReset">
{{ $t('common:button:reset') }}
</el-button>
<!-- 拉取 -->
<el-button type="primary" :disabled="!multipleSelection || multipleSelection.length <= 0"
@click="pullImage()">
{{ $t('trials:inspection:button:pull') }}
</el-button>
</el-form-item>
</el-form>
</div>
<!--检查列表-->
<el-table ref="viewStudyList" v-loading="loading" v-adaptive="{ bottomOffset: 60 }" :data="PageList" stripe
height="100" @sort-change="handleSortByColumn" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" />
<el-table-column type="index" width="50">
<template slot-scope="scope">
<span style="
display: flex;
align-items: center;
justify-content: flex-end;
">
<el-tooltip class="item" effect="dark" :content="$t('trials:inspection:pullImage:tip:has')"
placement="top" style="margin-right: 3px">
<i v-if="scope.row.IsStudyExist" class="el-icon-success icon-i"></i>
</el-tooltip>
<span>{{ scope.$index + 1 }}</span>
</span>
</template>
</el-table-column>
<!--patientID-->
<el-table-column prop="PatientID" :label="$t('trials:inspection:pullImage:table:patientID')"
show-overflow-tooltip min-width="120" sortable="custom" />
<!--patientName-->
<el-table-column prop="PatientName" :label="$t('trials:inspection:pullImage:table:patientName')"
show-overflow-tooltip min-width="120" sortable="custom" />
<!--patientSex-->
<el-table-column prop="PatientSex" :label="$t('trials:inspection:pullImage:table:patientSex')"
show-overflow-tooltip min-width="80" sortable="custom">
<template slot-scope="scope">
<span>{{ $fd('Sex', scope.row.PatientSex) }}</span>
</template>
</el-table-column>
<!--patientBirthDate-->
<el-table-column prop="PatientBirthDate" :label="$t('trials:inspection:pullImage:table:patientBirthDate')"
show-overflow-tooltip min-width="120" sortable="custom" />
<!--studyID-->
<!-- <el-table-column
prop="StudyID"
:label="$t('trials:inspection:pullImage:table:studyID')"
show-overflow-tooltip
min-width="120"
/> -->
<!--AccessionNumber-->
<el-table-column prop="AccessionNumber" :label="$t('trials:inspection:pullImage:table:AccessionNumber')"
show-overflow-tooltip min-width="120" sortable="custom" />
<!--modalitiesInStudy-->
<el-table-column prop="ModalitiesInStudy" :label="$t('trials:inspection:pullImage:table:modalitiesInStudy')"
show-overflow-tooltip min-width="120" sortable="custom" />
<!--studyDate-->
<el-table-column prop="StudyDate" :label="$t('trials:inspection:pullImage:table:studyDate')"
show-overflow-tooltip min-width="120" sortable="custom" />
<!--studyTime-->
<el-table-column prop="StudyTime" :label="$t('trials:inspection:pullImage:table:studyTime')"
show-overflow-tooltip min-width="120" sortable="custom" />
<!--bodyPartExamined-->
<!-- <el-table-column
prop="BodyPartExamined"
:label="$t('trials:inspection:pullImage:table:bodyPartExamined')"
show-overflow-tooltip
min-width="120"
sortable="custom"
/> -->
<!--studyDescription-->
<el-table-column prop="StudyDescription" :label="$t('trials:inspection:pullImage:table:studyDescription')"
show-overflow-tooltip min-width="120" sortable="custom" />
<!--studyInstanceUID-->
<el-table-column prop="StudyInstanceUID" :label="$t('trials:inspection:pullImage:table:studyInstanceUID')"
show-overflow-tooltip min-width="120" sortable="custom" />
<!--操作-->
<el-table-column :label="$t('common:action:action')" min-width="80">
<template slot-scope="scope">
<el-button circle icon="el-icon-refresh" class="refreshBtn"
:title="$t('trials:inspection:button:pull')" @click.stop="pullImage(scope.row)" />
</template>
</el-table-column>
</el-table>
<!-- 分页组件 -->
<pagination class="page" :total="total" :page.sync="PageIndex" :limit.sync="PageSize" @pagination="paging" />
</div>
</template>
<script>
import Pagination from '@/components/Pagination'
import {
getCFindStudyList,
cmoveStudyList,
cMoveVerify,
getUserJoinedTrialPatientList
} from '@/api/inspection.js'
import { getDicomAEList } from '@/api/dicomAE.js'
const defaultSearchData = () => {
return {
PacsDicomAEId: null,
PatientID: null,
PatientName: null,
ModalitiesInStudyList: null,
StudyDate: null,
TrialId: null,
PatientSex: null,
PatientBirthDate: null,
StudyID: null,
StudyTime: null,
BodyPartExamined: null,
StudyDescription: null,
StudyInstanceUID: null,
AccessionNumber: null,
}
}
export default {
name: 'byTrials',
components: { Pagination },
props: {
calledAeList: {
required: true,
default: () => {
return []
},
},
callingAeList: {
required: true,
default: () => {
return []
},
},
},
data() {
return {
//
searchData: defaultSearchData(),
ModalityList: [],
timeFrame: null,
MaxStudyCount: null,
PatientBirthDate: [],
StudyDate: [],
//
loading: false,
list: [],
PageList: [],
total: 0,
PageIndex: 1,
PageSize: 50,
AElist: [],
multipleSelection: [],
trialList: []
}
},
computed: {
pickerOptions() {
return {
shortcuts: [
{
text: this.$t('trials:inspection:pullImage:picker:today'),
onClick: (picker) => {
const end = new Date()
const start = new Date()
// picker.$emit('pick', [start, end])
this.StudyDate = [start, end]
},
},
{
text: this.$t('trials:inspection:pullImage:picker:week'),
onClick: (picker) => {
const end = new Date()
const start = new Date()
if (!this.timeFrame || this.timeFrame > 3) {
start.setTime(start.getTime() - 3600 * 1000 * 24 * 2)
} else {
start.setTime(
start.getTime() - 3600 * 1000 * 24 * (this.timeFrame - 1)
)
}
// picker.$emit('pick', [start, end])
this.StudyDate = [start, end]
},
},
{
text: this.$t('trials:inspection:pullImage:picker:month'),
onClick: (picker) => {
const end = new Date()
const start = new Date()
let month = this.$moment().subtract(1, 'months')
let day = this.$moment().diff(month, 'day')
if (!this.timeFrame || this.timeFrame > day) {
start.setTime(start.getTime() - 3600 * 1000 * 24 * (day - 1))
} else {
start.setTime(
start.getTime() - 3600 * 1000 * 24 * (this.timeFrame - 1)
)
}
// picker.$emit('pick', [start, end])
this.StudyDate = [start, end]
},
},
{
text: this.$t('trials:inspection:pullImage:picker:trimester'),
onClick: (picker) => {
const end = new Date()
const start = new Date()
let month = this.$moment().subtract(3, 'months')
let day = this.$moment().diff(month, 'day')
if (!this.timeFrame || this.timeFrame > day) {
start.setTime(start.getTime() - 3600 * 1000 * 24 * (day - 1))
} else {
start.setTime(
start.getTime() - 3600 * 1000 * 24 * (this.timeFrame - 1)
)
}
// picker.$emit('pick', [start, end])
this.StudyDate = [start, end]
},
},
],
disabledDate: (time) => {
if (!this.timeFrame) return false
let curDate = new Date().getTime()
let three = this.timeFrame * 24 * 3600 * 1000
let threeMonths = curDate - three
return time.getTime() >= Date.now() || time.getTime() <= threeMonths
},
}
},
tip() {
if (!this.searchData.PacsDicomAEId) return ''
let message = `( ${this.$t('trials:inspection:pullImage:PacsTip')} )`
message = message.replace(
'xxx',
this.AElist.find((item) => item.Id === this.searchData.PacsDicomAEId)
.CalledAE
)
if (!this.timeFrame) {
message = message.replace(
'yyy',
this.$t('trials:inspection:pullImage:unlimit')
)
} else {
message = message.replace(
'yyy',
`${this.timeFrame}${this.$t('trials:inspection:unit:day')}`
)
}
if (!this.MaxStudyCount) {
message = message.replace(
'zzz',
this.$t('trials:inspection:pullImage:unlimit')
)
} else {
message = message.replace(
'zzz',
`${this.MaxStudyCount}${this.$t('trials:inspection:unit:article')}`
)
}
message = message.replace('kkk', this.ModalityList.join(''))
return message
},
patientList() {
let arr = []
if (this.searchData.TrialId) {
arr = this.trialList.find(item => item.TrialId === this.searchData.TrialId).PatientList
}
return arr
}
},
created() {
this.getAEList()
this.getTrialList()
},
methods: {
//
async getTrialList() {
try {
let res = await getUserJoinedTrialPatientList()
if (res.IsSuccess) {
this.trialList = res.Result
}
} catch (err) {
console.log(err)
}
},
pacsDicomAEIdChange(val, f = false) {
let pacs = this.AElist.find((item) => item.Id === val)
this.ModalityList = pacs.ModalityList
this.timeFrame = pacs.PacsSearchMaxDays
this.MaxStudyCount = pacs.MaxStudyCount
if (!f) {
this.handleReset()
}
},
// pacs
async cMoveVerify(data) {
try {
let res = await cMoveVerify(data)
if (res.IsSuccess) {
return res.Result
}
return false
} catch (err) {
console.log(err)
return false
}
},
async getList() {
if (!this.searchData.PacsDicomAEId)
return this.$message.warning(
this.$t('trials:inspection:pullImage:message:mustPacsDicomAEId')
)
let data = {}
Object.keys(this.searchData).forEach((key) => {
data[key] = this.searchData[key]
})
// if (
// this.PatientBirthDate &&
// this.PatientBirthDate[0] &&
// this.PatientBirthDate[1]
// ) {
// data.PatientBirthDate =
// this.PatientBirthDate[0] + '-' + this.PatientBirthDate[1]
// } else {
// data.PatientBirthDate = null
// }
if (this.StudyDate && this.StudyDate[0] && this.StudyDate[1]) {
data.StudyDate =
this.$moment(this.StudyDate[0]).format('YYYYMMDD') +
'-' +
this.$moment(this.StudyDate[1]).format('YYYYMMDD')
} else {
data.StudyDate = null
}
// if (this.StudyTime && this.StudyTime[0] && this.StudyTime[1]) {
// data.StudyTime =
// this.$moment(this.StudyTime[0]).format('HHmmss') +
// '-' +
// this.$moment(this.StudyTime[1]).format('HHmmss')
// } else {
// data.StudyTime = null
// }
try {
this.loading = true
let res = await getCFindStudyList(data)
this.loading = false
if (res.IsSuccess) {
this.list = res.Result
this.total = res.Result.length
this.paging()
let MaxStudyCount = this.MaxStudyCount || 50
if (this.total >= MaxStudyCount) {
let message = this.$t(
'trials:inspection:pullImage:confirm:limit50'
).replace('xxx', MaxStudyCount)
this.$confirm(message, '', {
type: 'warning',
showCancelButton: false,
})
}
}
} catch (err) {
this.loading = false
console.log(err)
}
},
//
async getAEList(f = false) {
let data = {
CalledAE: null,
IP: null,
Port: null,
PacsTypeEnum: 2,
IsTestOK: true,
PageIndex: 1,
PageSize: 1000,
SortField: 'CreateTime',
Asc: false,
}
try {
this.loading = true
let res = await getDicomAEList(data)
this.loading = false
if (res.IsSuccess) {
this.AElist = res.Result.CurrentPageData
if (this.AElist.length > 0) {
if (!f) {
this.searchData.PacsDicomAEId = this.AElist[0].Id
this.ModalityList = this.AElist[0].ModalityList
this.timeFrame = this.AElist[0].PacsSearchMaxDays
this.MaxStudyCount = this.AElist[0].MaxStudyCount
this.searchData.ModalitiesInStudyList = [this.ModalityList[0]]
this.StudyDate = [new Date(), new Date()]
} else {
this.pacsDicomAEIdChange(this.searchData.PacsDicomAEId, true)
}
this.getList()
}
}
} catch (err) {
console.log(err)
}
},
//
paging() {
this.PageList = []
if (!this.list || this.list.length <= 0) return false
this.PageList = this.list.slice(
(this.PageIndex - 1) * this.PageSize,
this.PageIndex * this.PageSize
)
},
//
handleSearch() {
// this.searchData.PageIndex = 1
this.getAEList(true)
},
//
handleReset() {
this.reset()
this.getAEList(true)
},
//
reset() {
// this.searchData = defaultSearchData()
Object.keys(this.searchData).forEach((key) => {
if (key !== 'PacsDicomAEId') {
this.searchData[key] = null
}
})
// this.PatientBirthDate = []
this.StudyDate = []
// this.StudyTime = [new Date(new Date().getTime() - 10800000), new Date()]
},
//
handleSortByColumn(sort) {
if (sort.order === 'ascending') {
this.list.sort((a, b) => (a[sort.prop] > b[sort.prop] ? 1 : -1))
}
if (sort.order === 'descending') {
this.list.sort((a, b) => (b[sort.prop] > a[sort.prop] ? 1 : -1))
}
this.paging()
},
// pacs
async pullImage(row) {
try {
let data = {
PacsDicomAEId: this.searchData.PacsDicomAEId,
// studyIDList: [row.StudyID],
}
if (row) {
data.StudyInstanceUIDList = [row.StudyInstanceUID]
} else {
data.StudyInstanceUIDList = this.multipleSelection.map(
(item) => item.StudyInstanceUID
)
}
let r = await this.cMoveVerify(data)
if (!r) return false
let isPullList = []
Object.keys(r).forEach((key) => {
if (r[key]) {
isPullList.push(key)
}
})
let message = this.$t('trials:inspection:pullImage:confirm:pull')
let patientMessage = ''
if (isPullList.length > 0) {
isPullList.forEach((key) => {
patientMessage += `患者:${r[key].PatientName},检查申请号:${r[key].AccessionNumber}<br/>`
})
if (patientMessage) {
message =
patientMessage +
'<br/>' +
this.$t('trials:inspection:pullImage:message:isHasPull') +
'' +
message
}
}
let confirm = await this.$confirm(message, '', {
dangerouslyUseHTMLString: true,
})
if (!confirm) return false
this.loading = true
let res = await cmoveStudyList(data)
this.loading = false
if (res.IsSuccess) {
this.$message.success(
this.$t('trials:inspection:pullImage:message:pullSuccess')
)
}
} catch (err) {
this.loading = false
console.log(err)
}
},
handleSelectionChange(val) {
this.multipleSelection = val
},
},
}
</script>
<style lang="scss" scoped>
.icon-i {
color: #67c23a;
cursor: pointer;
}
.refreshBtn {
// transform: rotate(0);
transition: 0.5s;
&:hover {
transform: rotate(180deg);
transition: 0.5s;
}
}
</style>

View File

@ -0,0 +1,71 @@
<template>
<el-dialog :visible.sync="visible" :close-on-click-modal="false" :fullscreen="true" custom-class="upload-dialog"
:before-close="beforeCloseStudyDig">
<el-tabs v-model="activeName" type="card" @tab-click="handleClick">
<el-tab-pane :label="$t('trials:inspection:pullImage:title:byPatient')" name="byPatient">
<byPatient :calledAeList="calledAeList" :callingAeList="callingAeList"
v-if="activeName === 'byPatient'" />
</el-tab-pane>
<el-tab-pane :label="$t('trials:inspection:pullImage:title:byTrials')" name="byTrials">
<byTrials :calledAeList="calledAeList" :callingAeList="callingAeList"
v-if="activeName === 'byTrials'" />
</el-tab-pane>
</el-tabs>
</el-dialog>
</template>
<script>
import byPatient from './byPatient.vue'
import byTrials from './byTrials.vue'
export default {
name: 'pullImage',
components: { byPatient, byTrials },
props: {
visible: {
required: true,
default: false,
},
calledAeList: {
required: true,
default: () => {
return []
},
},
callingAeList: {
required: true,
default: () => {
return []
},
},
},
data() {
return {
activeName: 'byPatient', // byPatient byTrials
}
},
methods: {
handleClick() { },
beforeCloseStudyDig() {
this.$setOpenWindow()
this.$emit('update:visible', false)
},
},
}
</script>
<style lang="scss" scoped>
::v-deep .el-dialog__header {
padding: 0;
padding-top: 10px;
}
::v-deep .title {
line-height: 24px;
font-size: 18px;
color: #303133;
padding: 20px 0;
padding-bottom: 10px;
}
::v-deep .el-dialog__headerbtn {
z-index: 99;
}
</style>

View File

@ -5,77 +5,33 @@
<el-form :inline="true" class="base-search-form">
<!-- 患者ID/患者姓名 -->
<el-form-item :label="$t('trials:uploadDicomList:table:pId')">
<el-input
v-model="searchData.PatientIdStr"
style="width: 100px"
clearable
/>
<el-input v-model="searchData.PatientIdStr" style="width: 100px" clearable />
</el-form-item>
<el-form-item :label="$t('trials:uploadDicomList:table:patientName')">
<el-input
v-model="searchData.PatientName"
style="width: 100px"
clearable
/>
<el-input v-model="searchData.PatientName" style="width: 100px" clearable />
</el-form-item>
<!-- Called AE -->
<el-form-item
class="my_multiple"
:label="$t('trials:inspection:search:CalledAE')"
>
<el-select
v-model="searchData.CalledAEList"
clearable
multiple
style="width: 140px"
>
<el-option
v-for="(item, index) of calledAeList"
:key="index"
:label="item"
:value="item"
>
<el-form-item class="my_multiple" :label="$t('trials:inspection:search:CalledAE')">
<el-select v-model="searchData.CalledAEList" clearable multiple style="width: 140px">
<el-option v-for="(item, index) of calledAeList" :key="index" :label="item" :value="item">
</el-option>
</el-select>
</el-form-item>
<!-- Calling AE -->
<el-form-item
class="my_multiple"
:label="$t('trials:inspection:search:CallingAE')"
>
<el-select
v-model="searchData.callingAE"
clearable
style="width: 140px"
>
<el-option
v-for="(item, index) of callingAeList"
:key="index"
:label="item"
:value="item"
>
<el-form-item class="my_multiple" :label="$t('trials:inspection:search:CallingAE')">
<el-select v-model="searchData.callingAE" clearable style="width: 140px">
<el-option v-for="(item, index) of callingAeList" :key="index" :label="item" :value="item">
</el-option>
</el-select>
</el-form-item>
<!-- 研究名称 -->
<el-form-item :label="$t('trials:trials-list:table:researchName')">
<el-input
v-model="searchData.ExperimentName"
style="width: 100px"
clearable
/>
<el-input v-model="searchData.ExperimentName" style="width: 100px" clearable />
</el-form-item>
<!-- 最新接收时间 -->
<el-form-item :label="$t('trials:inspection:table:latestReceiveTime')">
<el-date-picker
v-model="dateValue"
type="datetimerange"
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="['00:00:00', '23:59:59']"
clearable
>
<el-date-picker v-model="dateValue" type="datetimerange" range-separator="" start-placeholder=""
end-placeholder="结束日期" :default-time="['00:00:00', '23:59:59']" clearable>
</el-date-picker>
</el-form-item>
<el-form-item>
@ -84,11 +40,7 @@
{{ $t('common:button:search') }}
</el-button>
<!-- 重置 -->
<el-button
type="primary"
icon="el-icon-refresh-left"
@click="handleReset"
>
<el-button type="primary" icon="el-icon-refresh-left" @click="handleReset">
{{ $t('common:button:reset') }}
</el-button>
</el-form-item>
@ -100,11 +52,8 @@
</el-form-item>
<el-form-item>
<!-- pacs拉取 -->
<el-button
type="primary"
@click="handleOpenDialog({}, 'pull')"
v-hasPermi="['trials:trialsInspection:pullPACS']"
>
<el-button type="primary" @click="handleOpenDialog({}, 'pull')"
v-hasPermi="['trials:trialsInspection:pullPACS']">
{{ $t('common:button:pull') }}
</el-button>
</el-form-item>
@ -113,103 +62,51 @@
<!-- 检查列表 -->
<template slot="main-container">
<el-table
ref="inspectionList"
v-loading="loading"
v-adaptive="{ bottomOffset: 60 }"
:data="list"
stripe
height="100"
@sort-change="handleSortByColumn"
:default-sort="{ prop: 'LatestPushTime', order: 'descending' }"
>
<el-table ref="inspectionList" v-loading="loading" v-adaptive="{ bottomOffset: 60 }" :data="list" stripe
height="100" @sort-change="handleSortByColumn" :default-sort="{ prop: 'LatestPushTime', order: 'descending' }">
<el-table-column type="index" width="40" />
<!--患者ID-->
<el-table-column
prop="PatientIdStr"
:label="$t('trials:uploadDicomList:table:pId')"
show-overflow-tooltip
min-width="120"
sortable="custom"
></el-table-column>
<el-table-column prop="PatientIdStr" :label="$t('trials:uploadDicomList:table:pId')" show-overflow-tooltip
min-width="120" sortable="custom"></el-table-column>
<!--患者姓名-->
<el-table-column
prop="PatientName"
:label="$t('trials:uploadDicomList:table:patientName')"
show-overflow-tooltip
min-width="120"
sortable="custom"
></el-table-column>
<el-table-column prop="PatientName" :label="$t('trials:uploadDicomList:table:patientName')"
show-overflow-tooltip min-width="120" sortable="custom"></el-table-column>
<!--出生日期-->
<el-table-column
prop="PatientBirthDate"
:label="$t('trials:inspection:table:birthdate')"
show-overflow-tooltip
min-width="120"
sortable="custom"
></el-table-column>
<el-table-column prop="PatientBirthDate" :label="$t('trials:inspection:table:birthdate')" show-overflow-tooltip
min-width="120" sortable="custom"></el-table-column>
<!--性别-->
<el-table-column
prop="PatientSex"
:label="$t('trials:trials-myinfo:form:gender')"
show-overflow-tooltip
min-width="100"
sortable="custom"
>
<el-table-column prop="PatientSex" :label="$t('trials:trials-myinfo:form:gender')" show-overflow-tooltip
min-width="100" sortable="custom">
<template slot-scope="scope">
<span>{{ $fd('Sex', scope.row.PatientSex) }}</span>
</template>
</el-table-column>
<!--Called AE-->
<el-table-column
prop="CalledAEList"
:label="$t('trials:inspection:table:CalledAE')"
show-overflow-tooltip
min-width="120"
>
<el-table-column prop="CalledAEList" :label="$t('trials:inspection:table:CalledAE')" show-overflow-tooltip
min-width="120">
<template slot-scope="scope">
<span
v-for="(item, index) in scope.row.CalledAEList"
:key="`CalledAEList${index}`"
>{{
index === scope.row.CalledAEList.length - 1 ? item : `${item}, `
}}</span
>
<span v-for="(item, index) in scope.row.CalledAEList" :key="`CalledAEList${index}`">{{
index === scope.row.CalledAEList.length - 1 ? item : `${item}, `
}}</span>
</template>
</el-table-column>
<!--Calling AE-->
<el-table-column
prop="CallingAEList"
:label="$t('trials:inspection:table:CallingAE')"
show-overflow-tooltip
min-width="120"
>
<el-table-column prop="CallingAEList" :label="$t('trials:inspection:table:CallingAE')" show-overflow-tooltip
min-width="120">
<template slot-scope="scope">
<span
v-for="(item, index) in scope.row.CallingAEList"
:key="`CallingAEList${index}`"
>{{
index === scope.row.CallingAEList.length - 1
? item
: `${item}, `
}}</span
>
<span v-for="(item, index) in scope.row.CallingAEList" :key="`CallingAEList${index}`">{{
index === scope.row.CallingAEList.length - 1
? item
: `${item}, `
}}</span>
</template>
</el-table-column>
<!-- 研究名称 -->
<el-table-column
prop="TrialList"
:label="$t('trials:trials-list:table:researchName')"
show-overflow-tooltip
min-width="120"
>
<el-table-column prop="TrialList" :label="$t('trials:trials-list:table:researchName')" show-overflow-tooltip
min-width="120">
<template slot-scope="scope">
<el-button
type="text"
@click="handleOpenDialog(scope.row, 'research')"
v-for="(item, index) in scope.row.TrialList"
:key="`TrialList${index}`"
>
<el-button type="text" @click="handleOpenDialog(scope.row, 'research')"
v-for="(item, index) in scope.row.TrialList" :key="`TrialList${index}`">
<span>{{
index === scope.row.TrialList.length - 1
? `${item.ExperimentName}${item.VisitCount}`
@ -220,52 +117,28 @@
</template>
</el-table-column>
<!-- 检查数 -->
<el-table-column
prop="StudyCount"
:label="$t('trials:studyList:table:count')"
show-overflow-tooltip
min-width="100"
sortable="custom"
>
<el-table-column prop="StudyCount" :label="$t('trials:studyList:table:count')" show-overflow-tooltip
min-width="100" sortable="custom">
<template slot-scope="scope">
<el-button
v-if="scope.row.StudyCount >= 1"
type="text"
@click="handleOpenDialog(scope.row, 'study')"
>
<el-button v-if="scope.row.StudyCount >= 1" type="text" @click="handleOpenDialog(scope.row, 'study')">
<span>{{ scope.row.StudyCount }}</span>
</el-button>
<span v-else>{{ scope.row.StudyCount }}</span>
</template>
</el-table-column>
<!--最新接收时间-->
<el-table-column
prop="LatestPushTime"
:label="$t('trials:inspection:table:latestReceiveTime')"
show-overflow-tooltip
min-width="180"
sortable="custom"
></el-table-column>
<el-table-column prop="LatestPushTime" :label="$t('trials:inspection:table:latestReceiveTime')"
show-overflow-tooltip min-width="180" sortable="custom"></el-table-column>
<!--操作-->
<el-table-column
:label="$t('common:action:action')"
min-width="100"
fixed="right"
v-if="
hasPermi([
'trials:trialsInspection:addTrials',
'trials:trialsInspection:delPatient',
])
"
>
<el-table-column :label="$t('common:action:action')" min-width="100" fixed="right" v-if="
hasPermi([
'trials:trialsInspection:addTrials',
'trials:trialsInspection:delPatient',
])
">
<template slot-scope="scope">
<el-button
circle
v-hasPermi="['trials:trialsInspection:addTrials']"
icon="el-icon-plus"
:title="$t('trials:inspection:button:addTrials')"
@click.stop="handleOpenDialog(scope.row, 'add')"
/>
<el-button circle v-hasPermi="['trials:trialsInspection:addTrials']" icon="el-icon-plus"
:title="$t('trials:inspection:button:addTrials')" @click.stop="handleOpenDialog(scope.row, 'add')" />
<!-- <el-button
circle
icon="el-icon-delete"
@ -278,52 +151,25 @@
</el-table>
<!-- 分页组件 -->
<pagination
class="page"
:total="total"
:page.sync="searchData.PageIndex"
:limit.sync="searchData.PageSize"
@pagination="getList"
/>
<pagination class="page" :total="total" :page.sync="searchData.PageIndex" :limit.sync="searchData.PageSize"
@pagination="getList" />
</template>
<!--研究项目列表-->
<researchTrialsList
v-if="researchTrialsVisible"
:visible.sync="researchTrialsVisible"
:Patient="selectPatient"
@getList="getList"
@handleOpenDialog="handleOpenDialog"
/>
<researchTrialsList v-if="researchTrialsVisible" :visible.sync="researchTrialsVisible" :Patient="selectPatient"
@getList="getList" @handleOpenDialog="handleOpenDialog" />
<!--可加入项目列表-->
<addTrialsList
v-if="addTrialsVisible"
:visible.sync="addTrialsVisible"
:Patient="selectPatient"
@getList="getList"
@handleOpenDialog="handleOpenDialog"
/>
<addTrialsList v-if="addTrialsVisible" :visible.sync="addTrialsVisible" :Patient="selectPatient" @getList="getList"
@handleOpenDialog="handleOpenDialog" />
<!--查看检查列表-->
<viewStudyList
v-if="studyTrialsVisible"
:visible.sync="studyTrialsVisible"
:Patient="selectPatient"
@getList="getList"
/>
<viewStudyList v-if="studyTrialsVisible" :visible.sync="studyTrialsVisible" :Patient="selectPatient"
@getList="getList" />
<!--推送记录列表-->
<pushRecordList
v-if="pushTrialsVisible"
:visible.sync="pushTrialsVisible"
:calledAeList="calledAeList"
:callingAeList="callingAeList"
/>
<pushRecordList v-if="pushTrialsVisible" :visible.sync="pushTrialsVisible" :calledAeList="calledAeList"
:callingAeList="callingAeList" />
<!--pacs拉取列表-->
<pullImageList
v-if="pullTrialsVisible"
:visible.sync="pullTrialsVisible"
:calledAeList="calledAeList"
:callingAeList="callingAeList"
/>
<pullImage v-if="pullTrialsVisible" :visible.sync="pullTrialsVisible" :calledAeList="calledAeList"
:callingAeList="callingAeList" />
</BaseContainer>
</template>
<script>
@ -333,7 +179,7 @@ import researchTrialsList from './components/research-trials-list'
import addTrialsList from './components/add-trials-list'
import viewStudyList from './components/view-study-list'
import pushRecordList from './components/push-record-list'
import pullImageList from './components/pull-image-list'
import pullImage from './components/pullImage/index.vue'
import { getPatientList, deletePatientStudyAllData } from '@/api/inspection.js'
import { getDicomCalledAEList, getDicomCallingAEList } from '@/api/dicomAE.js'
@ -361,7 +207,7 @@ export default {
addTrialsList,
viewStudyList,
pushRecordList,
pullImageList,
pullImage,
},
data() {
return {
@ -498,5 +344,4 @@ export default {
},
}
</script>
<style lang="scss" scoped>
</style>
<style lang="scss" scoped></style>