pacs
continuous-integration/drone/push Build is passing

This commit is contained in:
2024-07-17 10:09:26 +08:00
parent 7f36aa5a05
commit e51e7d0e66
10 changed files with 1809 additions and 424 deletions
+40
View File
@@ -3745,4 +3745,44 @@ export function ConfigTrialPACSInfoConfirm(data) {
method: 'post',
data
})
}
// 获取推送记录
export function getSCPImageUploadList(data) {
return request({
url: `/Patient/getSCPImageUploadList`,
method: 'post',
data
})
}
// 获取影像检查患者列表
export function getPatientList(data) {
return request({
url: `/Patient/getPatientList`,
method: 'post',
data
})
}
// 获取影像检查患者检查列表
export function getPatientStudyList(data) {
return request({
url: `/Patient/getPatientStudyList`,
method: 'post',
data
})
}
// 获取接收方AE列表
export function getDicomCalledAEList(params) {
return request({
url: `/Patient/getDicomCalledAEList`,
method: 'get',
params
})
}
// 获取发送方AE列表
export function getDicomCallingAEList(params) {
return request({
url: `/Patient/getDicomCallingAEList`,
method: 'get',
params
})
}
+16 -8
View File
@@ -4,14 +4,15 @@
<el-tabs v-model="trialsTab" @tab-click="clickTab">
<el-tab-pane v-for="item of trialsRouter.children.find(v => {return v.name == 'TrialsPanel'}).children" :key="`tab${item.path}`" :disabled="TotalNeedSignTrialDocCount !== 0 && item.path !== '/trials/trials-panel/attachments'" :label="$t(item.LanguageMark)" :name="item.path">
<el-tabs v-if="!item.tabHiddn" v-model="trialsTabChild" @tab-click="clickTab">
<el-tab-pane
v-for="item1 of item.children"
v-if="TrialConfig && isShow(item1.path)"
:key="`tab1${item1.path}`"
:disabled="TotalNeedSignTrialDocCount !== 0 && item1.path !== '/trials/trials-panel/attachments/self-attachment' || (TrialStatusStr === 'Initializing' && (item1.path === '/trials/trials-panel/setting/personnel-manage' || item1.path === '/trials/trials-panel/setting/qc-question' || item1.path === '/trials/trials-panel/setting/reading-unit' || item1.path === '/trials/trials-panel/setting/medical-audit' || item1.path === '/trials/trials-panel/setting/email-manage'))"
:label="$t(item1.LanguageMark)"
:name="item1.path"
/>
<template v-for="item1 of item.children">
<el-tab-pane
v-if="TrialConfig && isShow(item1.path)"
:key="`tab1${item1.path}`"
:disabled="TotalNeedSignTrialDocCount !== 0 && item1.path !== '/trials/trials-panel/attachments/self-attachment' || (TrialStatusStr === 'Initializing' && (item1.path === '/trials/trials-panel/setting/personnel-manage' || item1.path === '/trials/trials-panel/setting/qc-question' || item1.path === '/trials/trials-panel/setting/reading-unit' || item1.path === '/trials/trials-panel/setting/medical-audit' || item1.path === '/trials/trials-panel/setting/email-manage'))"
:label="$t(item1.LanguageMark)"
:name="item1.path"
/>
</template>
</el-tabs>
</el-tab-pane>
</el-tabs>
@@ -126,6 +127,10 @@ export default {
var additionalAssessmentList = [
'/trials/trials-panel/subject/brain-metastasis'
]
let dicomList = [
'/trials/trials-panel/trial-summary/image-inspect',
'/trials/trials-panel/trial-summary/push-record',
]
if (this.TrialConfig.QCProcessEnum === 0 && ~qualityList.indexOf(path)) {
isShow = false
}
@@ -135,6 +140,9 @@ export default {
if (!this.IsAdditionalAssessment && ~additionalAssessmentList.indexOf(path)) {
isShow = false
}
if ((!this.TrialConfig.IsPACSConnect || !this.TrialConfig.IsTrialPACSConfirmed) && ~dicomList.indexOf(path)) {
isShow = false
}
return isShow
},
goBack() {
@@ -17,6 +17,7 @@
<el-radio-group
v-model="form.IsPACSConnect"
:disabled="form.IsTrialPACSConfirmed && !isEdit"
@change="changeConnect"
>
<el-radio
v-for="item of $d.PACSConnectMode"
@@ -114,7 +115,6 @@
v-if="
form.IsTrialPACSConfirmed === true &&
!isEdit &&
TrialStatusStr === 'Initializing' &&
hasPermi(['trials:trials-panel:setting:trial-config:save'])
"
type="primary"
@@ -354,8 +354,7 @@ export default {
},
],
},
TrialStatusStr: "",
isEdit: true,
isEdit: false,
Id: null,
signVisible: false,
signCode: null,
@@ -366,7 +365,16 @@ export default {
};
},
methods: {
initForm() {
changeConnect(val) {
if (!val) {
this.form.CalledAE = null;
this.form.Ip = null;
this.form.Port = null;
this.form.Modality = null;
this.form.IsTestOK = null;
}
},
initForm(res) {
this.getInfo();
},
// 测试dicomAE
@@ -397,7 +405,7 @@ export default {
if (res.IsSuccess) {
this.form.IsPACSConnect = res.OtherInfo.IsPACSConnect;
this.form.IsTrialPACSConfirmed = res.OtherInfo.IsTrialPACSConfirmed;
if (!res.OtherInfo.IsTrialProcessConfirmed) {
if (!res.OtherInfo.IsTrialPACSConfirmed) {
this.isEdit = true;
}
this.form.IsTestOK = res.Result.IsTestOK;
@@ -465,6 +473,7 @@ export default {
this.signVisible = false;
this.confirmVisible = false;
this.updateVisible = false;
this.isEdit = false;
res = await this.addOrUpdateDicomAE();
if (res) this.$emit("refresh");
}
@@ -0,0 +1,281 @@
<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:imageInspect:viewStudy:message:viewStudy") }}{{
$t("trials:imageInspect:viewStudy:message:patientInfo")
}}{{ Patient.PatientIdStr }}{{ Patient.PatientName }}</span
>
<div class="search">
<el-form :inline="true" class="base-search-form">
<!-- 检查类型 -->
<el-form-item
:label="$t('trials:imageInspect:viewStudy:table:modality')"
>
<el-select
v-model="searchData.Modalities"
clearable
style="width: 140px"
>
<el-option
v-for="item of $d.modalType"
:key="item.id"
:label="item.label"
:value="item.label"
>
</el-option>
</el-select>
</el-form-item>
<!-- 检查日期 -->
<el-form-item
:label="$t('trials:imageInspect:viewStudy:table:studyDate')"
>
<el-date-picker
v-model="dateValue"
type="datetimerange"
range-separator=""
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="['00:00:00', '23:59:59']"
>
</el-date-picker>
</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: 'StudyTime', order: 'descending' }"
>
<el-table-column type="index" width="40" />
<!--检查描述-->
<el-table-column
align="center"
prop="Description"
:label="$t('trials:imageInspect:viewStudy:table:studyDescription')"
show-overflow-tooltip
min-width="120"
sortable="custom"
></el-table-column>
<!--检查类型-->
<el-table-column
align="center"
prop="Modalities"
:label="$t('trials:imageInspect:viewStudy:table:modality')"
show-overflow-tooltip
min-width="120"
sortable="custom"
></el-table-column>
<!--Called AE-->
<el-table-column
prop="CalledAE"
:label="$t('trials:imageInspect:viewStudy:table:CalledAE')"
show-overflow-tooltip
min-width="120"
>
</el-table-column>
<!--Calling AE-->
<el-table-column
prop="CallingAE"
:label="$t('trials:imageInspect:viewStudy:table:CallingAE')"
show-overflow-tooltip
min-width="120"
>
</el-table-column>
<!--序列数量-->
<el-table-column
align="center"
prop="SeriesCount"
:label="$t('trials:imageInspect:viewStudy:table:seriesCount')"
show-overflow-tooltip
min-width="100"
sortable="custom"
></el-table-column>
<!--图像数量-->
<el-table-column
align="center"
prop="InstanceCount"
:label="$t('trials:imageInspect:viewStudy:table:instanceCount')"
show-overflow-tooltip
min-width="100"
sortable="custom"
></el-table-column>
<!--检查日期-->
<el-table-column
align="center"
prop="StudyTime"
:label="$t('trials:imageInspect:viewStudy:table:studyDate')"
show-overflow-tooltip
min-width="180"
sortable="custom"
></el-table-column>
<!--操作-->
<el-table-column :label="$t('common:action:action')" min-width="150">
<template slot-scope="scope">
<!-- 影像 -->
<el-button
circle
icon="el-icon-view"
:title="$t('trials:imageInspect:viewStudy:button:image')"
@click.stop="image(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 { getPatientStudyList } from "@/api/trials.js";
import { getToken } from "@/utils/auth";
const defaultSearchData = () => {
return {
Modalities: null,
EarliestStudyTime: null,
LatestStudyTime: null,
PatientId: null,
Asc: false,
SortField: "StudyTime",
};
};
export default {
name: "viewStudyList",
components: { Pagination },
props: {
visible: {
required: true,
default: false,
},
Patient: {
required: true,
default: () => {
return {};
},
},
},
data() {
return {
// 查询
searchData: defaultSearchData(),
dateValue: [],
// 可加入项目列表
loading: false,
list: [],
newWindow: null,
};
},
created() {
this.getList();
},
methods: {
// 关闭弹框
beforeCloseStudyDig() {
if (this.newWindow) {
this.newWindow.close();
}
this.$emit("update:visible", false);
},
// 获取列表
async getList() {
let data = {};
Object.keys(this.searchData).forEach((key) => {
data[key] = this.searchData[key];
});
data.PatientId = this.Patient.PatientId;
if (this.dateValue && this.dateValue[0] && this.dateValue[1]) {
data.EarliestStudyTime = this.$moment(this.dateValue[0]).format(
"YYYY-MM-DD HH:mm:ss"
);
data.LatestStudyTime = this.$moment(this.dateValue[1]).format(
"YYYY-MM-DD HH:mm:ss"
);
} else {
data.EarliestStudyTime = null;
data.LatestStudyTime = null;
}
try {
this.loading = true;
let res = await getPatientStudyList(data);
this.loading = false;
if (res.IsSuccess) {
this.list = res.Result;
}
} catch (err) {
this.loading = false;
console.log(err);
}
},
// 查询
handleSearch() {
this.searchData.PageIndex = 1;
this.getList();
},
// 重置
handleReset() {
this.reset();
this.getList();
},
// 初始化
reset() {
this.searchData = defaultSearchData();
this.dateValue = [];
},
// 查看影像
image(item) {
let token = getToken();
const routeData = this.$router.resolve({
path: `/showdicom?studyId=${item.SCPStudyId}&TokenKey=${token}&type=Patient`,
});
this.newWindow = window.open(routeData.href, "_blank");
},
// 查看报告
report() {},
// 表格排序
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();
},
},
};
</script>
<style lang="scss" scoped>
</style>
@@ -0,0 +1,369 @@
<template>
<BaseContainer>
<template slot="search-container">
<el-form :inline="true">
<!--病历号-->
<el-form-item
:label="$t('trials:imageInspect:table:patientIdStr')"
prop="PatientIdStr"
>
<el-input
v-model="searchData.PatientIdStr"
size="small"
clearable
style="width: 120px"
/>
</el-form-item>
<!--患者姓名-->
<el-form-item
:label="$t('trials:imageInspect:table:patientName')"
prop="PatientName"
>
<el-input
v-model="searchData.PatientName"
size="small"
clearable
style="width: 120px"
/>
</el-form-item>
<!--接收端AE-->
<el-form-item
:label="$t('trials:imageInspect:table:calledAE')"
prop="CalledAE"
>
<el-select
v-model="searchData.CalledAE"
clearable
style="width: 120px"
>
<el-option
v-for="item of calledAEList"
:key="item"
:value="item"
:label="item"
/>
</el-select>
</el-form-item>
<!--发送端AE-->
<el-form-item
:label="$t('trials:imageInspect:table:callingAE')"
prop="CallingAE"
>
<el-select
v-model="searchData.CallingAE"
clearable
style="width: 120px"
>
<el-option
v-for="item of callingAEList"
:key="item"
:value="item"
:label="item"
/>
</el-select>
</el-form-item>
<!--所在中心-->
<el-form-item
:label="$t('trials:imageInspect:table:trialSiteKeyInfo')"
prop="TrialSiteKeyInfo"
>
<el-input
v-model="searchData.TrialSiteKeyInfo"
size="small"
clearable
style="width: 150px"
:placeholder="
$t('trials:imageInspect:placeholder:trialSiteKeyInfo')
"
/>
</el-form-item>
<!--最新接受日期-->
<el-form-item :label="$t('trials:imageInspect:table:createTime')">
<el-date-picker
v-model="datetimerange"
type="datetimerange"
:default-time="['00:00:00', '23:59:59']"
:start-placeholder="$t('trials:loginLog:table:beginTime')"
:end-placeholder="$t('trials:loginLog:table:endTime')"
value-format="yyyy-MM-dd HH:mm:ss"
@change="handleDatetimeChange"
/>
</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>
</template>
<template slot="main-container">
<el-table
v-loading="loading"
v-adaptive="{ bottomOffset: 60 }"
height="100"
:data="list"
class="table"
@sort-change="handleSortByColumn"
:default-sort="{ prop: 'LatestPushTime', order: 'descending' }"
>
<el-table-column type="index" width="50" />
<!--病历号-->
<el-table-column
:label="$t('trials:imageInspect:table:patientIdStr')"
prop="PatientIdStr"
min-width="90"
show-overflow-tooltip
sortable="custom"
/>
<!--患者姓名-->
<el-table-column
:label="$t('trials:imageInspect:table:patientName')"
prop="PatientName"
min-width="90"
show-overflow-tooltip
sortable="custom"
/>
<!--出生日期-->
<el-table-column
:label="$t('trials:imageInspect:table:patientBirthDate')"
prop="PatientBirthDate"
min-width="90"
show-overflow-tooltip
sortable="custom"
/>
<!--性别-->
<el-table-column
:label="$t('trials:imageInspect:table:patientSex')"
prop="PatientSex"
min-width="90"
show-overflow-tooltip
sortable="custom"
/>
<!--接收端AE-->
<el-table-column
:label="$t('trials:imageInspect:table:calledAEList')"
prop="CalledAEList"
min-width="90"
show-overflow-tooltip
sortable="custom"
><template slot-scope="scope">
{{ scope.row.CallingAEList.join(", ") }}
</template>
</el-table-column>
<!--发送端AE-->
<el-table-column
:label="$t('trials:imageInspect:table:callingAEList')"
prop="CallingAEList"
min-width="90"
show-overflow-tooltip
sortable="custom"
>
<template slot-scope="scope">
{{ scope.row.CallingAEList.join(", ") }}
</template>
</el-table-column>
<!--检查-->
<el-table-column
:label="$t('trials:imageInspect:table:studyCount')"
prop="StudyCount"
min-width="160"
show-overflow-tooltip
sortable="custom"
>
<template slot-scope="scope">
<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
:label="$t('trials:imageInspect:table:trialSiteCodeAndName')"
prop="TrialSiteCode"
min-width="160"
show-overflow-tooltip
sortable="custom"
>
<template slot-scope="scope">
{{ scope.row.trialSiteCode }},{{ scope.row.trialSiteName }}
</template>
</el-table-column>
<!--受试者ID-->
<el-table-column
:label="$t('trials:imageInspect:table:subjectCode')"
prop="SubjectCode"
min-width="90"
show-overflow-tooltip
sortable="custom"
/>
<!--最新接收时间-->
<el-table-column
:label="$t('trials:imageInspect:table:lastestPushTime')"
prop="LatestPushTime"
min-width="90"
show-overflow-tooltip
sortable="custom"
/>
</el-table>
<!-- 分页组件 -->
<pagination
class="page"
:total="total"
:page.sync="searchData.PageIndex"
:limit.sync="searchData.PageSize"
@pagination="getList"
/>
</template>
<!--查看检查列表-->
<viewStudy
v-if="visible"
:visible.sync="visible"
:Patient="selectPatient"
@getList="getList"
/>
</BaseContainer>
</template>
<script>
import {
getPatientList,
getDicomCalledAEList,
getDicomCallingAEList,
} from "@/api/trials";
import BaseContainer from "@/components/BaseContainer";
import Pagination from "@/components/Pagination";
import moment from "moment";
import viewStudy from "./components/view-study";
const searchDataDefault = () => {
return {
PatientIdStr: null,
PatientName: null,
CallingAE: null,
CalledAE: null,
BeginPushTime: null,
EndPushTime: null,
SubejctCode: null,
TrialSiteKeyInfo: null,
PageIndex: 1,
PageSize: 20,
Asc: true,
SortField: "LatestPushTime",
};
};
export default {
components: { BaseContainer, Pagination, viewStudy },
data() {
return {
moment,
searchData: searchDataDefault(),
list: [],
total: 0,
loading: false,
datetimerange: [],
calledAEList: [],
callingAEList: [],
visible: false,
selectPatient: {},
};
},
created() {
this.getCalledAEList();
this.getCallingAEList();
},
mounted() {
this.getList();
},
methods: {
// 打开弹框
handleOpenDialog(item) {
this.visible = true;
this.selectPatient = item;
},
// 获取接收端AE列表
async getCalledAEList() {
try {
let params = {
TrialId: this.$route.query.trialId,
};
let res = await getDicomCalledAEList(params);
if (res.IsSuccess) {
this.calledAEList = res.Result;
}
} catch (err) {
console.log(err);
}
},
// 获取发送端端AE列表
async getCallingAEList() {
try {
let params = {
TrialId: this.$route.query.trialId,
};
let res = await getDicomCallingAEList(params);
if (res.IsSuccess) {
this.callingAEList = res.Result;
}
} catch (err) {
console.log(err);
}
},
getList() {
this.loading = true;
this.searchData.TrialId = this.$route.query.trialId;
getPatientList(this.searchData)
.then((res) => {
this.loading = false;
this.list = res.Result.CurrentPageData;
this.total = res.Result.TotalCount;
})
.catch(() => {
this.loading = false;
});
},
handleDatetimeChange(val) {
if (val) {
this.searchData.BeginPushTime = val[0];
this.searchData.EndPushTime = val[1];
} else {
this.searchData.BeginPushTime = "";
this.searchData.EndPushTime = "";
}
},
handleSearch() {
this.searchData.PageIndex = 1;
this.getList();
},
// 重置列表查询
handleReset() {
this.datetimerange = null;
this.handleDatetimeChange();
this.searchData = searchDataDefault();
this.getList();
},
// 排序
handleSortByColumn(column) {
if (column.order === "ascending") {
this.searchData.Asc = true;
} else {
this.searchData.Asc = false;
}
this.searchData.SortField = column.prop;
this.searchData.PageIndex = 1;
this.getList();
},
},
};
</script>
@@ -0,0 +1,311 @@
<template>
<BaseContainer>
<template slot="search-container">
<el-form :inline="true">
<!--所在中心-->
<el-form-item
:label="$t('trials:pushRecord:table:trialSiteKeyInfo')"
prop="TrialSiteKeyInfo"
>
<el-input
v-model="searchData.TrialSiteKeyInfo"
size="small"
clearable
style="width: 150px"
:placeholder="$t('trials:pushRecord:placeholder:trialSiteKeyInfo')"
/>
</el-form-item>
<!--接收端AE-->
<el-form-item
:label="$t('trials:pushRecord:table:calledAE')"
prop="CalledAE"
>
<el-select
v-model="searchData.CalledAE"
clearable
style="width: 120px"
>
<el-option
v-for="item of calledAEList"
:key="item"
:value="item"
:label="item"
/>
</el-select>
</el-form-item>
<!--发送端AE-->
<el-form-item
:label="$t('trials:pushRecord:table:callingAE')"
prop="CallingAE"
>
<el-select
v-model="searchData.CallingAE"
clearable
style="width: 120px"
>
<el-option
v-for="item of callingAEList"
:key="item"
:value="item"
:label="item"
/>
</el-select>
</el-form-item>
<!--最新接受日期-->
<el-form-item :label="$t('trials:pushRecord:table:createTime')">
<el-date-picker
v-model="datetimerange"
type="datetimerange"
:default-time="['00:00:00', '23:59:59']"
:start-placeholder="$t('trials:loginLog:table:beginTime')"
:end-placeholder="$t('trials:loginLog:table:endTime')"
value-format="yyyy-MM-dd HH:mm:ss"
@change="handleDatetimeChange"
/>
</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>
</template>
<template slot="main-container">
<el-table
v-loading="loading"
v-adaptive="{ bottomOffset: 60 }"
height="100"
:data="list"
class="table"
@sort-change="handleSortByColumn"
:default-sort="{ prop: 'StartTime', order: 'descending' }"
>
<el-table-column type="index" width="50" />
<!--中心编号-->
<el-table-column
:label="$t('trials:pushRecord:table:trialSiteCode')"
prop="TrialSiteCode"
min-width="160"
show-overflow-tooltip
sortable="custom"
/>
<!--中心名称-->
<el-table-column
:label="$t('trials:pushRecord:table:trialSiteAliasName')"
prop="TrialSiteAliasName"
min-width="160"
show-overflow-tooltip
sortable="custom"
/>
<!--发送端AE-->
<el-table-column
:label="$t('trials:pushRecord:table:callingAEList')"
prop="CallingAEList"
min-width="90"
show-overflow-tooltip
sortable="custom"
>
<template slot-scope="scope">
{{ scope.row.CallingAEList.join(", ") }}
</template>
</el-table-column>
<!--发送端IP-->
<el-table-column
:label="$t('trials:pushRecord:table:callingAEIP')"
prop="CallingAEIP"
min-width="160"
show-overflow-tooltip
sortable="custom"
/>
<!--接收端AE-->
<el-table-column
:label="$t('trials:pushRecord:table:calledAEList')"
prop="CalledAEList"
min-width="90"
show-overflow-tooltip
sortable="custom"
><template slot-scope="scope">
{{ scope.row.CallingAEList.join(", ") }}
</template>
</el-table-column>
<!--检查数-->
<el-table-column
:label="$t('trials:pushRecord:table:studyCount')"
prop="StudyCount"
min-width="160"
show-overflow-tooltip
sortable="custom"
/>
<!--图像数量-->
<el-table-column
:label="$t('trials:pushRecord:table:fileCount')"
prop="FileCount"
min-width="160"
show-overflow-tooltip
sortable="custom"
/>
<!--图像大小-->
<el-table-column
:label="$t('trials:pushRecord:table:fileSize')"
prop="FileSize"
min-width="160"
show-overflow-tooltip
sortable="custom"
/>
<!--推送开始时间-->
<el-table-column
:label="$t('trials:pushRecord:table:startTime')"
prop="StartTime"
min-width="160"
show-overflow-tooltip
sortable="custom"
/>
<!--推送结束时间-->
<el-table-column
:label="$t('trials:pushRecord:table:endTime')"
prop="EndTime"
min-width="160"
show-overflow-tooltip
sortable="custom"
/>
</el-table>
<!-- 分页组件 -->
<pagination
class="page"
:total="total"
:page.sync="searchData.PageIndex"
:limit.sync="searchData.PageSize"
@pagination="getList"
/>
</template>
</BaseContainer>
</template>
<script>
import {
getSCPImageUploadList,
getDicomCalledAEList,
getDicomCallingAEList,
} from "@/api/trials";
import BaseContainer from "@/components/BaseContainer";
import Pagination from "@/components/Pagination";
import moment from "moment";
const searchDataDefault = () => {
return {
CallingAE: null,
CalledAE: null,
StartTime: null,
EndTime: null,
TrialSiteKeyInfo: null,
PageIndex: 1,
PageSize: 20,
Asc: true,
SortField: "StartTime",
};
};
export default {
components: { BaseContainer, Pagination },
data() {
return {
moment,
searchData: searchDataDefault(),
list: [],
total: 0,
loading: false,
datetimerange: [],
calledAEList: [],
callingAEList: [],
};
},
created() {
this.getCalledAEList();
this.getCallingAEList();
},
mounted() {
this.getList();
},
methods: {
// 获取接收端AE列表
async getCalledAEList() {
try {
let params = {
TrialId: this.$route.query.trialId,
};
let res = await getDicomCalledAEList(params);
if (res.IsSuccess) {
this.calledAEList = res.Result;
}
} catch (err) {
console.log(err);
}
},
// 获取发送端端AE列表
async getCallingAEList() {
try {
let params = {
TrialId: this.$route.query.trialId,
};
let res = await getDicomCallingAEList(params);
if (res.IsSuccess) {
this.callingAEList = res.Result;
}
} catch (err) {
console.log(err);
}
},
getList() {
this.loading = true;
this.searchData.TrialId = this.$route.query.trialId;
getSCPImageUploadList(this.searchData)
.then((res) => {
this.loading = false;
this.list = res.Result.CurrentPageData;
this.total = res.Result.TotalCount;
})
.catch(() => {
this.loading = false;
});
},
handleDatetimeChange(val) {
if (val) {
this.searchData.StartTime = val[0];
this.searchData.EndTime = val[1];
} else {
this.searchData.StartTime = "";
this.searchData.EndTime = "";
}
},
handleSearch() {
this.searchData.PageIndex = 1;
this.getList();
},
// 重置列表查询
handleReset() {
this.datetimerange = null;
this.handleDatetimeChange();
this.searchData = searchDataDefault();
this.getList();
},
// 排序
handleSortByColumn(column) {
if (column.order === "ascending") {
this.searchData.Asc = true;
} else {
this.searchData.Asc = false;
}
this.searchData.SortField = column.prop;
this.searchData.PageIndex = 1;
this.getList();
},
},
};
</script>
@@ -193,365 +193,389 @@
</el-table-column>
</el-table>
<!-- 多文件上传 -->
<form id="inputForm" ref="uploadForm" enctype="multipart/form-data">
<el-divider content-position="left">{{
$t("trials:uploadedDicoms:title:dicomFilesOnly")
}}</el-divider>
<div class="form-group">
<div id="directoryInputWrapper" class="btn btn-link file-input">
<el-button
type="primary"
:disabled="btnLoading"
:loading="btnLoading"
size="small"
>{{
$t("trials:uploadedDicomsicom:button:selectFolder")
}}</el-button
>
<input
type="file"
name="file"
ref="pathClear"
:disabled="btnLoading"
webkitdirectory
multiple
@change="beginScanFiles($event)"
/>
</div>
</div>
</form>
<!-- 文件列表 -->
<el-table
ref="dicomFilesTable"
:data="uploadQueues"
:row-key="(row) => row.studyIndex"
class="dicomFiles-table"
@selection-change="handleSelectionChange"
>
<el-table-column
type="selection"
width="55"
:selectable="handleSelectable"
/>
<el-table-column type="index" width="40" />
<el-table-column min-width="200" show-overflow-tooltip>
<template slot="header">
<el-tooltip placement="top">
<div slot="content">
{{ $t("trials:uploadDicomList:table:studyDetail1") }}<br />
{{ $t("trials:uploadDicomList:table:studyDetail2") }}<br />
{{ $t("trials:uploadedDicoms:table:studyDate") }}
</div>
<span>{{ $t("trials:uploadDicomList:table:studyInfo") }}</span>
</el-tooltip>
</template>
<template slot-scope="scope">
<div style="line-height: 15px">
<div>
<div>
<span v-if="scope.row.dicomInfo.accNumber"
><span style="font-weight: 500">Acc:</span>
{{ scope.row.dicomInfo.accNumber }}</span
>
<span v-else style="color: #f44336">N/A</span>
</div>
<div style="display: inline-block; margin-right: 2px">
<span v-if="scope.row.dicomInfo.modality.length > 0">
{{ scope.row.dicomInfo.modality.join("、") }},</span
>
<span v-else style="color: #f44336">N/A,</span>
</div>
<div style="display: inline-block; margin-right: 2px">
<span v-if="scope.row.seriesList.length"
>{{ scope.row.seriesList.length }} Series,</span
>
<span v-else style="color: #f44336">N/A,</span>
</div>
<div style="display: inline-block">
<span v-if="scope.row.fileList.length"
>{{ scope.row.fileList.length }} Instances</span
>
<span v-else style="color: #f44336">N/A</span>
</div>
</div>
<div>
<div style="display: inline-block; margin-right: 2px">
<span v-if="scope.row.dicomInfo.bodyPart">
{{ scope.row.dicomInfo.bodyPart }},
</span>
<span v-else style="color: #f44336">N/A, </span>
</div>
<div style="display: inline-block">
<span v-if="scope.row.dicomInfo.description">
{{ scope.row.dicomInfo.description }}</span
>
<span v-else style="color: #f44336">N/A</span>
</div>
</div>
<div>
{{ scope.row.dicomInfo.studyTime }}
<el-divider content-position="left">{{
$t("trials:uploadedDicoms:title:dicomFilesOnly")
}}</el-divider>
<el-tabs v-model="uploadActiveName">
<!-- 本地上传 -->
<el-tab-pane
:label="$t('trials:uploadedDicoms:tab:uploadFile')"
name="file"
>
<form id="inputForm" ref="uploadForm" enctype="multipart/form-data">
<div class="form-group">
<div id="directoryInputWrapper" class="btn btn-link file-input">
<el-button
type="primary"
:disabled="btnLoading"
:loading="btnLoading"
size="small"
>{{
$t("trials:uploadedDicomsicom:button:selectFolder")
}}</el-button
>
<input
type="file"
name="file"
ref="pathClear"
:disabled="btnLoading"
webkitdirectory
multiple
@change="beginScanFiles($event)"
/>
</div>
</div>
</template>
</el-table-column>
<el-table-column min-width="130" show-overflow-tooltip>
<template slot="header">
<el-tooltip placement="top">
<div slot="content">
{{ $t("trials:uploadDicomList:table:pId") }}<br />
{{ $t("trials:uploadDicomList:table:patientName") }}<br />
{{ $t("trials:uploadDicomList:table:pInfo") }}
</div>
<span>{{ $t("trials:uploadDicomList:table:patientInfo") }}</span>
</el-tooltip>
</template>
<template slot-scope="scope">
<div style="line-height: 15px">
<div>
<span v-if="scope.row.dicomInfo.patientId"
><span style="font-weight: 500">PID: </span
>{{ scope.row.dicomInfo.patientId }}</span
>
<span v-else style="color: #f44336">N/A</span>
</div>
<div>
<span
:class="[scope.row.dicomInfo.patientName ? '' : 'colorOfRed']"
>
{{
scope.row.dicomInfo.patientName
? scope.row.dicomInfo.patientName
: "N/A"
}}
</span>
</div>
<div>
<span
:class="[scope.row.dicomInfo.patientSex ? '' : 'colorOfRed']"
>
{{
scope.row.dicomInfo.patientSex
? scope.row.dicomInfo.patientSex
: "N/A"
}},
</span>
</form>
<span
:class="[scope.row.dicomInfo.patientAge ? '' : 'colorOfRed']"
>
{{
scope.row.dicomInfo.patientAge
? scope.row.dicomInfo.patientAge
: "N/A"
}},
</span>
<span
:class="[
scope.row.dicomInfo.patientBirthDate ? '' : 'colorOfRed',
]"
>
{{
scope.row.dicomInfo.patientBirthDate
? scope.row.dicomInfo.patientBirthDate
: "N/A"
}}
</span>
</div>
</div>
</template>
</el-table-column>
<el-table-column
:label="$t('trials:uploadDicomList:table:failedFileCount')"
min-width="120"
show-overflow-tooltip
>
<template slot-scope="scope">
<el-progress
color="#409eff"
:percentage="
(scope.row.dicomInfo.failedFileCount * 100) /
scope.row.dicomInfo.fileCount
"
:show-text="false"
<!-- 文件列表 -->
<el-table
ref="dicomFilesTable"
:data="uploadQueues"
:row-key="(row) => row.studyIndex"
class="dicomFiles-table"
@selection-change="handleSelectionChange"
>
<el-table-column
type="selection"
width="55"
:selectable="handleSelectable"
/>
<span
>{{ scope.row.dicomInfo.failedFileCount }} /
{{ scope.row.dicomInfo.fileCount }}</span
>
</template>
</el-table-column>
<el-table-column type="index" width="40" />
<el-table-column min-width="200" show-overflow-tooltip>
<template slot="header">
<el-tooltip placement="top">
<div slot="content">
{{ $t("trials:uploadDicomList:table:studyDetail1") }}<br />
{{ $t("trials:uploadDicomList:table:studyDetail2") }}<br />
{{ $t("trials:uploadedDicoms:table:studyDate") }}
</div>
<span>{{ $t("trials:uploadDicomList:table:studyInfo") }}</span>
</el-tooltip>
</template>
<template slot-scope="scope">
<div style="line-height: 15px">
<div>
<div>
<span v-if="scope.row.dicomInfo.accNumber"
><span style="font-weight: 500">Acc:</span>
{{ scope.row.dicomInfo.accNumber }}</span
>
<span v-else style="color: #f44336">N/A</span>
</div>
<div style="display: inline-block; margin-right: 2px">
<span v-if="scope.row.dicomInfo.modality.length > 0">
{{ scope.row.dicomInfo.modality.join("、") }},</span
>
<span v-else style="color: #f44336">N/A,</span>
</div>
<div style="display: inline-block; margin-right: 2px">
<span v-if="scope.row.seriesList.length"
>{{ scope.row.seriesList.length }} Series,</span
>
<span v-else style="color: #f44336">N/A,</span>
</div>
<div style="display: inline-block">
<span v-if="scope.row.fileList.length"
>{{ scope.row.fileList.length }} Instances</span
>
<span v-else style="color: #f44336">N/A</span>
</div>
</div>
<el-table-column
:label="$t('trials:uploadDicomList:table:status')"
min-width="140"
show-overflow-tooltip
>
<template slot-scope="scope">
<span
v-if="
!scope.row.dicomInfo.failedFileCount &&
!scope.row.dicomInfo.isInit
"
>
{{ $t("trials:uploadDicomList:table:status1") }}</span
>
<span
style="color: #409eff"
v-else-if="
!scope.row.dicomInfo.failedFileCount &&
scope.row.dicomInfo.isInit &&
btnLoading
"
>{{ $t("trials:uploadDicomList:table:status2") }}</span
>
<span
style="color: #409eff"
v-else-if="
scope.row.dicomInfo.failedFileCount <
scope.row.dicomInfo.fileCount && !scope.row.uploadState.record
"
>{{ $t("trials:uploadDicomList:table:status2") }}</span
>
<span
style="color: #2cc368"
v-else-if="
scope.row.dicomInfo.failedFileCount ===
scope.row.dicomInfo.fileCount
"
>{{ $t("trials:uploadDicomList:table:status3") }}</span
>
<span
style="color: #f66"
v-else-if="
scope.row.uploadState.record &&
scope.row.uploadState.record.fileCount === 0
"
>{{ $t("trials:uploadDicomList:table:status5") }}</span
>
<span style="color: #f66" v-else>{{
$t("trials:uploadDicomList:table:Failed")
}}</span>
</template>
</el-table-column>
<el-table-column
:label="$t('trials:uploadDicomList:table:record')"
min-width="140"
show-overflow-tooltip
>
<template slot-scope="scope">
<el-tooltip placement="top" v-if="scope.row.uploadState.record">
<div slot="content">
<div style="max-height: 500px; overflow-y: auto">
{{ $t("trials:uploadDicomList:table:Existed") }}:
<div v-if="scope.row.uploadState.record.Existed.length">
<div
v-for="item of scope.row.uploadState.record.Existed"
:key="item"
style="font-size: 12px; color: #baa72a"
>
{{ item }}
<div>
<div style="display: inline-block; margin-right: 2px">
<span v-if="scope.row.dicomInfo.bodyPart">
{{ scope.row.dicomInfo.bodyPart }},
</span>
<span v-else style="color: #f44336">N/A, </span>
</div>
<div style="display: inline-block">
<span v-if="scope.row.dicomInfo.description">
{{ scope.row.dicomInfo.description }}</span
>
<span v-else style="color: #f44336">N/A</span>
</div>
</div>
<div v-else>&nbsp;</div>
{{ $t("trials:uploadDicomList:table:Uploaded") }}:
<div v-if="scope.row.uploadState.record.Uploaded.length">
<div
v-for="item of scope.row.uploadState.record.Uploaded"
:key="item"
style="font-size: 12px; color: #24b837"
>
{{ item }}
</div>
<div>
{{ scope.row.dicomInfo.studyTime }}
</div>
<div v-else>&nbsp;</div>
<br />
{{ $t("trials:uploadDicomList:table:Failed") }}:
<div v-if="scope.row.uploadState.record.Failed.length">
<div
v-for="item of scope.row.uploadState.record.Failed"
:key="item"
style="font-size: 12px; color: #f66"
>
{{ item }}
</div>
</div>
<div v-else>&nbsp;</div>
</div>
</div>
<el-button size="mini" style="cursor: pointer">
<span style="font-size: 12px; color: #baa72a">{{
scope.row.uploadState.record.Existed.length
</template>
</el-table-column>
<el-table-column min-width="130" show-overflow-tooltip>
<template slot="header">
<el-tooltip placement="top">
<div slot="content">
{{ $t("trials:uploadDicomList:table:pId") }}<br />
{{ $t("trials:uploadDicomList:table:patientName") }}<br />
{{ $t("trials:uploadDicomList:table:pInfo") }}
</div>
<span>{{
$t("trials:uploadDicomList:table:patientInfo")
}}</span>
</el-tooltip>
</template>
<template slot-scope="scope">
<div style="line-height: 15px">
<div>
<span v-if="scope.row.dicomInfo.patientId"
><span style="font-weight: 500">PID: </span
>{{ scope.row.dicomInfo.patientId }}</span
>
<span v-else style="color: #f44336">N/A</span>
</div>
<div>
<span
:class="[
scope.row.dicomInfo.patientName ? '' : 'colorOfRed',
]"
>
{{
scope.row.dicomInfo.patientName
? scope.row.dicomInfo.patientName
: "N/A"
}}
</span>
</div>
<div>
<span
:class="[
scope.row.dicomInfo.patientSex ? '' : 'colorOfRed',
]"
>
{{
scope.row.dicomInfo.patientSex
? scope.row.dicomInfo.patientSex
: "N/A"
}},
</span>
<span
:class="[
scope.row.dicomInfo.patientAge ? '' : 'colorOfRed',
]"
>
{{
scope.row.dicomInfo.patientAge
? scope.row.dicomInfo.patientAge
: "N/A"
}},
</span>
<span
:class="[
scope.row.dicomInfo.patientBirthDate ? '' : 'colorOfRed',
]"
>
{{
scope.row.dicomInfo.patientBirthDate
? scope.row.dicomInfo.patientBirthDate
: "N/A"
}}
</span>
</div>
</div>
</template>
</el-table-column>
<el-table-column
:label="$t('trials:uploadDicomList:table:failedFileCount')"
min-width="120"
show-overflow-tooltip
>
<template slot-scope="scope">
<el-progress
color="#409eff"
:percentage="
(scope.row.dicomInfo.failedFileCount * 100) /
scope.row.dicomInfo.fileCount
"
:show-text="false"
/>
<span
>{{ scope.row.dicomInfo.failedFileCount }} /
{{ scope.row.dicomInfo.fileCount }}</span
>
</template>
</el-table-column>
<el-table-column
:label="$t('trials:uploadDicomList:table:status')"
min-width="140"
show-overflow-tooltip
>
<template slot-scope="scope">
<span
v-if="
!scope.row.dicomInfo.failedFileCount &&
!scope.row.dicomInfo.isInit
"
>
{{ $t("trials:uploadDicomList:table:status1") }}</span
>
<span
style="color: #409eff"
v-else-if="
!scope.row.dicomInfo.failedFileCount &&
scope.row.dicomInfo.isInit &&
btnLoading
"
>{{ $t("trials:uploadDicomList:table:status2") }}</span
>
<span
style="color: #409eff"
v-else-if="
scope.row.dicomInfo.failedFileCount <
scope.row.dicomInfo.fileCount &&
!scope.row.uploadState.record
"
>{{ $t("trials:uploadDicomList:table:status2") }}</span
>
<span
style="color: #2cc368"
v-else-if="
scope.row.dicomInfo.failedFileCount ===
scope.row.dicomInfo.fileCount
"
>{{ $t("trials:uploadDicomList:table:status3") }}</span
>
<span
style="color: #f66"
v-else-if="
scope.row.uploadState.record &&
scope.row.uploadState.record.fileCount === 0
"
>{{ $t("trials:uploadDicomList:table:status5") }}</span
>
<span style="color: #f66" v-else>{{
$t("trials:uploadDicomList:table:Failed")
}}</span>
/
<span style="font-size: 12px; color: #24b837">{{
scope.row.uploadState.record.Uploaded.length
}}</span>
/
<span style="font-size: 12px; color: #f66">{{
scope.row.uploadState.record.Failed.length
}}</span>
</el-button>
</el-tooltip>
</template>
</el-table-column>
<el-table-column
v-show="isScan"
:label="$t('common:action:action')"
width="200"
>
<template slot-scope="scope">
<!-- 预览 -->
<!-- :disabled="scope.row.dicomInfo.failedFileCount < scope.row.dicomInfo.fileCount && scope.row.dicomInfo.failedFileCount !== 0"-->
<el-button
icon="el-icon-view"
circle
:disabled="
scope.row.uploadState.stateCode !== '' &&
scope.row.dicomInfo.failedFileCount <
scope.row.dicomInfo.fileCount &&
!scope.row.uploadState.record
"
:title="$t('trials:uploadedDicoms:action:preview')"
size="small"
@click="handlePreview(scope.row.dicomInfo.studyUid)"
/>
<!-- 移除 -->
<el-button
icon="el-icon-delete"
circle
:title="$t('trials:uploadedDicoms:action:delete')"
size="small"
:disabled="
scope.row.uploadState.stateCode !== '' &&
scope.row.dicomInfo.failedFileCount <
scope.row.dicomInfo.fileCount &&
!scope.row.uploadState.record
"
@click="handleDelete(scope.$index, scope.row)"
/>
</template>
</el-table-column>
</el-table>
<div style="text-align: right; padding: 10px 0px">
<!-- 关闭 -->
<!-- <el-button :disabled="btnLoading" size="small" type="primary" @click="cancel">
</template>
</el-table-column>
<el-table-column
:label="$t('trials:uploadDicomList:table:record')"
min-width="140"
show-overflow-tooltip
>
<template slot-scope="scope">
<el-tooltip placement="top" v-if="scope.row.uploadState.record">
<div slot="content">
<div style="max-height: 500px; overflow-y: auto">
{{ $t("trials:uploadDicomList:table:Existed") }}:
<div v-if="scope.row.uploadState.record.Existed.length">
<div
v-for="item of scope.row.uploadState.record.Existed"
:key="item"
style="font-size: 12px; color: #baa72a"
>
{{ item }}
</div>
</div>
<div v-else>&nbsp;</div>
{{ $t("trials:uploadDicomList:table:Uploaded") }}:
<div v-if="scope.row.uploadState.record.Uploaded.length">
<div
v-for="item of scope.row.uploadState.record.Uploaded"
:key="item"
style="font-size: 12px; color: #24b837"
>
{{ item }}
</div>
</div>
<div v-else>&nbsp;</div>
<br />
{{ $t("trials:uploadDicomList:table:Failed") }}:
<div v-if="scope.row.uploadState.record.Failed.length">
<div
v-for="item of scope.row.uploadState.record.Failed"
:key="item"
style="font-size: 12px; color: #f66"
>
{{ item }}
</div>
</div>
<div v-else>&nbsp;</div>
</div>
</div>
<el-button size="mini" style="cursor: pointer">
<span style="font-size: 12px; color: #baa72a">{{
scope.row.uploadState.record.Existed.length
}}</span>
/
<span style="font-size: 12px; color: #24b837">{{
scope.row.uploadState.record.Uploaded.length
}}</span>
/
<span style="font-size: 12px; color: #f66">{{
scope.row.uploadState.record.Failed.length
}}</span>
</el-button>
</el-tooltip>
</template>
</el-table-column>
<el-table-column
v-show="isScan"
:label="$t('common:action:action')"
width="200"
>
<template slot-scope="scope">
<!-- 预览 -->
<!-- :disabled="scope.row.dicomInfo.failedFileCount < scope.row.dicomInfo.fileCount && scope.row.dicomInfo.failedFileCount !== 0"-->
<el-button
icon="el-icon-view"
circle
:disabled="
scope.row.uploadState.stateCode !== '' &&
scope.row.dicomInfo.failedFileCount <
scope.row.dicomInfo.fileCount &&
!scope.row.uploadState.record
"
:title="$t('trials:uploadedDicoms:action:preview')"
size="small"
@click="handlePreview(scope.row.dicomInfo.studyUid)"
/>
<!-- 移除 -->
<el-button
icon="el-icon-delete"
circle
:title="$t('trials:uploadedDicoms:action:delete')"
size="small"
:disabled="
scope.row.uploadState.stateCode !== '' &&
scope.row.dicomInfo.failedFileCount <
scope.row.dicomInfo.fileCount &&
!scope.row.uploadState.record
"
@click="handleDelete(scope.$index, scope.row)"
/>
</template>
</el-table-column>
</el-table>
<div style="text-align: right; padding: 10px 0px">
<!-- 关闭 -->
<!-- <el-button :disabled="btnLoading" size="small" type="primary" @click="cancel">
{{ $t('trials:uploadDicomList:button:close') }}
</el-button> -->
<!-- 上传 -->
<el-button
size="small"
type="primary"
:disabled="selectArr.length == 0 || !isScan"
:loading="btnLoading"
@click="beginUploadQueues"
<!-- 上传 -->
<el-button
size="small"
type="primary"
:disabled="selectArr.length == 0 || !isScan"
:loading="btnLoading"
@click="beginUploadQueues"
>
{{ $t("trials:uploadDicomList:button:upload") }}
</el-button>
</div>
</el-tab-pane>
<!-- pacs上传 -->
<el-tab-pane
:label="$t('trials:uploadNonDicoms:tab:uploadPacs')"
name="pacs"
:disabled="btnLoading"
>
{{ $t("trials:uploadDicomList:button:upload") }}
</el-button>
</div>
<uploadDicomPacs v-if="uploadActiveName === 'pacs'" />
</el-tab-pane>
</el-tabs>
<!-- 预览影像模态框 -->
<el-dialog
v-if="previewVisible"
@@ -758,9 +782,10 @@ import { dcmUpload } from "@/utils/dcmUpload/dcmUpload";
import { convertBytes } from "@/utils/dicom-character-set";
import moment from "moment";
import store from "@/store";
import uploadDicomPacs from "./uploadDiocmPacs.vue";
export default {
name: "UploadDicomFiles",
components: { DicomPreview, uploadPetClinicalData },
components: { DicomPreview, uploadPetClinicalData, uploadDicomPacs },
props: {
data: {
type: Object,
@@ -783,6 +808,7 @@ export default {
},
data() {
return {
uploadActiveName: "file",
editStudyInfoVisible: false,
studyForm: {
StudyCode: "",
@@ -0,0 +1,311 @@
<template>
<BaseContainer>
<template slot="search-container">
<el-form :inline="true">
<!--所在中心-->
<el-form-item
:label="$t('trials:pushRecord:table:trialSiteKeyInfo')"
prop="TrialSiteKeyInfo"
>
<el-input
v-model="searchData.TrialSiteKeyInfo"
size="small"
clearable
style="width: 150px"
:placeholder="$t('trials:pushRecord:placeholder:trialSiteKeyInfo')"
/>
</el-form-item>
<!--接收端AE-->
<el-form-item
:label="$t('trials:pushRecord:table:calledAE')"
prop="CalledAE"
>
<el-select
v-model="searchData.CalledAE"
clearable
style="width: 120px"
>
<el-option
v-for="item of calledAEList"
:key="item"
:value="item"
:label="item"
/>
</el-select>
</el-form-item>
<!--发送端AE-->
<el-form-item
:label="$t('trials:pushRecord:table:callingAE')"
prop="CallingAE"
>
<el-select
v-model="searchData.CallingAE"
clearable
style="width: 120px"
>
<el-option
v-for="item of callingAEList"
:key="item"
:value="item"
:label="item"
/>
</el-select>
</el-form-item>
<!--最新接受日期-->
<el-form-item :label="$t('trials:pushRecord:table:createTime')">
<el-date-picker
v-model="datetimerange"
type="datetimerange"
:default-time="['00:00:00', '23:59:59']"
:start-placeholder="$t('trials:loginLog:table:beginTime')"
:end-placeholder="$t('trials:loginLog:table:endTime')"
value-format="yyyy-MM-dd HH:mm:ss"
@change="handleDatetimeChange"
/>
</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>
</template>
<template slot="main-container">
<el-table
v-loading="loading"
v-adaptive="{ bottomOffset: 120 }"
height="100"
:data="list"
class="table"
@sort-change="handleSortByColumn"
:default-sort="{ prop: 'StartTime', order: 'descending' }"
>
<el-table-column type="index" width="50" />
<!--中心编号-->
<el-table-column
:label="$t('trials:pushRecord:table:trialSiteCode')"
prop="TrialSiteCode"
min-width="160"
show-overflow-tooltip
sortable="custom"
/>
<!--中心名称-->
<el-table-column
:label="$t('trials:pushRecord:table:trialSiteAliasName')"
prop="TrialSiteAliasName"
min-width="160"
show-overflow-tooltip
sortable="custom"
/>
<!--发送端AE-->
<el-table-column
:label="$t('trials:pushRecord:table:callingAEList')"
prop="CallingAEList"
min-width="90"
show-overflow-tooltip
sortable="custom"
>
<template slot-scope="scope">
{{ scope.row.CallingAEList.join(", ") }}
</template>
</el-table-column>
<!--发送端IP-->
<el-table-column
:label="$t('trials:pushRecord:table:callingAEIP')"
prop="CallingAEIP"
min-width="160"
show-overflow-tooltip
sortable="custom"
/>
<!--接收端AE-->
<el-table-column
:label="$t('trials:pushRecord:table:calledAEList')"
prop="CalledAEList"
min-width="90"
show-overflow-tooltip
sortable="custom"
><template slot-scope="scope">
{{ scope.row.CallingAEList.join(", ") }}
</template>
</el-table-column>
<!--检查数-->
<el-table-column
:label="$t('trials:pushRecord:table:studyCount')"
prop="StudyCount"
min-width="160"
show-overflow-tooltip
sortable="custom"
/>
<!--图像数量-->
<el-table-column
:label="$t('trials:pushRecord:table:fileCount')"
prop="FileCount"
min-width="160"
show-overflow-tooltip
sortable="custom"
/>
<!--图像大小-->
<el-table-column
:label="$t('trials:pushRecord:table:fileSize')"
prop="FileSize"
min-width="160"
show-overflow-tooltip
sortable="custom"
/>
<!--推送开始时间-->
<el-table-column
:label="$t('trials:pushRecord:table:startTime')"
prop="StartTime"
min-width="160"
show-overflow-tooltip
sortable="custom"
/>
<!--推送结束时间-->
<el-table-column
:label="$t('trials:pushRecord:table:endTime')"
prop="EndTime"
min-width="160"
show-overflow-tooltip
sortable="custom"
/>
</el-table>
<!-- 分页组件 -->
<pagination
class="page"
:total="total"
:page.sync="searchData.PageIndex"
:limit.sync="searchData.PageSize"
@pagination="getList"
/>
</template>
</BaseContainer>
</template>
<script>
import {
getSCPImageUploadList,
getDicomCalledAEList,
getDicomCallingAEList,
} from "@/api/trials";
import BaseContainer from "@/components/BaseContainer";
import Pagination from "@/components/Pagination";
import moment from "moment";
const searchDataDefault = () => {
return {
CallingAE: null,
CalledAE: null,
StartTime: null,
EndTime: null,
TrialSiteKeyInfo: null,
PageIndex: 1,
PageSize: 20,
Asc: true,
SortField: "StartTime",
};
};
export default {
components: { BaseContainer, Pagination },
data() {
return {
moment,
searchData: searchDataDefault(),
list: [],
total: 0,
loading: false,
datetimerange: [],
calledAEList: [],
callingAEList: [],
};
},
created() {
this.getCalledAEList();
this.getCallingAEList();
},
mounted() {
this.getList();
},
methods: {
// 获取接收端AE列表
async getCalledAEList() {
try {
let params = {
TrialId: this.$route.query.trialId,
};
let res = await getDicomCalledAEList(params);
if (res.IsSuccess) {
this.calledAEList = res.Result;
}
} catch (err) {
console.log(err);
}
},
// 获取发送端端AE列表
async getCallingAEList() {
try {
let params = {
TrialId: this.$route.query.trialId,
};
let res = await getDicomCallingAEList(params);
if (res.IsSuccess) {
this.callingAEList = res.Result;
}
} catch (err) {
console.log(err);
}
},
getList() {
this.loading = true;
this.searchData.TrialId = this.$route.query.trialId;
getSCPImageUploadList(this.searchData)
.then((res) => {
this.loading = false;
this.list = res.Result.CurrentPageData;
this.total = res.Result.TotalCount;
})
.catch(() => {
this.loading = false;
});
},
handleDatetimeChange(val) {
if (val) {
this.searchData.StartTime = val[0];
this.searchData.EndTime = val[1];
} else {
this.searchData.StartTime = "";
this.searchData.EndTime = "";
}
},
handleSearch() {
this.searchData.PageIndex = 1;
this.getList();
},
// 重置列表查询
handleReset() {
this.datetimerange = null;
this.handleDatetimeChange();
this.searchData = searchDataDefault();
this.getList();
},
// 排序
handleSortByColumn(column) {
if (column.order === "ascending") {
this.searchData.Asc = true;
} else {
this.searchData.Asc = false;
}
this.searchData.SortField = column.prop;
this.searchData.PageIndex = 1;
this.getList();
},
},
};
</script>
@@ -1045,7 +1045,7 @@ export default {
formRow: {},
searchData: searchDataDefault(),
loading: false,
uploadVisible: false,
uploadVisible: true,
qcVisible: false,
list: [],
total: 0,