项目管理->访视列表和下载影像接口调试对接
parent
983d57861c
commit
77b03186d8
|
@ -238,6 +238,7 @@ export default {
|
||||||
handleSelectChange() {},
|
handleSelectChange() {},
|
||||||
// 可选检查添加
|
// 可选检查添加
|
||||||
add(item) {},
|
add(item) {},
|
||||||
|
addTrials() {},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|
|
@ -5,16 +5,24 @@
|
||||||
<el-form :inline="true">
|
<el-form :inline="true">
|
||||||
<!-- 受试者编号 -->
|
<!-- 受试者编号 -->
|
||||||
<el-form-item :label="$t('trials:crcQuestion:table:subjectId')">
|
<el-form-item :label="$t('trials:crcQuestion:table:subjectId')">
|
||||||
<el-input v-model="searchData.SubjectInfo" style="width: 140px" />
|
<el-input
|
||||||
|
v-model="searchData.SubjectCode"
|
||||||
|
clearable
|
||||||
|
style="width: 140px"
|
||||||
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<!-- 患者姓名 -->
|
<!-- 患者姓名 -->
|
||||||
<el-form-item :label="$t('trials:uploadDicomList:table:patientName')">
|
<el-form-item :label="$t('trials:uploadDicomList:table:patientName')">
|
||||||
<el-input v-model="searchData.SubjectInfo" style="width: 140px" />
|
<el-input
|
||||||
|
v-model="searchData.SubjectShortName"
|
||||||
|
clearable
|
||||||
|
style="width: 140px"
|
||||||
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<!-- 患者性别 -->
|
<!-- 患者性别 -->
|
||||||
<el-form-item :label="$t('trials:subject:table:gender')">
|
<el-form-item :label="$t('trials:subject:table:gender')">
|
||||||
<el-select
|
<el-select
|
||||||
v-model="searchData.SiteId"
|
v-model="searchData.SubjectSex"
|
||||||
clearable
|
clearable
|
||||||
filterable
|
filterable
|
||||||
style="width: 150px"
|
style="width: 150px"
|
||||||
|
@ -28,7 +36,7 @@
|
||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<!-- 访视名称 -->
|
<!-- 访视名称 -->
|
||||||
<el-form-item :label="$t('trials:globalReview:table:visitName')">
|
<!-- <el-form-item :label="$t('trials:globalReview:table:visitName')">
|
||||||
<el-select
|
<el-select
|
||||||
v-model="searchData.SiteId"
|
v-model="searchData.SiteId"
|
||||||
clearable
|
clearable
|
||||||
|
@ -42,9 +50,9 @@
|
||||||
:value="item.SiteId"
|
:value="item.SiteId"
|
||||||
/>
|
/>
|
||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item> -->
|
||||||
<!-- 状态 -->
|
<!-- 状态 -->
|
||||||
<el-form-item :label="$t('trials:trials-list:table:status')">
|
<!-- <el-form-item :label="$t('trials:trials-list:table:status')">
|
||||||
<el-select
|
<el-select
|
||||||
v-model="searchData.SiteId"
|
v-model="searchData.SiteId"
|
||||||
clearable
|
clearable
|
||||||
|
@ -58,7 +66,7 @@
|
||||||
:value="item.SiteId"
|
:value="item.SiteId"
|
||||||
/>
|
/>
|
||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item> -->
|
||||||
<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">
|
||||||
|
@ -95,66 +103,92 @@
|
||||||
></i>
|
></i>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
|
<el-table-column type="index" width="40" />
|
||||||
<!-- 受试者编号 -->
|
<!-- 受试者编号 -->
|
||||||
<el-table-column
|
<el-table-column
|
||||||
prop="StudyCode"
|
prop="SubjectCode"
|
||||||
:label="$t('trials:uploadMonitor:table:subjectId')"
|
:label="$t('trials:uploadMonitor:table:subjectId')"
|
||||||
show-overflow-tooltip
|
show-overflow-tooltip
|
||||||
/>
|
/>
|
||||||
<!-- 患者编号 -->
|
<!-- 患者编号 -->
|
||||||
<el-table-column
|
<el-table-column
|
||||||
prop="StudyCode"
|
prop="PatientList.PatientIdStr"
|
||||||
:label="$t('trials:uploadMonitor:table:subjectId')"
|
:label="$t('trials:uploadDicomList:table:pId')"
|
||||||
show-overflow-tooltip
|
show-overflow-tooltip
|
||||||
/>
|
>
|
||||||
|
<template slot-scope="scope">
|
||||||
|
<span
|
||||||
|
v-for="(item, index) in scope.row.PatientList"
|
||||||
|
:key="`${index}${item.PatientId}`"
|
||||||
|
>
|
||||||
|
{{
|
||||||
|
index === scope.row.PatientList.length - 1
|
||||||
|
? item.PatientIdStr
|
||||||
|
: `${item.PatientIdStr}, `
|
||||||
|
}}
|
||||||
|
</span>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
<!-- 患者姓名 -->
|
<!-- 患者姓名 -->
|
||||||
<el-table-column
|
<el-table-column
|
||||||
prop="StudyCode"
|
prop="SubjectShortName"
|
||||||
:label="$t('trials:uploadDicomList:table:patientName')"
|
:label="$t('trials:uploadDicomList:table:patientName')"
|
||||||
show-overflow-tooltip
|
show-overflow-tooltip
|
||||||
/>
|
/>
|
||||||
<!-- 性别 -->
|
<!-- 性别 -->
|
||||||
<el-table-column
|
<el-table-column
|
||||||
prop="StudyCode"
|
prop="SubjectSex"
|
||||||
:label="$t('trials:subject:table:gender')"
|
:label="$t('trials:subject:table:gender')"
|
||||||
show-overflow-tooltip
|
show-overflow-tooltip
|
||||||
/>
|
/>
|
||||||
<!-- 访视名称 -->
|
<!-- 访视名称 -->
|
||||||
<el-table-column
|
<el-table-column
|
||||||
prop="StudyCode"
|
prop="VisitName"
|
||||||
:label="$t('trials:uploadMonitor:table:visitName')"
|
:label="$t('trials:uploadMonitor:table:visitName')"
|
||||||
show-overflow-tooltip
|
show-overflow-tooltip
|
||||||
/>
|
/>
|
||||||
<!-- 数据收集 -->
|
<!-- 数据收集 -->
|
||||||
<el-table-column
|
<!-- <el-table-column
|
||||||
prop="StudyCode"
|
prop="StudyCode"
|
||||||
:label="$t('trials:crcUpload:table:dataCollected')"
|
:label="$t('trials:crcUpload:table:dataCollected')"
|
||||||
show-overflow-tooltip
|
show-overflow-tooltip
|
||||||
/>
|
/> -->
|
||||||
<!-- 最早拍片日期 -->
|
<!-- 最早拍片日期 -->
|
||||||
<el-table-column
|
<el-table-column
|
||||||
prop="StudyCode"
|
prop="VisitEarliestStudyTime"
|
||||||
:label="$t('trials:trials-panel:table:EarliestScanDate')"
|
:label="$t('trials:trials-panel:table:EarliestScanDate')"
|
||||||
show-overflow-tooltip
|
show-overflow-tooltip
|
||||||
sortable="custom"
|
sortable="custom"
|
||||||
/>
|
/>
|
||||||
<!-- 最晚拍片日期 -->
|
<!-- 最晚拍片日期 -->
|
||||||
<el-table-column
|
<el-table-column
|
||||||
prop="StudyCode"
|
prop="VisitLatestStudyTime"
|
||||||
:label="$t('trials:linkedRP:table:latestScanDate')"
|
:label="$t('trials:linkedRP:table:latestScanDate')"
|
||||||
show-overflow-tooltip
|
show-overflow-tooltip
|
||||||
sortable="custom"
|
sortable="custom"
|
||||||
/>
|
/>
|
||||||
<!-- 状态 -->
|
<!-- 状态 -->
|
||||||
<el-table-column
|
<el-table-column
|
||||||
prop="StudyCode"
|
prop="SubmitState"
|
||||||
:label="$t('trials:trials-list:table:status')"
|
:label="$t('trials:trials-list:table:status')"
|
||||||
show-overflow-tooltip
|
show-overflow-tooltip
|
||||||
sortable="custom"
|
sortable="custom"
|
||||||
/>
|
>
|
||||||
|
<template slot-scope="scope">
|
||||||
|
<el-tag v-if="scope.row.SubmitState * 1 === 0" type="warning">{{
|
||||||
|
$fd("SubmitState", scope.row.SubmitState * 1)
|
||||||
|
}}</el-tag>
|
||||||
|
<el-tag v-else-if="scope.row.SubmitState * 1 === 1" type="danger">{{
|
||||||
|
$fd("SubmitState", scope.row.SubmitState * 1)
|
||||||
|
}}</el-tag>
|
||||||
|
<el-tag v-else-if="scope.row.SubmitState * 1 === 2">{{
|
||||||
|
$fd("SubmitState", scope.row.SubmitState * 1)
|
||||||
|
}}</el-tag>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
<!-- 提交时间 -->
|
<!-- 提交时间 -->
|
||||||
<el-table-column
|
<el-table-column
|
||||||
prop="StudyCode"
|
prop="SubmitTime"
|
||||||
:label="$t('trials:crcUpload:table:submitTime')"
|
:label="$t('trials:crcUpload:table:submitTime')"
|
||||||
show-overflow-tooltip
|
show-overflow-tooltip
|
||||||
sortable="custom"
|
sortable="custom"
|
||||||
|
@ -177,41 +211,44 @@
|
||||||
<el-button
|
<el-button
|
||||||
type="text"
|
type="text"
|
||||||
v-hasPermi="['trials:trials-panel:hirVisit:edit']"
|
v-hasPermi="['trials:trials-panel:hirVisit:edit']"
|
||||||
@click="editStudy(scope.row)"
|
@click.stop="editStudy(scope.row)"
|
||||||
>{{ $t("trials:hirVisit:button:editStudy") }}</el-button
|
>{{ $t("trials:hirVisit:button:editStudy") }}</el-button
|
||||||
>
|
>
|
||||||
<!--提交-->
|
<!--提交-->
|
||||||
<el-button
|
<el-button
|
||||||
type="text"
|
type="text"
|
||||||
v-hasPermi="['trials:trials-panel:hirVisit:submit']"
|
v-hasPermi="['trials:trials-panel:hirVisit:submit']"
|
||||||
@click="submit(scope.row)"
|
@click.stop="submit(scope.row)"
|
||||||
>{{ $t("common:button:submit") }}</el-button
|
>{{ $t("common:button:submit") }}</el-button
|
||||||
>
|
>
|
||||||
<!--删除-->
|
<!--删除-->
|
||||||
<el-button
|
<el-button
|
||||||
type="text"
|
type="text"
|
||||||
v-hasPermi="['trials:trials-panel:hirVisit:remove']"
|
v-hasPermi="['trials:trials-panel:hirVisit:remove']"
|
||||||
@click="remove(scope.row)"
|
@click.stop="remove(scope.row)"
|
||||||
>{{ $t("common:button:delete") }}</el-button
|
>{{ $t("common:button:delete") }}</el-button
|
||||||
>
|
>
|
||||||
<!--评估结果-->
|
<!--评估结果-->
|
||||||
<el-button
|
<el-button
|
||||||
type="text"
|
type="text"
|
||||||
v-hasPermi="['trials:trials-panel:hirVisit:result']"
|
v-hasPermi="['trials:trials-panel:hirVisit:result']"
|
||||||
@click="result(scope.row)"
|
@click.stop="result(scope.row)"
|
||||||
>{{ $t("trials:adReview:title:result") }}</el-button
|
>{{ $t("trials:adReview:title:result") }}</el-button
|
||||||
>
|
>
|
||||||
<!--下载影像-->
|
<!--下载影像-->
|
||||||
<el-button
|
<el-button
|
||||||
type="text"
|
type="text"
|
||||||
v-hasPermi="['trials:trials-panel:hirVisit:download']"
|
v-hasPermi="['trials:trials-panel:hirVisit:download']"
|
||||||
@click="downloadImage(scope.row)"
|
@click.stop="downloadImage(scope.row)"
|
||||||
>{{ $t("trials:reading:button:uploadImages") }}</el-button
|
>{{ $t("trials:reading:button:uploadImages") }}</el-button
|
||||||
>
|
>
|
||||||
<!--下载医疗报告-->
|
<!--下载医疗报告-->
|
||||||
<el-button type="text" @click="downloadReport(scope.row)">{{
|
<el-button
|
||||||
$t("trials:reading:button:uploadReport")
|
type="text"
|
||||||
}}</el-button>
|
v-hasPermi="['trials:trials-panel:hirVisit:download']"
|
||||||
|
@click.stop="downloadReport(scope.row)"
|
||||||
|
>{{ $t("trials:reading:button:uploadReport") }}</el-button
|
||||||
|
>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
</el-table>
|
</el-table>
|
||||||
|
@ -233,13 +270,31 @@
|
||||||
import BaseContainer from "@/components/BaseContainer";
|
import BaseContainer from "@/components/BaseContainer";
|
||||||
import Pagination from "@/components/Pagination";
|
import Pagination from "@/components/Pagination";
|
||||||
import editStudyList from "./components/edit-study-list.vue";
|
import editStudyList from "./components/edit-study-list.vue";
|
||||||
|
import {
|
||||||
|
getPatientSubejctVisitList,
|
||||||
|
getSubjectImageZipInfo,
|
||||||
|
} from "@/api/trials/visit.js";
|
||||||
|
import JSZip from "jszip";
|
||||||
|
import axios from "axios";
|
||||||
|
import { saveAs } from "file-saver";
|
||||||
|
const defaultSearchData = () => {
|
||||||
|
return {
|
||||||
|
subjectCode: null,
|
||||||
|
subjectShortName: null,
|
||||||
|
subjectSex: null,
|
||||||
|
pageIndex: 1,
|
||||||
|
pageSize: 20,
|
||||||
|
asc: false,
|
||||||
|
sortField: "SubmitTime",
|
||||||
|
};
|
||||||
|
};
|
||||||
export default {
|
export default {
|
||||||
name: "hirVisit",
|
name: "hirVisit",
|
||||||
components: { BaseContainer, Pagination, editStudyList },
|
components: { BaseContainer, Pagination, editStudyList },
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
// 查询
|
// 查询
|
||||||
searchData: {},
|
searchData: defaultSearchData(),
|
||||||
visitOptions: [],
|
visitOptions: [],
|
||||||
// 列表
|
// 列表
|
||||||
list: [
|
list: [
|
||||||
|
@ -253,15 +308,47 @@ export default {
|
||||||
editStudyVisible: false,
|
editStudyVisible: false,
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
created() {
|
||||||
|
this.getList();
|
||||||
|
},
|
||||||
methods: {
|
methods: {
|
||||||
// 查询
|
// 查询
|
||||||
handleSearch() {},
|
handleSearch() {
|
||||||
|
this.getList();
|
||||||
|
},
|
||||||
// 重置
|
// 重置
|
||||||
handleSearch() {},
|
handleReset() {
|
||||||
|
this.searchData = defaultSearchData();
|
||||||
|
this.getList();
|
||||||
|
},
|
||||||
// 排序
|
// 排序
|
||||||
handleSortByColumn() {},
|
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();
|
||||||
|
},
|
||||||
// 获取列表
|
// 获取列表
|
||||||
getList() {},
|
async getList() {
|
||||||
|
let data = {};
|
||||||
|
Object.keys(this.searchData).forEach((key) => {
|
||||||
|
data[key] = this.searchData[key];
|
||||||
|
});
|
||||||
|
data.TrialId = this.$route.query.trialId;
|
||||||
|
try {
|
||||||
|
this.loading = true;
|
||||||
|
let res = await getPatientSubejctVisitList(data);
|
||||||
|
this.loading = false;
|
||||||
|
if (res.IsSuccess) {
|
||||||
|
this.list = res.Result.CurrentPageData;
|
||||||
|
this.total = res.Result.TotalCount;
|
||||||
|
}
|
||||||
|
} catch (err) {
|
||||||
|
this.loading = false;
|
||||||
|
console.log(err);
|
||||||
|
}
|
||||||
|
},
|
||||||
// 修改检查
|
// 修改检查
|
||||||
editStudy(item) {
|
editStudy(item) {
|
||||||
this.editStudyVisible = true;
|
this.editStudyVisible = true;
|
||||||
|
@ -272,10 +359,109 @@ export default {
|
||||||
remove() {},
|
remove() {},
|
||||||
// 评估结果
|
// 评估结果
|
||||||
result() {},
|
result() {},
|
||||||
// 下载影像
|
|
||||||
downloadImage() {},
|
|
||||||
// 下载报告
|
// 下载报告
|
||||||
downloadReport() {},
|
downloadReport() {},
|
||||||
|
// 下载影像
|
||||||
|
async downloadImage(item) {
|
||||||
|
try {
|
||||||
|
let res = await getSubjectImageZipInfo(item.SubjectId);
|
||||||
|
if (res.IsSuccess) {
|
||||||
|
let item = res.Result;
|
||||||
|
await this.setfolder(item);
|
||||||
|
}
|
||||||
|
} catch (err) {
|
||||||
|
console.log(err);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
async setfolder(item) {
|
||||||
|
const zip = new JSZip(); // 创建实例对象
|
||||||
|
let zipObj = {};
|
||||||
|
const promises = [];
|
||||||
|
for (let patient of item.PatientList) {
|
||||||
|
if (!zipObj[patient.PatientIdStr]) {
|
||||||
|
zipObj[patient.PatientIdStr] = zip.folder(patient.PatientIdStr);
|
||||||
|
console.log(zipObj[patient.PatientIdStr]);
|
||||||
|
}
|
||||||
|
for (let visit of patient.VisitList) {
|
||||||
|
for (let study of visit.StudyList) {
|
||||||
|
let date = study.StudyTime.split(" ")[0];
|
||||||
|
if (!zipObj[`${patient.PatientIdStr}${date}`]) {
|
||||||
|
zipObj[`${patient.PatientIdStr}${date}`] =
|
||||||
|
zipObj[patient.PatientIdStr].folder(date);
|
||||||
|
}
|
||||||
|
for (let series of study.SeriesList) {
|
||||||
|
if (!zipObj[`${patient.PatientIdStr}${date}${series.Modality}`]) {
|
||||||
|
zipObj[`${patient.PatientIdStr}${date}${series.Modality}`] =
|
||||||
|
zipObj[`${patient.PatientIdStr}${date}`].folder(
|
||||||
|
series.Modality
|
||||||
|
);
|
||||||
|
}
|
||||||
|
for (let instance of series.InstancePathList) {
|
||||||
|
let obj = {
|
||||||
|
subjectCode: item.SubjectCode,
|
||||||
|
patientIdStr: patient.PatientIdStr,
|
||||||
|
visitName: visit.VisitName,
|
||||||
|
date: study.StudyTime.split(" ")[0],
|
||||||
|
modality: series.Modality,
|
||||||
|
instancePath: instance.Path,
|
||||||
|
dicomName: instance.Path.split("/Dicom/")[1],
|
||||||
|
};
|
||||||
|
const promise = this.handleBatchDown(
|
||||||
|
obj,
|
||||||
|
zipObj[`${patient.PatientIdStr}${date}${series.Modality}`]
|
||||||
|
);
|
||||||
|
promises.push(promise);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 生成 zip 文件
|
||||||
|
Promise.all(promises)
|
||||||
|
.then(() => {
|
||||||
|
// 生成zip 文件
|
||||||
|
zip
|
||||||
|
.generateAsync({
|
||||||
|
type: "blob",
|
||||||
|
compression: "DEFLATE", // STORE: 默认不压缩, DEFLATE:需要压缩
|
||||||
|
compressionOptions: {
|
||||||
|
level: 9, // 压缩等级 1~9 1 压缩速度最快, 9 最优压缩方式
|
||||||
|
},
|
||||||
|
})
|
||||||
|
.then((res) => {
|
||||||
|
saveAs(res, item.SubjectCode + new Date().getTime() + "_CV.zip"); // 使用FileSaver.saveAs保存文件,文件名可自定义
|
||||||
|
zipObj = null;
|
||||||
|
});
|
||||||
|
})
|
||||||
|
.catch((reason) => {});
|
||||||
|
},
|
||||||
|
async handleBatchDown(item, zip) {
|
||||||
|
return new Promise((resolve) => {
|
||||||
|
let path = `/${item.subjectCode}_${item.patientIdStr}/${item.visitName}/${item.date}_${item.modality}${item.instancePath}`;
|
||||||
|
this.getFileData(
|
||||||
|
this.OSSclientConfig.basePath + path
|
||||||
|
// "https://th.bing.com/th/id/OIP.duz6S7Fvygrqd6Yj_DcXAQHaF7?rs=1&pid=ImgDetMain"
|
||||||
|
).then((res) => {
|
||||||
|
const fileName = item.dicomName + ".dcm";
|
||||||
|
zip.file(fileName, res.data, { binary: true });
|
||||||
|
resolve();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
},
|
||||||
|
getFileData(fileUrl) {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
axios(fileUrl, {
|
||||||
|
method: "GET",
|
||||||
|
responseType: "blob", // 返回的数据会被强制转为blob类型 ,转换成arraybuffer 也行
|
||||||
|
})
|
||||||
|
.then((res) => {
|
||||||
|
resolve(res);
|
||||||
|
})
|
||||||
|
.catch((error) => {
|
||||||
|
reject(error);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|
Loading…
Reference in New Issue