hir_web/src/views/trials/trials-inspection/components/view-study-list.vue

442 lines
17 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<template>
<el-dialog :visible.sync="visible" :close-on-click-modal="false" :fullscreen="true" custom-class="upload-dialog"
:before-close="beforeCloseStudyDig">
<span slot="title" v-if="!isAll">{{ $t('trials:inspection:message:viewStudy') }}{{
$t('trials:uploadDicomList:table:patientInfo')
}}{{ Patient.PatientIdStr }}{{ Patient.PatientName }}</span>
<div class="search">
<el-form :inline="true" class="base-search-form">
<template v-if="isAll">
<!-- 患者ID/患者姓名 -->
<el-form-item :label="$t('trials:uploadDicomList:table:pId')">
<el-input v-model="searchData.PatientIdStr" style="width: 100px" clearable />
</el-form-item>
<el-form-item :label="$t('trials:uploadDicomList:table:patientName')">
<el-input v-model="searchData.PatientName" style="width: 100px" clearable />
</el-form-item>
<!-- Called AE -->
<el-form-item class="my_multiple" :label="$t('trials:inspection:search:CalledAE')">
<el-select v-model="searchData.CalledAEList" clearable multiple style="width: 140px">
<el-option v-for="(item, index) of calledAeList" :key="index" :label="item" :value="item">
</el-option>
</el-select>
</el-form-item>
<!-- Calling AE -->
<el-form-item class="my_multiple" :label="$t('trials:inspection:search:CallingAE')">
<el-select v-model="searchData.callingAE" clearable style="width: 140px">
<el-option v-for="(item, index) of callingAeList" :key="index" :label="item" :value="item">
</el-option>
</el-select>
</el-form-item>
<!-- 课题组 -->
<el-form-item :label="$t('trials:trials-myinfo:form:StudyHospitalGroupList')">
<el-select v-model="searchData.HospitalGroupIdList" clearable multiple style="width: 140px">
<el-option v-for="(item) of hospitalGroupList" :key="item.Id" :label="item.Name" :value="item.Id">
</el-option>
</el-select>
</el-form-item>
</template>
<!-- 检查类型 -->
<el-form-item :label="$t('trials:audit: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:uploadedDicoms:table:studyDate')">
<el-date-picker v-model="dateValue" type="datetimerange" range-separator="-"
:start-placeholder="$t('trials:uploadClinicalData:table:beginDate')"
:end-placeholder="$t('trials:uploadClinicalData:table:endDate')" :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-button type="primary" v-hasPermi="['trials:trialsInspection:addGroup']" v-if="!isAll"
:disabled="multipleSelection.length <= 0" @click="openGroup({})">
{{ $t('trials:inspection:button:checkGroupId') }}
</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' }"
@selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" v-if="hasPermi(['trials:trialsInspection:editGroup']) && !isAll" />
<el-table-column type="index" width="40" v-else />
<template v-if="isAll">
<!--患者ID-->
<el-table-column prop="PatientIdStr" :label="$t('trials:uploadDicomList:table:pId')" show-overflow-tooltip
min-width="120" sortable="custom"></el-table-column>
<!--患者姓名-->
<el-table-column prop="PatientName" :label="$t('trials:uploadDicomList:table:patientName')"
show-overflow-tooltip min-width="120" sortable="custom"></el-table-column>
<!--出生日期-->
<el-table-column prop="PatientBirthDate" :label="$t('trials:inspection:table:birthdate')" show-overflow-tooltip
min-width="120" sortable="custom"></el-table-column>
<!--性别-->
<el-table-column prop="PatientSex" :label="$t('trials:trials-myinfo:form:gender')" show-overflow-tooltip
min-width="100" sortable="custom">
<template slot-scope="scope">
<span>{{ $fd('Sex', scope.row.PatientSex) }}</span>
</template>
</el-table-column>
</template>
<!--检查申请号-->
<el-table-column align="center" prop="AccessionNumber" :label="$t('trials:inspection:table:AccessionNumber')"
show-overflow-tooltip min-width="120" sortable="custom"></el-table-column>
<!--检查描述-->
<el-table-column align="center" prop="Description" :label="$t('trials:inspection:table:studyDescription')"
show-overflow-tooltip min-width="120" sortable="custom"></el-table-column>
<!--检查类型-->
<el-table-column align="center" prop="Modalities" :label="$t('trials:audit:table:modality')" show-overflow-tooltip
min-width="120" sortable="custom"></el-table-column>
<!--Called AE-->
<el-table-column prop="CalledAE" :label="$t('trials:inspection:table:CalledAE')" show-overflow-tooltip
min-width="120">
</el-table-column>
<!--Calling AE-->
<el-table-column prop="CallingAE" :label="$t('trials:inspection:table:CallingAE')" show-overflow-tooltip
min-width="120">
</el-table-column>
<!--课题组-->
<el-table-column prop="HospitalGroupList" :label="$t('trials:inspection:table:ViewHospitalGroupList')"
show-overflow-tooltip min-width="100">
<template slot-scope="scope">
<span>{{
scope.row.ViewHospitalGroupList && scope.row.ViewHospitalGroupList.length > 0 ?
scope.row.ViewHospitalGroupList.map(item => item.Name).join(', ') : ''}}</span>
</template>
</el-table-column>
<!--序列数量-->
<el-table-column align="center" prop="SeriesCount" :label="$t('trials:audit:table:seriesCount')"
show-overflow-tooltip min-width="100" sortable="custom"></el-table-column>
<!--图像数量-->
<el-table-column align="center" prop="InstanceCount" :label="$t('trials:audit:table:instanceCount')"
show-overflow-tooltip min-width="100" sortable="custom"></el-table-column>
<!--检查日期-->
<el-table-column align="center" prop="StudyTime" :label="$t('trials:audit:table:studyDate')" show-overflow-tooltip
min-width="180" sortable="custom"></el-table-column>
<!--操作-->
<el-table-column :label="$t('common:action:action')" min-width="200" fixed="right">
<template slot-scope="scope">
<!-- 影像 -->
<el-button circle icon="el-icon-view" :title="$t('trials:inspection:button:image')"
@click.stop="image(scope.row)" />
<!-- 修改课题组 -->
<el-button circle icon="el-icon-edit-outline" :title="$t('trials:inspection:button:editGroup')" v-if="!isAll"
v-hasPermi="['trials:trialsInspection:editGroup']" @click.stop="openGroup(scope.row, 3)" />
<!--删除-->
<el-button circle v-hasPermi="['trials:trialsInspection:delStudy']" icon="el-icon-delete" v-if="!isAll"
:title="$t('trials:inspection:button:delete')" @click.stop="deletePatientStudy(scope.row)" />
<!-- 诊断报告 -->
<el-button circle icon="el-icon-document" @click.stop="report(scope.row)"
:title="$t('trials:inspection:button:diagnosticReport')" disabled />
</template>
</el-table-column>
</el-table>
<!-- 分页组件 -->
<pagination class="page" :total="total" :page.sync="searchData.PageIndex" :limit.sync="searchData.PageSize"
@pagination="getList" />
<base-model v-if="group_model.visible" :config="group_model">
<template slot="dialog-body">
<el-form ref="groupFrom" :model="form" :rules="rules" label-width="100px" size="small">
<el-form-item :label="$t('trials:externalStaff:table:lastName')" prop="LastName" v-show="false">
<el-input clearable />
</el-form-item>
<!-- 用户类型 -->
<el-form-item :label="$t('trials:externalStaff:table:hospitalGroupIdList')" prop="HospitalGroupIdList">
<el-select v-model="form.HospitalGroupIdList" style="width: 100%" multiple clearable>
<el-option v-for="item of hospitalGroupList" :key="item.Id" :label="item.Name" :value="item.Id">
<!-- <span>{{ item.UserType }}</span> -->
</el-option>
</el-select>
</el-form-item>
</el-form>
</template>
<template slot="dialog-footer">
<!-- 取消 -->
<el-button size="small" type="primary" :disabled="btnLoading" @click="handleCancelGroup">
{{ $t("common:button:cancel") }}
</el-button>
<!-- 保存 -->
<el-button size="small" type="primary" :loading="btnLoading" @click="handleSaveGroup">
{{ $t("common:button:save") }}
</el-button>
</template>
</base-model>
</el-dialog>
</template>
<script>
import Pagination from '@/components/Pagination'
import { getPatientStudyList, deletePatientStudy } from '@/api/inspection.js'
import { modifySCPStudyHospitalGroup, getHospitalGroupList } from '@/api/admin.js'
import { getToken } from '@/utils/auth'
import BaseModel from '@/components/BaseModel'
const defaultSearchData = () => {
return {
PatientIdStr: null,
PatientName: null,
CalledAEList: [],
callingAE: null,
ExperimentName: null,
HospitalGroupIdList: [],
Modalities: null,
EarliestStudyTime: null,
LatestStudyTime: null,
PatientId: null,
Asc: false,
SortField: 'StudyTime',
PageIndex: 1,
PageSize: 20,
}
}
export default {
name: 'viewStudyList',
components: { Pagination, BaseModel },
props: {
visible: {
required: true,
default: false,
},
Patient: {
required: true,
default: () => {
return {}
},
},
isAll: {
required: true,
default: false,
},
calledAeList: {
type: Array,
default: () => {
return []
},
},
callingAeList: {
type: Array,
default: () => {
return []
},
},
hospitalGroupList: {
type: Array,
default: () => {
return []
},
},
},
data() {
return {
// 查询
searchData: defaultSearchData(),
dateValue: [],
// 可加入项目列表
loading: false,
list: [],
total: 0,
multipleSelection: [],
group_model: {
visible: false,
title: this.$t('trials:inspection:dialogTitle:add'),
width: '400px',
appendToBody: true
},
form: {
HospitalGroupIdList: [],
},
rules: {
HospitalGroupIdList: [
{
required: true,
type: "array",
message: this.$t('common:ruleMessage:specify'),
trigger: ['blur', 'change']
}
]
},
btnLoading: false,
hospitalGroupList: [],
groupStatus: 1,
currentData: {}
}
},
created() {
this.getList()
},
methods: {
async getHospitalGroupList() {
try {
let res = await getHospitalGroupList({})
if (res.IsSuccess) {
this.hospitalGroupList = res.Result
}
} catch (err) {
console.log(err)
}
},
openGroup(row, status = 1) {
this.form.HospitalGroupIdList = []
this.group_model.title = this.$t('trials:inspection:dialogTitle:add')
if (row.ViewHospitalGroupList && row.ViewHospitalGroupList.length > 0) {
this.form.HospitalGroupIdList = row.ViewHospitalGroupList.map(item => item.Id)
this.group_model.title = this.$t('trials:inspection:dialogTitle:edit')
}
this.currentData = row
this.groupStatus = status
this.getHospitalGroupList()
this.group_model.visible = true
},
handleCancelGroup() {
this.form.HospitalGroupIdList = []
this.groupStatus = 1
this.group_model.visible = false
},
async handleSaveGroup() {
try {
let validate = await this.$refs.groupFrom.validate()
if (!validate) return false
let ScPstudyIdList = []
if (this.groupStatus === 1) {
if (this.multipleSelection.length <= 0) return false
ScPstudyIdList = this.multipleSelection.map(item => item.SCPStudyId)
} else {
ScPstudyIdList = [this.currentData.SCPStudyId]
}
let data = {
ScPstudyIdList,
AddOrDelete: this.groupStatus,
HospitalGroupIdList: this.form.HospitalGroupIdList
}
this.btnLoading = true
let res = await modifySCPStudyHospitalGroup(data)
this.btnLoading = false
if (res.IsSuccess) {
this.$message.success(this.$t('common:message:savedSuccessfully'))
this.handleCancelGroup()
this.getList()
}
} catch (err) {
console.log(err)
this.btnLoading = false
}
},
handleSelectionChange(val) {
this.multipleSelection = val;
},
// 删除检查
async deletePatientStudy(item) {
try {
let confirm = await this.$confirm(
this.$t('trials:inspection:message:remove'),
{
type: 'warning',
distinguishCancelAndClose: true,
confirmButtonText: this.$t('common:button:confirm'),
cancelButtonText: this.$t('common:button:cancel'),
}
)
if (confirm !== 'confirm') return
let params = {
PatiendId: item.PatientId,
ScpStudyId: item.SCPStudyId,
}
let res = await deletePatientStudy(params)
if (res.IsSuccess) {
this.getList()
this.$emit('getList')
this.$message.success(this.$t('common:message:deletedSuccessfully'))
}
} catch (err) {
console.log(err)
}
},
// 关闭弹框
beforeCloseStudyDig() {
this.$setOpenWindow()
this.$emit('update:visible', false)
},
// 获取列表
async getList() {
let data = {}
Object.keys(this.searchData).forEach((key) => {
data[key] = this.searchData[key]
})
if (!this.isAll) {
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.CurrentPageData
this.total = res.Result.TotalCount
}
} 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`,
})
let newWindow = window.open(routeData.href, '_blank')
this.$setOpenWindow(newWindow)
},
// 查看报告
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>