PACS影像拉取
continuous-integration/drone/push Build is passing Details

main
wangxiaoshuang 2024-12-13 13:29:31 +08:00
parent 107d520266
commit 0942c32cba
7 changed files with 806 additions and 229 deletions

View File

@ -161,4 +161,22 @@ export function verifyTrialSubject(data) {
method: 'post', method: 'post',
data data
}) })
}
// pacs可拉取列表
export function getCFindStudyList(data) {
return request({
url: '/Patient/getCFindStudyList',
method: 'post',
data
})
}
// pacs拉取
export function cmoveStudyList(data) {
return request({
url: '/Patient/cmoveStudyList',
method: 'post',
data
})
} }

View File

@ -17,6 +17,24 @@
label-width="100px" label-width="100px"
> >
<div class="base-dialog-body"> <div class="base-dialog-body">
<!--PacsTypeEnum-->
<el-form-item
:label="$t('system:dicom:form:PacsTypeEnum')"
prop="PacsTypeEnum"
>
<el-select
v-model="form.PacsTypeEnum"
placeholder=""
style="width: 100%"
>
<el-option
v-for="item in $d.PacsType"
:key="item.id"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
<!--AE Title--> <!--AE Title-->
<el-form-item :label="$t('system:dicom:form:AETitle')" prop="CalledAE"> <el-form-item :label="$t('system:dicom:form:AETitle')" prop="CalledAE">
<el-input v-model.trim="form.CalledAE" clearable maxlength="16" /> <el-input v-model.trim="form.CalledAE" clearable maxlength="16" />
@ -52,7 +70,7 @@
:disabled="btnLoading" :disabled="btnLoading"
@click="handleCancel" @click="handleCancel"
> >
{{ $t("common:button:cancel") }} {{ $t('common:button:cancel') }}
</el-button> </el-button>
<el-button <el-button
size="small" size="small"
@ -60,7 +78,7 @@
:loading="btnLoading" :loading="btnLoading"
@click="setAE" @click="setAE"
> >
{{ $t("common:button:save") }} {{ $t('common:button:save') }}
</el-button> </el-button>
</el-form-item> </el-form-item>
</div> </div>
@ -68,9 +86,9 @@
</el-dialog> </el-dialog>
</template> </template>
<script> <script>
import { setDiicomAE } from "@/api/dicomAE.js"; import { setDiicomAE } from '@/api/dicomAE.js'
export default { export default {
name: "editDicom", name: 'editDicom',
props: { props: {
visible: { visible: {
require: true, require: true,
@ -78,12 +96,12 @@ export default {
}, },
title: { title: {
require: true, require: true,
default: "", default: '',
}, },
dicom: { dicom: {
type: Object, type: Object,
default: () => { default: () => {
return {}; return {}
}, },
}, },
}, },
@ -96,92 +114,100 @@ export default {
Modality: null, Modality: null,
Description: null, Description: null,
Id: null, Id: null,
PacsTypeEnum: null,
}, },
rules: { rules: {
PacsTypeEnum: [
{
required: true,
message: this.$t('common:ruleMessage:select'),
trigger: 'blur',
},
],
CalledAE: [ CalledAE: [
{ {
required: true, required: true,
message: this.$t("common:ruleMessage:specify"), message: this.$t('common:ruleMessage:specify'),
trigger: "blur", trigger: 'blur',
}, },
{ {
pattern: /[a-zA-Z0-9]/, pattern: /[a-zA-Z0-9]/,
message: this.$t("common:ruleMessage:CalledAEPattern"), message: this.$t('common:ruleMessage:CalledAEPattern'),
trigger: "blur", trigger: 'blur',
}, },
{ {
min: 1, min: 1,
max: 16, max: 16,
message: this.$t("common:ruleMessage:CalledAEPattern"), message: this.$t('common:ruleMessage:CalledAEPattern'),
trigger: "blur", trigger: 'blur',
}, },
], ],
IP: [ IP: [
{ {
required: true, required: true,
message: this.$t("common:ruleMessage:specify"), message: this.$t('common:ruleMessage:specify'),
trigger: "blur", trigger: 'blur',
}, },
{ {
validator: (rule, value, callback) => { validator: (rule, value, callback) => {
if ( if (
value === "" || value === '' ||
typeof value === "undefined" || typeof value === 'undefined' ||
value == null value == null
) { ) {
callback(new Error(this.$t("common:ruleMessage:ipPattern"))); callback(new Error(this.$t('common:ruleMessage:ipPattern')))
} else { } else {
const reg = const reg =
/^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$/; /^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$/
if (!reg.test(value) && value !== "") { if (!reg.test(value) && value !== '') {
callback(new Error(this.$t("common:ruleMessage:ipPattern"))); callback(new Error(this.$t('common:ruleMessage:ipPattern')))
} else { } else {
callback(); callback()
} }
} }
}, },
message: this.$t("common:ruleMessage:ipPattern"), message: this.$t('common:ruleMessage:ipPattern'),
trigger: "blur", trigger: 'blur',
}, },
], ],
Port: [ Port: [
{ {
required: true, required: true,
message: this.$t("common:ruleMessage:portPattern"), message: this.$t('common:ruleMessage:portPattern'),
trigger: "blur", trigger: 'blur',
}, },
{ {
type: "number", type: 'number',
min: 0, min: 0,
max: 65535, max: 65535,
message: this.$t("common:ruleMessage:portPattern"), message: this.$t('common:ruleMessage:portPattern'),
trigger: "blur", trigger: 'blur',
}, },
{ {
validator: (rule, value, callback) => { validator: (rule, value, callback) => {
if ( if (
value && value &&
(String(value).includes(".") || (String(value).includes('.') ||
new RegExp(/\D/g).test(String(value))) new RegExp(/\D/g).test(String(value)))
) { ) {
callback(new Error(this.$t("common:ruleMessage:portPattern"))); callback(new Error(this.$t('common:ruleMessage:portPattern')))
} else { } else {
callback(); callback()
} }
}, },
trigger: "blur", trigger: 'blur',
}, },
], ],
}, },
btnLoading: false, btnLoading: false,
}; }
}, },
watch: { watch: {
dicom: { dicom: {
handler() { handler() {
Object.keys(this.form).forEach((key) => { Object.keys(this.form).forEach((key) => {
this.form[key] = this.dicom[key]; this.form[key] = this.dicom[key]
}); })
}, },
deep: true, deep: true,
immediate: true, immediate: true,
@ -190,37 +216,35 @@ export default {
methods: { methods: {
handleCancel() { handleCancel() {
Object.keys(this.form).forEach((key) => { Object.keys(this.form).forEach((key) => {
this.form[key] = null; this.form[key] = null
}); })
this.$refs.editVisitForm.clearValidate(); this.$refs.editVisitForm.clearValidate()
this.$emit("update:visible", false); this.$emit('update:visible', false)
}, },
// //
async setAE() { async setAE() {
try { try {
let validate = await this.$refs.editVisitForm.validate(); let validate = await this.$refs.editVisitForm.validate()
if (!validate) return; if (!validate) return
this.btnLoading = true; this.btnLoading = true
let res = await setDiicomAE(this.form); let res = await setDiicomAE(this.form)
if (res.IsSuccess) { if (res.IsSuccess) {
if (this.form.Id) { if (this.form.Id) {
this.$message.success( this.$message.success(this.$t('common:message:updatedSuccessfully'))
this.$t("common:message:updatedSuccessfully")
);
} else { } else {
this.$message.success(this.$t("common:message:addedSuccessfully")); this.$message.success(this.$t('common:message:addedSuccessfully'))
} }
this.btnLoading = false; this.btnLoading = false
this.handleCancel(); this.handleCancel()
this.$emit("getList"); this.$emit('getList')
} else { } else {
this.$message.error(res.errorMessage); this.$message.error(res.errorMessage)
} }
} catch (err) { } catch (err) {
this.btnLoading = false; this.btnLoading = false
console.log(err); console.log(err)
} }
}, },
}, },
}; }
</script> </script>

View File

@ -2,6 +2,24 @@
<div class="dicomAE"> <div class="dicomAE">
<div ref="leftContainer" class="left"> <div ref="leftContainer" class="left">
<el-form :inline="true"> <el-form :inline="true">
<el-form-item
:label="$t('system:dicom:search:PacsTypeEnum')"
prop="PacsTypeEnum"
>
<el-select
v-model="searchData.PacsTypeEnum"
placeholder=""
style="width: 140px"
clearable
>
<el-option
v-for="item in $d.PacsType"
:key="item.id"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
<!--AE Title--> <!--AE Title-->
<el-form-item <el-form-item
:label="$t('system:dicom:search:AETitle')" :label="$t('system:dicom:search:AETitle')"
@ -23,17 +41,17 @@
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button type="primary" size="mini" @click="getList">{{ <el-button type="primary" size="mini" @click="getList">{{
$t("system:dicom:search:search") $t('system:dicom:search:search')
}}</el-button> }}</el-button>
<el-button type="primary" size="mini" @click="reset">{{ <el-button type="primary" size="mini" @click="reset">{{
$t("system:dicom:search:reset") $t('system:dicom:search:reset')
}}</el-button> }}</el-button>
<el-button <el-button
type="primary" type="primary"
size="mini" size="mini"
v-hasPermi="['system:dicom:add']" v-hasPermi="['system:dicom:add']"
@click="openDialog('add')" @click="openDialog('add')"
>{{ $t("system:dicom:search:add") }}</el-button >{{ $t('system:dicom:search:add') }}</el-button
> >
</el-form-item> </el-form-item>
</el-form> </el-form>
@ -71,6 +89,18 @@
show-overflow-tooltip show-overflow-tooltip
sortable="custom" sortable="custom"
/> />
<!--PacsTypeEnum-->
<el-table-column
:label="$t('system:dicom:table:PacsTypeEnum')"
prop="PacsTypeEnum"
min-width="120"
show-overflow-tooltip
sortable="custom"
>
<template slot-scope="scope">
<span>{{ $fd('PacsType', scope.row.PacsTypeEnum) }}</span>
</template>
</el-table-column>
<!--Modality--> <!--Modality-->
<el-table-column <el-table-column
:label="$t('system:dicom:table:Modality')" :label="$t('system:dicom:table:Modality')"
@ -97,7 +127,7 @@
> >
<template slot-scope="scope"> <template slot-scope="scope">
<el-tag :type="scope.row.IsTestOK ? 'success' : 'danger'">{{ <el-tag :type="scope.row.IsTestOK ? 'success' : 'danger'">{{
$fd("IsTestOK", String(scope.row.IsTestOK)) $fd('IsTestOK', String(scope.row.IsTestOK))
}}</el-tag> }}</el-tag>
</template> </template>
</el-table-column> </el-table-column>
@ -122,6 +152,7 @@
fixed="right" fixed="right"
prop="UserTypeShortName" prop="UserTypeShortName"
show-overflow-tooltip show-overflow-tooltip
min-width="120px"
> >
<template slot-scope="scope"> <template slot-scope="scope">
<el-button <el-button
@ -129,17 +160,17 @@
type="text" type="text"
v-hasPermi="['system:dicom:edit']" v-hasPermi="['system:dicom:edit']"
@click="openDialog('edit', scope.row)" @click="openDialog('edit', scope.row)"
>{{ $t("system:dicom:action:edit") }}</el-button >{{ $t('system:dicom:action:edit') }}</el-button
> >
<el-button <el-button
size="mini" size="mini"
type="text" type="text"
v-hasPermi="['system:dicom:del']" v-hasPermi="['system:dicom:del']"
@click="delAE(scope.row)" @click="delAE(scope.row)"
>{{ $t("system:dicom:action:remove") }}</el-button >{{ $t('system:dicom:action:remove') }}</el-button
> >
<el-button size="mini" type="text" @click="test(scope.row)">{{ <el-button size="mini" type="text" @click="test(scope.row)">{{
$t("system:dicom:action:test") $t('system:dicom:action:test')
}}</el-button> }}</el-button>
</template> </template>
</el-table-column> </el-table-column>
@ -162,22 +193,23 @@
</div> </div>
</template> </template>
<script> <script>
import Pagination from "@/components/Pagination"; import Pagination from '@/components/Pagination'
import editDicom from "./components/edit-dicom"; import editDicom from './components/edit-dicom'
import { getDicomAEList, deleteDiicomAE, testConnect } from "@/api/dicomAE.js"; import { getDicomAEList, deleteDiicomAE, testConnect } from '@/api/dicomAE.js'
const defaultSearchData = () => { const defaultSearchData = () => {
return { return {
CalledAE: null, CalledAE: null,
IP: null, IP: null,
Port: null, Port: null,
PacsTypeEnum: null,
PageIndex: 1, PageIndex: 1,
PageSize: 10, PageSize: 10,
SortField: "CreateTime", SortField: 'CreateTime',
Asc: false, Asc: false,
}; }
}; }
export default { export default {
name: "dicomAE", name: 'dicomAE',
components: { Pagination, editDicom }, components: { Pagination, editDicom },
data() { data() {
return { return {
@ -189,98 +221,98 @@ export default {
list: [], list: [],
// //
editDicomVisible: false, editDicomVisible: false,
editDicomTitle: "", editDicomTitle: '',
DICOM: {}, DICOM: {},
}; }
}, },
created() { created() {
this.getList(); this.getList()
}, },
methods: { methods: {
// //
handleSortChange(sort) { handleSortChange(sort) {
this.searchData.SortField = sort.prop; this.searchData.SortField = sort.prop
if (sort.order === "ascending") this.searchData.Asc = true; if (sort.order === 'ascending') this.searchData.Asc = true
if (sort.order === "descending") this.searchData.Asc = false; if (sort.order === 'descending') this.searchData.Asc = false
if (!sort.order) this.searchData.SortField = null; if (!sort.order) this.searchData.SortField = null
this.getList(); this.getList()
}, },
// //
async getList() { async getList() {
let data = {}; let data = {}
Object.keys(this.searchData).forEach((key) => { Object.keys(this.searchData).forEach((key) => {
data[key] = this.searchData[key]; data[key] = this.searchData[key]
}); })
try { try {
this.loading = true; this.loading = true
let res = await getDicomAEList(data); let res = await getDicomAEList(data)
this.loading = false; this.loading = false
if (res.IsSuccess) { if (res.IsSuccess) {
this.list = res.Result.CurrentPageData; this.list = res.Result.CurrentPageData
this.total = res.Result.TotalCount; this.total = res.Result.TotalCount
} }
} catch (err) { } catch (err) {
console.log(err); console.log(err)
} }
}, },
// //
reset() { reset() {
this.searchData = defaultSearchData(); this.searchData = defaultSearchData()
this.$refs.dicomAeTable.clearSort(); this.$refs.dicomAeTable.clearSort()
this.getList(); this.getList()
}, },
// //
openDialog(key, item = {}) { openDialog(key, item = {}) {
this.editDicomVisible = true; this.editDicomVisible = true
this.editDicomTitle = this.$t("system:dicom:action:edit"); this.editDicomTitle = this.$t('system:dicom:action:edit')
if (key === "add") { if (key === 'add') {
this.editDicomTitle = this.$t("system:dicom:search:add"); this.editDicomTitle = this.$t('system:dicom:search:add')
} }
this.DICOM = JSON.parse(JSON.stringify(item)); this.DICOM = JSON.parse(JSON.stringify(item))
}, },
// //
async delAE(item) { async delAE(item) {
try { try {
let confirm = await this.$confirm( let confirm = await this.$confirm(
this.$t("trials:staffResearch:message:confirmDel"), this.$t('trials:staffResearch:message:confirmDel'),
this.$t("trials:uploadDicomList:label:prompt"), this.$t('trials:uploadDicomList:label:prompt'),
{ {
confirmButtonText: this.$t("trials:reviewTrack:impactList:save"), confirmButtonText: this.$t('trials:reviewTrack:impactList:save'),
cancelButtonText: this.$t("common:button:cancel"), cancelButtonText: this.$t('common:button:cancel'),
type: "warning", type: 'warning',
} }
); )
if (confirm !== "confirm") return; if (confirm !== 'confirm') return
let res = await deleteDiicomAE(item.Id); let res = await deleteDiicomAE(item.Id)
if (res.IsSuccess) { if (res.IsSuccess) {
this.$message.success( this.$message.success(
this.$t("trials:crcUpload:message:deleteVisitSuccessfully") this.$t('trials:crcUpload:message:deleteVisitSuccessfully')
); )
this.getList(); this.getList()
} }
} catch (err) { } catch (err) {
console.log(err); console.log(err)
} }
}, },
// //
async test(item) { async test(item) {
try { try {
this.loading = true; this.loading = true
let res = await testConnect(item.Id); let res = await testConnect(item.Id)
this.loading = false; this.loading = false
if (res.IsSuccess && res.Result) { if (res.IsSuccess && res.Result) {
this.$message.success(this.$t("system:dicomAE:connect:success")); this.$message.success(this.$t('system:dicomAE:connect:success'))
} else { } else {
this.$message.error(this.$t("system:dicomAE:connect:error")); this.$message.error(this.$t('system:dicomAE:connect:error'))
} }
this.getList(); this.getList()
} catch (err) { } catch (err) {
console.log(err); console.log(err)
this.loading = false; this.loading = false
} }
}, },
}, },
}; }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.dicomAE { .dicomAE {

View File

@ -0,0 +1,486 @@
<template>
<el-dialog
:visible.sync="visible"
:close-on-click-modal="false"
:fullscreen="true"
custom-class="upload-dialog"
:before-close="beforeCloseStudyDig"
>
<span slot="title">{{ $t('trials:inspection:title:pullImage') }} </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"
clearable
style="width: 140px"
>
<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
: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
: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>
<!-- modalitiesInStudy -->
<el-form-item
class="my_multiple"
:label="$t('trials:inspection:pullImage:search:modalitiesInStudy')"
>
<el-input
v-model="searchData.ModalitiesInStudy"
clearable
:maxlength="400"
></el-input>
</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"
>
</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-form-item>
</el-form>
</div>
<!--检查列表-->
<el-table
ref="viewStudyList"
v-loading="loading"
v-adaptive="{ bottomOffset: 60 }"
:data="list"
stripe
height="100"
@sort-change="handleSortByColumn"
:default-sort="{ prop: 'StartTime', order: 'descending' }"
>
<el-table-column type="index" width="40" />
<!--patientID-->
<el-table-column
prop="PatientID"
:label="$t('trials:inspection:pullImage:table:patientID')"
show-overflow-tooltip
min-width="120"
/>
<!--patientName-->
<el-table-column
prop="PatientName"
:label="$t('trials:inspection:pullImage:table:patientName')"
show-overflow-tooltip
min-width="120"
/>
<!--patientSex-->
<el-table-column
prop="PatientSex"
:label="$t('trials:inspection:pullImage:table:patientSex')"
show-overflow-tooltip
min-width="120"
/>
<!--patientBirthDate-->
<el-table-column
prop="PatientBirthDate"
:label="$t('trials:inspection:pullImage:table:patientBirthDate')"
show-overflow-tooltip
min-width="120"
/>
<!--studyID-->
<el-table-column
prop="StudyID"
:label="$t('trials:inspection:pullImage:table:studyID')"
show-overflow-tooltip
min-width="120"
/>
<!--modalitiesInStudy-->
<el-table-column
prop="ModalitiesInStudy"
:label="$t('trials:inspection:pullImage:table:modalitiesInStudy')"
show-overflow-tooltip
min-width="120"
/>
<!--studyDate-->
<el-table-column
prop="StudyDate"
:label="$t('trials:inspection:pullImage:table:studyDate')"
show-overflow-tooltip
min-width="120"
/>
<!--studyTime-->
<el-table-column
prop="StudyTime"
:label="$t('trials:inspection:pullImage:table:studyTime')"
show-overflow-tooltip
min-width="120"
/>
<!--bodyPartExamined-->
<el-table-column
prop="BodyPartExamined"
:label="$t('trials:inspection:pullImage:table:bodyPartExamined')"
show-overflow-tooltip
min-width="120"
/>
<!--studyDescription-->
<el-table-column
prop="StudyDescription"
:label="$t('trials:inspection:pullImage:table:studyDescription')"
show-overflow-tooltip
min-width="120"
/>
<!--studyInstanceUID-->
<el-table-column
prop="StudyInstanceUID"
:label="$t('trials:inspection:pullImage:table:studyInstanceUID')"
show-overflow-tooltip
min-width="120"
/>
<!--操作-->
<el-table-column :label="$t('common:action:action')" min-width="80">
<template slot-scope="scope">
<el-button
circle
icon="el-icon-download"
:title="$t('trials:inspection:button:pull')"
@click.stop="pullImage(scope.row)"
/>
</template>
</el-table-column>
</el-table>
<!-- 分页组件 -->
<!-- <pagination
class="page"
:total="total"
:page.sync="searchData.PageIndex"
:limit.sync="searchData.PageSize"
@pagination="getList"
/> -->
</el-dialog>
</template>
<script>
import Pagination from '@/components/Pagination'
import { getCFindStudyList, cmoveStudyList } from '@/api/inspection.js'
import { getDicomAEList } from '@/api/dicomAE.js'
const defaultSearchData = () => {
return {
PacsDicomAEId: null,
PatientID: null,
PatientName: null,
PatientSex: null,
PatientBirthDate: null,
StudyID: null,
ModalitiesInStudy: null,
StudyDate: null,
StudyTime: null,
BodyPartExamined: null,
StudyDescription: null,
StudyInstanceUID: null,
}
}
export default {
name: 'pushRecordList',
components: { Pagination },
props: {
visible: {
required: true,
default: false,
},
calledAeList: {
required: true,
default: () => {
return []
},
},
callingAeList: {
required: true,
default: () => {
return []
},
},
},
data() {
return {
//
searchData: defaultSearchData(),
PatientBirthDate: [],
StudyDate: [],
StudyTime: [],
//
loading: false,
list: [],
total: 0,
AElist: [],
}
},
created() {
this.getAEList()
},
methods: {
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.StudyDate[0] + '-' + this.StudyDate[1]
} else {
data.StudyDate = null
}
if (this.StudyTime && this.StudyTime[0] && this.StudyTime[1]) {
data.StudyTime = this.StudyTime[0] + '-' + this.StudyTime[1]
} else {
data.StudyTime = null
}
try {
this.loading = true
let res = await getCFindStudyList(data)
this.loading = false
if (res.IsSuccess) {
this.list = res.Result
}
} catch (err) {
this.loading = false
console.log(err)
}
},
//
async getAEList() {
let data = {
CalledAE: null,
IP: null,
Port: null,
PacsTypeEnum: 2,
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) {
this.searchData.PacsDicomAEId = this.AElist[0].Id
this.getList()
}
}
} catch (err) {
console.log(err)
}
},
//
handleSearch() {
// this.searchData.PageIndex = 1
this.getList()
},
//
handleReset() {
this.reset()
this.getList()
},
//
reset() {
// this.searchData = defaultSearchData()
Object.keys(this.searchData).forEach((key) => {
if (key !== 'PacsDicomAEId') {
this.searchData[key] = null
}
})
this.PatientBirthDate = []
this.StudyDate = []
this.StudyTime = []
},
//
handleSortByColumn(sort) {
this.searchData.SortField = sort.prop
if (sort.order === 'ascending') this.searchData.Asc = true
if (sort.order === 'descending') this.searchData.Asc = false
if (!sort.order) this.searchData.SortField = null
this.getList()
},
beforeCloseStudyDig() {
this.$setOpenWindow()
this.$emit('update:visible', false)
},
// pacs
async pullImage(row) {
try {
let confirm = this.$confirm(
this.$t('trials:inspection:pullImage:confirm:pull')
)
if (!confirm) return false
let data = {
PacsDicomAEId: this.searchData.PacsDicomAEId,
studyIDList: [row.StudyID],
}
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)
}
},
},
}
</script>

View File

@ -6,7 +6,7 @@
custom-class="upload-dialog" custom-class="upload-dialog"
:before-close="beforeCloseStudyDig" :before-close="beforeCloseStudyDig"
> >
<span slot="title"> </span> <span slot="title"> {{ $t('trials:inspection:title:pushRecord') }}</span>
<div class="search"> <div class="search">
<el-form :inline="true" class="base-search-form"> <el-form :inline="true" class="base-search-form">
<!-- Called AE --> <!-- Called AE -->
@ -62,7 +62,7 @@
<el-form-item> <el-form-item>
<!-- 查询 --> <!-- 查询 -->
<el-button type="primary" icon="el-icon-search" @click="handleSearch"> <el-button type="primary" icon="el-icon-search" @click="handleSearch">
{{ $t("common:button:search") }} {{ $t('common:button:search') }}
</el-button> </el-button>
<!-- 重置 --> <!-- 重置 -->
<el-button <el-button
@ -70,7 +70,7 @@
icon="el-icon-refresh-left" icon="el-icon-refresh-left"
@click="handleReset" @click="handleReset"
> >
{{ $t("common:button:reset") }} {{ $t('common:button:reset') }}
</el-button> </el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
@ -188,9 +188,9 @@
</el-dialog> </el-dialog>
</template> </template>
<script> <script>
import Pagination from "@/components/Pagination"; import Pagination from '@/components/Pagination'
import { getSCPImageUploadList } from "@/api/inspection.js"; import { getSCPImageUploadList } from '@/api/inspection.js'
import { getToken } from "@/utils/auth"; import { getToken } from '@/utils/auth'
const defaultSearchData = () => { const defaultSearchData = () => {
return { return {
CallingAE: null, CallingAE: null,
@ -201,11 +201,11 @@ const defaultSearchData = () => {
PageIndex: 1, PageIndex: 1,
PageSize: 10, PageSize: 10,
Asc: false, Asc: false,
SortField: "StartTime", SortField: 'StartTime',
}; }
}; }
export default { export default {
name: "pushRecordList", name: 'pushRecordList',
components: { Pagination }, components: { Pagination },
props: { props: {
visible: { visible: {
@ -215,13 +215,13 @@ export default {
calledAeList: { calledAeList: {
required: true, required: true,
default: () => { default: () => {
return []; return []
}, },
}, },
callingAeList: { callingAeList: {
required: true, required: true,
default: () => { default: () => {
return []; return []
}, },
}, },
}, },
@ -234,77 +234,77 @@ export default {
loading: false, loading: false,
list: [], list: [],
total: 0, total: 0,
}; }
}, },
created() { created() {
this.getList(); this.getList()
}, },
methods: { methods: {
async getList() { async getList() {
let data = {}; let data = {}
Object.keys(this.searchData).forEach((key) => { Object.keys(this.searchData).forEach((key) => {
data[key] = this.searchData[key]; data[key] = this.searchData[key]
}); })
if (this.dateValue && this.dateValue[0] && this.dateValue[1]) { if (this.dateValue && this.dateValue[0] && this.dateValue[1]) {
data.StartTime = this.$moment(this.dateValue[0]).format( data.StartTime = this.$moment(this.dateValue[0]).format(
"YYYY-MM-DD HH:mm:ss" 'YYYY-MM-DD HH:mm:ss'
); )
data.EndTime = this.$moment(this.dateValue[1]).format( data.EndTime = this.$moment(this.dateValue[1]).format(
"YYYY-MM-DD HH:mm:ss" 'YYYY-MM-DD HH:mm:ss'
); )
} else { } else {
data.StartTime = null; data.StartTime = null
data.EndTime = null; data.EndTime = null
} }
try { try {
this.loading = true; this.loading = true
let res = await getSCPImageUploadList(data); let res = await getSCPImageUploadList(data)
this.loading = false; this.loading = false
if (res.IsSuccess) { if (res.IsSuccess) {
this.list = res.Result.CurrentPageData; this.list = res.Result.CurrentPageData
this.total = res.Result.TotalCount; this.total = res.Result.TotalCount
} }
} catch (err) { } catch (err) {
this.loading = false; this.loading = false
console.log(err); console.log(err)
} }
}, },
// //
handleSearch() { handleSearch() {
this.searchData.PageIndex = 1; this.searchData.PageIndex = 1
this.getList(); this.getList()
}, },
// //
handleReset() { handleReset() {
this.reset(); this.reset()
this.getList(); this.getList()
}, },
// //
reset() { reset() {
this.searchData = defaultSearchData(); this.searchData = defaultSearchData()
this.dateValue = []; this.dateValue = []
}, },
// //
handleSortByColumn(sort) { handleSortByColumn(sort) {
this.searchData.SortField = sort.prop; this.searchData.SortField = sort.prop
if (sort.order === "ascending") this.searchData.Asc = true; if (sort.order === 'ascending') this.searchData.Asc = true
if (sort.order === "descending") this.searchData.Asc = false; if (sort.order === 'descending') this.searchData.Asc = false
if (!sort.order) this.searchData.SortField = null; if (!sort.order) this.searchData.SortField = null
this.getList(); this.getList()
}, },
beforeCloseStudyDig() { beforeCloseStudyDig() {
this.$setOpenWindow(); this.$setOpenWindow()
this.$emit("update:visible", false); this.$emit('update:visible', false)
}, },
// //
image(item) { image(item) {
let token = getToken(); let token = getToken()
const routeData = this.$router.resolve({ const routeData = this.$router.resolve({
path: `/showdicom?studyId=${item.SCPStudyId}&TokenKey=${token}&type=Patient`, path: `/showdicom?studyId=${item.SCPStudyId}&TokenKey=${token}&type=Patient`,
}); })
let newWindow = window.open(routeData.href, "_blank"); let newWindow = window.open(routeData.href, '_blank')
this.$setOpenWindow(newWindow); this.$setOpenWindow(newWindow)
}, },
}, },
}; }
</script> </script>

View File

@ -81,7 +81,7 @@
<el-form-item> <el-form-item>
<!-- 查询 --> <!-- 查询 -->
<el-button type="primary" icon="el-icon-search" @click="handleSearch"> <el-button type="primary" icon="el-icon-search" @click="handleSearch">
{{ $t("common:button:search") }} {{ $t('common:button:search') }}
</el-button> </el-button>
<!-- 重置 --> <!-- 重置 -->
<el-button <el-button
@ -89,13 +89,19 @@
icon="el-icon-refresh-left" icon="el-icon-refresh-left"
@click="handleReset" @click="handleReset"
> >
{{ $t("common:button:reset") }} {{ $t('common:button:reset') }}
</el-button> </el-button>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<!-- 推送记录 --> <!-- 推送记录 -->
<el-button type="primary" @click="handleOpenDialog({}, 'push')"> <el-button type="primary" @click="handleOpenDialog({}, 'push')">
{{ $t("common:button:push") }} {{ $t('common:button:push') }}
</el-button>
</el-form-item>
<el-form-item>
<!-- pacs拉取 -->
<el-button type="primary" @click="handleOpenDialog({}, 'pull')">
{{ $t('common:button:pull') }}
</el-button> </el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
@ -147,7 +153,7 @@
sortable="custom" sortable="custom"
> >
<template slot-scope="scope"> <template slot-scope="scope">
<span>{{ $fd("Sex", scope.row.PatientSex) }}</span> <span>{{ $fd('Sex', scope.row.PatientSex) }}</span>
</template> </template>
</el-table-column> </el-table-column>
<!--Called AE--> <!--Called AE-->
@ -307,17 +313,25 @@
:calledAeList="calledAeList" :calledAeList="calledAeList"
:callingAeList="callingAeList" :callingAeList="callingAeList"
/> />
<!--pacs拉取列表-->
<pullImageList
v-if="pullTrialsVisible"
:visible.sync="pullTrialsVisible"
:calledAeList="calledAeList"
:callingAeList="callingAeList"
/>
</BaseContainer> </BaseContainer>
</template> </template>
<script> <script>
import BaseContainer from "@/components/BaseContainer"; import BaseContainer from '@/components/BaseContainer'
import Pagination from "@/components/Pagination"; import Pagination from '@/components/Pagination'
import researchTrialsList from "./components/research-trials-list"; import researchTrialsList from './components/research-trials-list'
import addTrialsList from "./components/add-trials-list"; import addTrialsList from './components/add-trials-list'
import viewStudyList from "./components/view-study-list"; import viewStudyList from './components/view-study-list'
import pushRecordList from "./components/push-record-list"; import pushRecordList from './components/push-record-list'
import { getPatientList, deletePatientStudyAllData } from "@/api/inspection.js"; import pullImageList from './components/pull-image-list'
import { getDicomCalledAEList, getDicomCallingAEList } from "@/api/dicomAE.js"; import { getPatientList, deletePatientStudyAllData } from '@/api/inspection.js'
import { getDicomCalledAEList, getDicomCallingAEList } from '@/api/dicomAE.js'
const defaultSearchData = () => { const defaultSearchData = () => {
return { return {
@ -329,13 +343,13 @@ const defaultSearchData = () => {
Asc: false, Asc: false,
BeginPushTime: null, BeginPushTime: null,
EndPushTime: null, EndPushTime: null,
SortField: "LatestPushTime", SortField: 'LatestPushTime',
PageIndex: 1, PageIndex: 1,
PageSize: 10, PageSize: 10,
}; }
}; }
export default { export default {
name: "inspection", name: 'inspection',
components: { components: {
BaseContainer, BaseContainer,
Pagination, Pagination,
@ -343,6 +357,7 @@ export default {
addTrialsList, addTrialsList,
viewStudyList, viewStudyList,
pushRecordList, pushRecordList,
pullImageList,
}, },
data() { data() {
return { return {
@ -365,117 +380,119 @@ export default {
studyTrialsVisible: false, studyTrialsVisible: false,
// //
pushTrialsVisible: false, pushTrialsVisible: false,
}; // pacs
pullTrialsVisible: false,
}
}, },
created() { created() {
this.getDicomCalledAEList(); this.getDicomCalledAEList()
this.getDicomCallingAEList(); this.getDicomCallingAEList()
this.getList(); this.getList()
}, },
methods: { methods: {
// //
async deletePatientStudyAllData(item) { async deletePatientStudyAllData(item) {
try { try {
let confirm = await this.$confirm( let confirm = await this.$confirm(
this.$t("trials:inspection:message:remove"), this.$t('trials:inspection:message:remove'),
{ {
type: "warning", type: 'warning',
distinguishCancelAndClose: true, distinguishCancelAndClose: true,
confirmButtonText: this.$t("common:button:confirm"), confirmButtonText: this.$t('common:button:confirm'),
cancelButtonText: this.$t("common:button:cancel"), cancelButtonText: this.$t('common:button:cancel'),
} }
); )
if (confirm !== "confirm") return; if (confirm !== 'confirm') return
let params = { let params = {
PatientId: item.PatientId, PatientId: item.PatientId,
}; }
let res = await deletePatientStudyAllData(params); let res = await deletePatientStudyAllData(params)
if (res.IsSuccess) { if (res.IsSuccess) {
this.getList(); this.getList()
this.$message.success(this.$t("common:message:removedSuccessfully")); this.$message.success(this.$t('common:message:removedSuccessfully'))
} }
} catch (err) { } catch (err) {
console.log(err); console.log(err)
} }
}, },
// calledAE // calledAE
async getDicomCalledAEList() { async getDicomCalledAEList() {
try { try {
let res = await getDicomCalledAEList(); let res = await getDicomCalledAEList()
if (res.IsSuccess) { if (res.IsSuccess) {
this.calledAeList = res.Result; this.calledAeList = res.Result
} }
} catch (err) { } catch (err) {
console.log(err); console.log(err)
} }
}, },
// callingAE // callingAE
async getDicomCallingAEList() { async getDicomCallingAEList() {
try { try {
let res = await getDicomCallingAEList(); let res = await getDicomCallingAEList()
if (res.IsSuccess) { if (res.IsSuccess) {
this.callingAeList = res.Result; this.callingAeList = res.Result
} }
} catch (err) { } catch (err) {
console.log(err); console.log(err)
} }
}, },
// //
async getList() { async getList() {
let data = {}; let data = {}
Object.keys(this.searchData).forEach((key) => { Object.keys(this.searchData).forEach((key) => {
data[key] = this.searchData[key]; data[key] = this.searchData[key]
}); })
if (this.dateValue && this.dateValue[0] && this.dateValue[1]) { if (this.dateValue && this.dateValue[0] && this.dateValue[1]) {
data.BeginPushTime = this.$moment(this.dateValue[0]).format( data.BeginPushTime = this.$moment(this.dateValue[0]).format(
"YYYY-MM-DD HH:mm:ss" 'YYYY-MM-DD HH:mm:ss'
); )
data.EndPushTime = this.$moment(this.dateValue[1]).format( data.EndPushTime = this.$moment(this.dateValue[1]).format(
"YYYY-MM-DD HH:mm:ss" 'YYYY-MM-DD HH:mm:ss'
); )
} else { } else {
data.BeginPushTime = null; data.BeginPushTime = null
data.EndPushTime = null; data.EndPushTime = null
} }
try { try {
this.loading = true; this.loading = true
let res = await getPatientList(data); let res = await getPatientList(data)
this.loading = false; this.loading = false
if (res.IsSuccess) { if (res.IsSuccess) {
this.list = res.Result.CurrentPageData; this.list = res.Result.CurrentPageData
this.total = res.Result.TotalCount; this.total = res.Result.TotalCount
} }
} catch (err) { } catch (err) {
console.log(err); console.log(err)
} }
}, },
// //
handleSearch() { handleSearch() {
this.searchData.PageIndex = 1; this.searchData.PageIndex = 1
this.getList(); this.getList()
}, },
// //
handleReset() { handleReset() {
this.searchData = defaultSearchData(); this.searchData = defaultSearchData()
this.$refs.inspectionList.clearSort(); this.$refs.inspectionList.clearSort()
this.dateValue = []; this.dateValue = []
this.getList(); this.getList()
}, },
// //
handleSortByColumn(sort) { handleSortByColumn(sort) {
this.searchData.SortField = sort.prop; this.searchData.SortField = sort.prop
if (sort.order === "ascending") this.searchData.Asc = true; if (sort.order === 'ascending') this.searchData.Asc = true
if (sort.order === "descending") this.searchData.Asc = false; if (sort.order === 'descending') this.searchData.Asc = false
if (!sort.order) this.searchData.SortField = null; if (!sort.order) this.searchData.SortField = null
this.getList(); this.getList()
}, },
// //
handleOpenDialog(item, key) { handleOpenDialog(item, key) {
this[`${key}TrialsVisible`] = true; this[`${key}TrialsVisible`] = true
this.selectPatient = item; this.selectPatient = item
}, },
}, },
}; }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
</style> </style>

View File

@ -40,7 +40,7 @@ module.exports = {
// target: 'http://123.56.181.144:8060/api', // 国内测试环境1 // target: 'http://123.56.181.144:8060/api', // 国内测试环境1
// target: 'http://123.56.181.144:8000/api', // 国内测试环境 // target: 'http://123.56.181.144:8000/api', // 国内测试环境
// target: 'http://106.14.89.110:8079', // 国内测试环境2 // target: 'http://106.14.89.110:8079', // 国内测试环境2
target: 'http://106.14.89.110:30010', // 国内测试环境2 target: 'http://106.14.89.110:30021', // 国内测试环境2
// target: 'http://123.56.181.144:7000', // target: 'http://123.56.181.144:7000',
changeOrigin: true, changeOrigin: true,
secure: false, secure: false,