新增及修改页面

main
wangxiaoshuang 2024-03-22 17:53:50 +08:00
parent eb7b60e605
commit 06883d2e86
21 changed files with 3638 additions and 2075 deletions

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" :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 || (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 || (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>

View File

@ -120,7 +120,10 @@
<el-table-column
label="Action"
width="150"
v-if="hasPermi(['system:hospital:edit', 'system:hospital:del'])"
v-if="
hasPermi(['system:hospital:edit']) ||
hasPermi(['system:hospital:del'])
"
>
<template slot-scope="scope">
<el-button

View File

@ -1,11 +1,11 @@
<template>
<div style="display: flex;justify-content: center">
<div style="width: 640px;text-align: center;border: 1px solid #e6e6e6;margin-top:40px;padding:10px;padding-right:40px;">
<div style="width: 640px;text-align: center;border: 1px solid #e6e6e6;margin-top:40px;padding:10px;">
<div class="trial-myinfo-head" style="font-size: 30px;line-height: 120px;">
<!-- 首次登录修改密码 -->
{{ $t('recompose:title:init') }}
</div>
<el-form ref="passwordForm" v-loading="loading" label-position="right" :model="password" :rules="passwordFormRules" label-width="120px">
<el-form ref="passwordForm" v-loading="loading" label-position="right" :model="password" :rules="passwordFormRules" label-width="180px">
<!-- 邮箱 -->
<el-form-item :label="$t('recompose:form:email')" prop="Email">
<el-input v-model="password.Email" disabled />
@ -18,15 +18,6 @@
<el-form-item :label="$t('recompose:form:userName')" prop="NewUserName">
<el-input v-model="password.NewUserName" />
</el-form-item>
<!-- 校验码 -->
<el-form-item :label="$t('trials:researchForm:form:checkCode')" prop="NewUserName" style="position: relative">
<el-input v-model="password.NewUserName" :disabled="password.NewUserName"/>
<span style="position: absolute;right: -30px">
<el-tooltip :content="$t('passwordReset:form:passwordCentent')" placement="top">
<i class="el-icon-question" />
</el-tooltip>
</span>
</el-form-item>
<!-- 新密码 -->
<el-form-item class="my_new_pwd" :label="$t('recompose:form:newPassword')" prop="NewPassWord">
<el-input v-model="password.NewPassWord" type="password" show-password auto-complete="new-password" />

View File

@ -46,7 +46,7 @@
</template>
</el-table-column>
<el-table-column fixed="right" label="Action" min-width="200">
<template slot-scope="scope" min-width="130">
<template slot-scope="scope">
<el-button size="small" type="text" @click="handleEdit(scope.$index,scope.row)">Edit</el-button>
<el-button size="small" type="text" @click="handleDelete(scope.$index,scope.row)">Delete</el-button>
</template>

View File

@ -18,8 +18,8 @@
</el-form-item>
<!-- 邮箱 -->
<el-form-item :label="$t('passwordReset:form:email')" prop="EmailOrPhone">
<el-input v-model="form.EmailOrPhone" autocomplete="off" @change="handleEmailChange" />
<!-- <el-col :span="18">
<!-- <el-input v-model="form.EmailOrPhone" autocomplete="off" @change="handleEmailChange" /> -->
<el-col :span="18">
<el-input v-model="form.EmailOrPhone" autocomplete="off" @change="handleEmailChange" />
</el-col>
<el-col :span="6" style="text-align:right;">
@ -29,8 +29,8 @@
style="width:80%;"
:disabled="sendDisabled"
@click="handleSendCode"
>{{ sendTitle }}</el-button> -->
<!-- </el-col> -->
>{{ sendTitle }}</el-button>
</el-col>
</el-form-item>
<!-- 验证码 -->
<el-form-item :label="$t('trials:researchForm:form:checkCode')" required>

View File

@ -6,17 +6,17 @@
<div class="login-body">
<div class="login-l">
<div class="login-logo">
<img v-if="language === 'zh'" src="@/assets/zzlogo2.png" alt="">
<img v-else src="@/assets/zzlogo3.png" alt="">
<img v-if="language === 'zh'" src="@/assets/zzlogo2.png" alt="" />
<img v-else src="@/assets/zzlogo3.png" alt="" />
</div>
<div class="login-image">
<img src="@/assets/login-bg.png">
<img src="@/assets/login-bg.png" />
</div>
</div>
<div class="login-r">
<div class="title-container">
<!-- IRC Management System -->
<div class="title">{{ $t('login:title:system') }}</div>
<div class="title">{{ $t("login:title:system") }}</div>
</div>
<el-form
ref="loginForm"
@ -26,11 +26,14 @@
auto-complete="on"
label-position="left"
>
<el-form-item
prop="username"
:rules="[
{ required: true, message: this.$t('login:formRule:userName'), trigger: 'blur' }
{
required: true,
message: this.$t('login:formRule:userName'),
trigger: 'blur',
},
]"
>
<span class="svg-container">
@ -51,7 +54,11 @@
<el-form-item
prop="password"
:rules="[
{ required: true, message: this.$t('login:formRule:password'), trigger: 'blur' }
{
required: true,
message: this.$t('login:formRule:password'),
trigger: 'blur',
},
]"
>
<span class="svg-container">
@ -70,23 +77,29 @@
@keyup.enter.native="handleLogin"
/>
<span class="show-pwd" @click="showPwd">
<svg-icon :icon-class="passwordType === 'password' ? 'eye' : 'eye-open'" />
<svg-icon
:icon-class="passwordType === 'password' ? 'eye' : 'eye-open'"
/>
</span>
</el-form-item>
<!-- Login -->
<el-button
:loading="loading"
type="primary"
style="width:100%;margin-bottom:10px;"
style="width: 100%; margin-bottom: 10px"
size="medium"
@click.native.prevent="handleLogin"
>
{{ $t('login:button:login') }}
{{ $t("login:button:login") }}
</el-button>
<div style="text-align: right;">
<div style="text-align: right">
<!-- Forget password? -->
<el-button type="text" size="medium" @click.native.prevent="handleResetPwd">
{{ $t('login:button:forgetPassword') }}
<el-button
type="text"
size="medium"
@click.native.prevent="handleResetPwd"
>
{{ $t("login:button:forgetPassword") }}
</el-button>
</div>
</el-form>
@ -96,41 +109,50 @@
<span>Copyright © 2023 上海展影医疗科技有限公司 版权所有</span>
<span> | </span>
<a target="_blank" href="https://beian.miit.gov.cn/">
<span>
沪ICP备2021037850-2
</span>
<span> 沪ICP备2021037850-2 </span>
</a>
<span> | </span>
<a target="_blank" href="http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=31011002005859">
<img src="@/assets/filing.png">
<a
target="_blank"
href="http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=31011002005859"
>
<img src="@/assets/filing.png" />
<span>沪公网安备 31011002005859</span>
</a>
</div>
<Vcode :show="isShow" slider-text="" :imgs="[Img1]" @success="onSuccess" />
<Vcode
:show="isShow"
slider-text="拖到滑块完成验证"
:imgs="[Img1]"
@success="onSuccess"
/>
</div>
</template>
<script>
import { mapGetters, mapMutations } from 'vuex'
import TopLang from './topLang'
import { mapGetters, mapMutations } from "vuex";
import TopLang from "./topLang";
// import NoticeMarquee from '../trials/trials-layout/components/noticeMarquee'
import Vcode from 'vue-puzzle-vcode'
import Img1 from '@/assets/pic-1.png'
import Vcode from "vue-puzzle-vcode";
import Img1 from "@/assets/pic-1.png";
export default {
name: 'Login',
name: "Login",
components: { TopLang, Vcode },
data() {
return {
VUE_APP_OSS_CONFIG_REGION: process.env.VUE_APP_OSS_CONFIG_REGION,
loginForm: {
username: '',
password: ''
username: "",
password: "",
},
loginRules: {
username: [
{ required: true, message: this.$t('login:formRule:userName'), trigger: 'blur' },
{ max: 20, message: `${this.$t('common:ruleMessage:maxLength')} 20` }
{
required: true,
message: this.$t("login:formRule:userName"),
trigger: "blur",
},
{ max: 20, message: `${this.$t("common:ruleMessage:maxLength")} 20` },
],
password: [
// {
@ -138,119 +160,123 @@ export default {
// trigger: "blur",
// validator: this.$validatePassword
// },
{ required: true, message: this.$t('login:formRule:password'), trigger: 'blur' },
{ max: 20, message: `${this.$t('common:ruleMessage:maxLength')} 20` }
]
{
required: true,
message: this.$t("login:formRule:password"),
trigger: "blur",
},
{ max: 20, message: `${this.$t("common:ruleMessage:maxLength")} 20` },
],
},
loading: false,
passwordType: 'password',
passwordType: "password",
loginType: null,
location: null,
isShow: false,
Img1
}
Img1,
};
},
computed: {
...mapGetters([
'asyncRoutes',
'routes',
'language'
])
...mapGetters(["asyncRoutes", "routes", "language"]),
},
mounted() {
this.loginType = this.$route.query.loginType
this.location = this.$route.query.location
zzSessionStorage.setItem('loginType', this.loginType)
localStorage.setItem('location', this.location)
if (process.env.VUE_APP_OSS_CONFIG_REGION === 'oss-us-west-1') {
this.$i18n.locale = 'en'
this.setLanguage('en')
this.$updateDictionary()
this.loginType = this.$route.query.loginType;
this.location = this.$route.query.location;
zzSessionStorage.setItem("loginType", this.loginType);
localStorage.setItem("location", this.location);
if (process.env.VUE_APP_OSS_CONFIG_REGION === "oss-us-west-1") {
this.$i18n.locale = "en";
this.setLanguage("en");
this.$updateDictionary();
} else {
if (this.location === 'USA') {
this.$i18n.locale = 'en'
this.setLanguage('en')
this.$updateDictionary()
if (this.location === "USA") {
this.$i18n.locale = "en";
this.setLanguage("en");
this.$updateDictionary();
} else {
this.$i18n.locale = 'zh'
this.setLanguage('zh')
this.$updateDictionary()
this.$i18n.locale = "zh";
this.setLanguage("zh");
this.$updateDictionary();
}
}
},
methods: {
...mapMutations({ setLanguage: 'lang/setLanguage' }),
...mapMutations({ setLanguage: "lang/setLanguage" }),
showPwd() {
if (this.passwordType === 'password') {
this.passwordType = ''
if (this.passwordType === "password") {
this.passwordType = "";
} else {
this.passwordType = 'password'
this.passwordType = "password";
}
this.$nextTick(() => {
this.$refs.password.focus()
})
this.$refs.password.focus();
});
},
handleLogin() {
this.loginType = this.$route.query.loginType
this.$refs.loginForm.validate(valid => {
this.loginType = this.$route.query.loginType;
this.$refs.loginForm.validate((valid) => {
if (valid) {
// this.isShow = true
this.loginIn()
this.loginIn();
} else {
return false
return false;
}
})
});
},
loginIn() {
this.loading = true
this.$store.dispatch('user/login', this.loginForm).then((res) => {
if (!res) {
// ,
this.$message.success(this.$t('login:message:login1'))
setTimeout(() => {
this.$router.push({ path: `/recompose?userName=${this.loginForm.username}` })
}, 500)
return
}
this.$store.dispatch('permission/generateRoutes').then(res => {
this.loading = false
if (res && res.length > 0) {
this.$store.dispatch('global/getNoticeList')
this.$router.addRoutes(res)
if (this.loginType === 'DevOps') {
this.$router.replace({ path: res[0].path })
return
}
if (this.hasPermi(['role:radmin'])) {
this.$router.replace({ path: res[0].path })
return
}
if (this.hasPermi(['role:pm', 'role:crc', 'role:crc'])) {
this.$router.replace({ path: '/trials/trials-inspection' })
}else if(this.hasPermi(['role:oa'])){
this.$router.replace({ path: '/system' })
} else {
this.$router.replace({ path: '/trials' })
}
} else {
//
this.$message.warning(this.$t('login:message:login2'))
this.loading = true;
this.$store
.dispatch("user/login", this.loginForm)
.then((res) => {
if (!res) {
// ,
this.$message.success(this.$t("login:message:login1"));
setTimeout(() => {
this.$router.push({
path: `/recompose?userName=${this.loginForm.username}`,
});
}, 500);
return;
}
this.$store.dispatch("permission/generateRoutes").then((res) => {
this.loading = false;
if (res && res.length > 0) {
this.$store.dispatch("global/getNoticeList");
this.$router.addRoutes(res);
if (this.loginType === "DevOps") {
this.$router.replace({ path: res[0].path });
return;
}
if (this.hasPermi(["role:radmin"])) {
this.$router.replace({ path: res[0].path });
return;
}
if (this.hasPermi(["role:pm"])) {
this.$router.replace({ path: "/trials/trials-inspection" });
} else if (this.hasPermi(["role:oa"])) {
this.$router.replace({ path: "/system" });
} else {
this.$router.replace({ path: "/trials" });
}
} else {
//
this.$message.warning(this.$t("login:message:login2"));
}
});
})
})
.catch(() => {
this.loading = false
})
this.loading = false;
});
},
onSuccess() {
this.isShow = false
this.loginIn()
this.isShow = false;
this.loginIn();
},
handleResetPwd() {
this.$router.push({ name: 'Resetpassword' })
}
}
}
this.$router.push({ name: "Resetpassword" });
},
},
};
</script>
<style lang="scss">
@ -300,9 +326,9 @@ $cursor: #fff;
</style>
<style lang="scss" scoped>
$bg:#2d3a4b;
$dark_gray:#889aa4;
$light_gray:#606266;
$bg: #2d3a4b;
$dark_gray: #889aa4;
$light_gray: #606266;
.login-container {
position: relative;
width: 100%;
@ -321,7 +347,7 @@ $light_gray:#606266;
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%,-50%);
transform: translate(-50%, -50%);
// margin-top: -230px;
// margin-left: -400px;
width: 1200px;
@ -335,25 +361,24 @@ $light_gray:#606266;
float: left;
width: 50%;
height: 100%;
.login-logo{
.login-logo {
position: absolute;
top:35px;
top: 35px;
left: 50px;
img{
img {
height: 40px;
}
}
.login-image{
.login-image {
position: absolute;
top:10px;
top: 10px;
left: 0px;
// transform: translateY(-50%);
height: 100%;
img {
height: 100%;
height: 100%;
}
}
}
}
.login-r {
position: relative;
@ -366,12 +391,11 @@ $light_gray:#606266;
top: 50%;
// transform: translateY(-50%);
left: 50%;
transform:translate(-50%,-50%);
transform: translate(-50%, -50%);
width: 80%;
padding: 10px;
margin: 0 auto;
overflow: hidden;
}
.title-container {
// margin-bottom: 50px;
@ -415,7 +439,7 @@ $light_gray:#606266;
}
}
}
.login-footer{
.login-footer {
position: absolute;
bottom: 50px;
left: 0px;
@ -428,21 +452,20 @@ $light_gray:#606266;
align-items: center;
// color: rgb(180, 190, 199);
color: #909399;
a{
display:inline-block;
text-decoration:none;
height:20px;
line-height:20px;
a {
display: inline-block;
text-decoration: none;
height: 20px;
line-height: 20px;
display: flex;
justify-content: center;
}
span{
span {
margin: 0 2px;
}
img{
height:20px;
line-height:20px;
img {
height: 20px;
line-height: 20px;
}
// p{
// display: inline-block;
@ -453,5 +476,4 @@ $light_gray:#606266;
// }
}
}
</style>

View File

@ -0,0 +1,100 @@
<template>
<el-dialog
:visible.sync="visible"
:close-on-click-modal="false"
:title="title"
width="500px"
custom-class="base-dialog-wrapper"
append-to-body
>
<el-form
ref="editVisitForm"
:model="form"
:rules="rules"
size="small"
label-width="100px"
>
<div class="base-dialog-body">
<!--AE Title-->
<el-form-item label="AE Title" prop="calledAE">
<el-input v-model="form.calledAE" />
</el-form-item>
<!--IP-->
<el-form-item label="IP" prop="ip">
<el-input v-model="form.ip" />
</el-form-item>
<!--Port-->
<el-form-item label="Port" prop="port">
<el-input v-model="form.port" type="number" />
</el-form-item>
<!--Modality-->
<el-form-item label="Modality" prop="modality">
<el-input v-model="form.modality" />
</el-form-item>
<!--Description-->
<el-form-item label="Description" prop="description">
<el-input v-model="form.description" />
</el-form-item>
</div>
<div
class="base-dialog-footer"
style="text-align: right; margin-top: 10px"
>
<el-form-item style="text-align: right">
<el-button
size="small"
type="primary"
:disabled="btnLoading"
@click="handleCancel"
>
{{ $t("common:button:cancel") }}
</el-button>
<el-button
size="small"
type="primary"
:loading="btnLoading"
@click="handleSave"
>
{{ $t("common:button:save") }}
</el-button>
</el-form-item>
</div>
</el-form>
</el-dialog>
</template>
<script>
export default {
name: "editDicom",
props: {
visible: {
require: true,
default: false,
},
title: {
require: true,
default: "",
},
dicom: {
type: Object,
default: {},
},
},
data() {
return {
form: {},
rules: {
calledAE: [
{ required: true, message: "请输入AE Title", trigger: "blur" },
],
ip: [{ required: true, message: "请输入IP", trigger: "blur" }],
port: [{ required: true, message: "请输入pORT", trigger: "blur" }],
},
btnLoading: false,
};
},
methods: {
handleCancel() {},
handleSave() {},
},
};
</script>

View File

@ -1,11 +1,165 @@
<template>
<div class="dicomAE"></div>
<div class="dicomAE">
<div ref="leftContainer" class="left">
<el-form :inline="true">
<!--AE Title-->
<el-form-item label="AE Title" prop="CalledAE">
<el-input v-model="searchData.CalledAE" style="width: 140px" />
</el-form-item>
<!--IP-->
<el-form-item label="IP" prop="IP">
<el-input v-model="searchData.IP" style="width: 140px" />
</el-form-item>
<!--Port-->
<el-form-item label="Port" prop="Port">
<el-input v-model="searchData.Port" style="width: 140px" />
</el-form-item>
<el-form-item>
<el-button type="primary" size="mini" @click="getList"
>搜索</el-button
>
<el-button type="primary" size="mini" @click="reset"></el-button>
<el-button type="primary" size="mini" @click="openDialog('add')"
>新增</el-button
>
</el-form-item>
</el-form>
<el-table
v-loading="loading"
v-adaptive="{ bottomOffset: 45 }"
height="100"
:data="list"
class="table"
>
<!--AE Title-->
<el-table-column
label="AE Title"
prop="calledAE"
min-width="120"
show-overflow-tooltip
/>
<!--IP-->
<el-table-column
label="IP"
prop="ip"
min-width="120"
show-overflow-tooltip
/>
<!--Port-->
<el-table-column
label="Port"
prop="port"
min-width="120"
show-overflow-tooltip
/>
<!--Modality-->
<el-table-column
label="Modality"
prop="modality"
min-width="120"
show-overflow-tooltip
/>
<!--Description-->
<el-table-column
label="Description"
prop="description"
min-width="120"
show-overflow-tooltip
/>
<el-table-column
label="操作"
fixed="right"
prop="UserTypeShortName"
min-width="200"
show-overflow-tooltip
>
<template slot-scope="scope">
<el-button
size="mini"
type="text"
icon="el-icon-edit-outline"
@click="openDialog('edit', scope.row)"
>编辑</el-button
>
</template>
</el-table-column>
</el-table>
<div class="pagination" style="text-align: right; margin-top: 5px">
<pagination
:total="total"
:page.sync="searchData.PageIndex"
:limit.sync="searchData.PageSize"
@pagination="getList"
/>
</div>
</div>
</div>
</template>
<script>
import Pagination from "@/components/Pagination";
export default {
name:"dicomAE"
}
name: "dicomAE",
components: { Pagination },
data() {
return {
//
searchData: {
CalledAE: null,
IP: null,
Port: null,
PageIndex: 1,
PageSize: 10,
},
total: 0,
//
loading: false,
list: [],
};
},
methods: {
//
getList() {},
//
reset() {},
//
openDialog(key, item) {},
},
};
</script>
<style lang="scss" scoped>
.dicomAE {
height: 100%;
box-sizing: border-box;
display: flex;
padding: 10px;
border-radius: 5px;
.left {
display: flex;
flex-direction: column;
width: 0;
flex-grow: 4;
// border-right: 1px solid #ccc;
.filter-container {
display: flex;
align-items: center;
margin: 5px;
}
.data-table {
flex: 1;
padding: 5px 0px;
}
.pagination-container {
text-align: right;
}
}
.right {
width: 0;
flex-grow: 6;
overflow-y: auto;
border-right: 1px solid #ccc;
}
.selected-row {
background-color: cadetblue;
}
}
</style>

View File

@ -249,11 +249,9 @@
min-width="200"
show-overflow-tooltip
v-if="
hasPermi([
'system:notice:edit',
'system:notice:publish',
'system:notice:back',
])
hasPermi(['system:notice:edit']) ||
hasPermi(['system:notice:publish']) ||
hasPermi(['system:notice:back'])
"
>
<template slot-scope="scope">

View File

@ -1,11 +1,11 @@
<template>
<div class="trials-navbar" style="position: relative">
<div class="leftMenu">
<img v-if="language === 'zh'" src="@/assets/zzlogo2.png" alt="">
<img v-else src="@/assets/zzlogo3.png" alt="">
<img v-if="language === 'zh'" src="@/assets/zzlogo2.png" alt="" />
<img v-else src="@/assets/zzlogo3.png" alt="" />
<span>
<!-- 中心影像系统EICS -->
{{ $t('trials:trials:title:eics') }}
{{ $t("trials:trials:title:eics") }}
</span>
</div>
<div class="center-menu">
@ -21,25 +21,41 @@
>
<!-- <el-menu-item v-if="!hasPermi(['role:air', 'role:rpm', 'role:radmin', 'role:rcrc', 'role:rir'])" index="1">
<i class="el-icon-odometer" /> -->
<!-- 工作台 -->
<!-- <span slot="title">{{ $t('trials:menuTitle:workbench') }}</span>
<!-- 工作台 -->
<!-- <span slot="title">{{ $t('trials:menuTitle:workbench') }}</span>
</el-menu-item> -->
<el-menu-item v-if="hasPermi(['role:pm', 'role:crc'])" index="1">
<el-menu-item v-if="hasPermi(['role:pm'])" index="1">
<i class="el-icon-odometer" />
<!-- 检查 -->
<span slot="title">{{ $t('trials:menuTitle:inspection') }}</span>
<span slot="title">{{ $t("trials:menuTitle:inspection") }}</span>
</el-menu-item>
<el-menu-item v-if="!hasPermi(['role:zys'])" index="2" :disabled="TotalNeedSignSystemDocCount !== 0">
<el-menu-item
v-if="!hasPermi(['role:zys'])"
index="2"
:disabled="TotalNeedSignSystemDocCount !== 0"
>
<i class="el-icon-box" />
<!-- 我的项目 -->
<span slot="title">
{{ $t('trials:tab:trials') }}
{{ $t("trials:tab:trials") }}
</span>
</el-menu-item>
<el-menu-item v-if="!hasPermi(['role:air', 'role:rpm', 'role:radmin', 'role:rcrc', 'role:rir', 'role:zys'])" index="3">
<el-menu-item
v-if="
!hasPermi([
'role:air',
'role:rpm',
'role:radmin',
'role:rcrc',
'role:rir',
'role:zys',
])
"
index="3"
>
<i class="el-icon-chat-dot-square" />
<!-- 通知消息 -->
<span slot="title">{{ $t('trials:tab:notice') }}</span>
<span slot="title">{{ $t("trials:tab:notice") }}</span>
</el-menu-item>
<el-submenu index="4" class="my_info">
@ -49,109 +65,123 @@
<span v="userTypeShortName">({{ userTypeShortName }})</span>
</span>
<!-- 账户信息 -->
<el-menu-item v-if="!hasPermi(['role:air'])" index="4-2">{{ $t('trials:trials-myinfo:title:accountInfo') }}</el-menu-item>
<el-menu-item v-if="!hasPermi(['role:air'])" index="4-2">{{
$t("trials:trials-myinfo:title:accountInfo")
}}</el-menu-item>
<!-- 退出 -->
<el-menu-item index="4-3">{{ $t('trials:trials-myinfo:button:loginout') }}</el-menu-item>
<el-menu-item index="4-3">{{
$t("trials:trials-myinfo:button:loginout")
}}</el-menu-item>
</el-submenu>
</el-menu>
<!-- <TopLang />-->
<!-- <TopLang />-->
</div>
</div>
</template>
<script>
import { loginOut } from '@/api/user'
import { mapGetters, mapMutations } from 'vuex'
import TopLang from './topLang'
import NoticeMarquee from './noticeMarquee'
import { loginOut } from "@/api/user";
import { mapGetters, mapMutations } from "vuex";
import TopLang from "./topLang";
import NoticeMarquee from "./noticeMarquee";
export default {
components: { TopLang, NoticeMarquee },
data() {
return {
activeIndex: '2',
activeIndex: "2",
isReviewer: false,
userTypeShortName: zzSessionStorage.getItem('userTypeShortName'),
notice: ''
}
userTypeShortName: zzSessionStorage.getItem("userTypeShortName"),
notice: "",
};
},
computed: {
...mapGetters(['sidebar', 'name', 'userName', 'device', 'TotalNeedSignSystemDocCount', 'language'])
...mapGetters([
"sidebar",
"name",
"userName",
"device",
"TotalNeedSignSystemDocCount",
"language",
]),
},
watch: {
$route(v) {
this.changeRoute(v)
}
this.changeRoute(v);
},
},
created() {
this.isReviewer = JSON.parse(zzSessionStorage.getItem('IsReviewer'))
this.changeRoute(this.$route)
this.isReviewer = JSON.parse(zzSessionStorage.getItem("IsReviewer"));
this.changeRoute(this.$route);
},
methods: {
...mapMutations({ setLanguage: 'lang/setLanguage' }),
...mapMutations({ setLanguage: "lang/setLanguage" }),
changeRoute(v) {
if (v.path === '/trials/trials-inspection') {
this.activeIndex = '1'
if (v.path === "/trials/trials-inspection") {
this.activeIndex = "1";
}
if (v.path === '/trials/trials-list' || ~v.path.indexOf('/trials/trials-panel')) {
this.activeIndex = '2'
if (
v.path === "/trials/trials-list" ||
~v.path.indexOf("/trials/trials-panel")
) {
this.activeIndex = "2";
}
if (v.path === '/trials/trials-notice') {
this.activeIndex = '3'
if (v.path === "/trials/trials-notice") {
this.activeIndex = "3";
}
if (v.path === '/trials/trials-myinfo') {
this.activeIndex = '4-2'
if (v.path === "/trials/trials-myinfo") {
this.activeIndex = "4-2";
}
},
handleSelect(key, keyPath) {
switch (key) {
case '4-2':
this.go('/trials/trials-myinfo')
break
case '4-3':
this.logout()
break
case '1':
this.go('/trials/trials-inspection')
break
case '2':
if (~this.$route.path.indexOf('/trials/trials-panel')) {
return
case "4-2":
this.go("/trials/trials-myinfo");
break;
case "4-3":
this.logout();
break;
case "1":
this.go("/trials/trials-inspection");
break;
case "2":
if (~this.$route.path.indexOf("/trials/trials-panel")) {
return;
}
var lastWorkbench = zzSessionStorage.getItem('lastWorkbench')
var lastWorkbench = zzSessionStorage.getItem("lastWorkbench");
if (lastWorkbench) {
this.go(lastWorkbench)
this.go(lastWorkbench);
} else {
this.go('/trials/trials-list')
this.go("/trials/trials-list");
}
break
case '3':
this.go('/trials/trials-notice')
break
break;
case "3":
this.go("/trials/trials-notice");
break;
}
},
toggleSideBar() {
this.$store.dispatch('app/toggleSideBar')
this.$store.dispatch("app/toggleSideBar");
},
async logout() {
await loginOut()
await this.$store.dispatch('user/logout')
this.$router.push(`/login`)
this.$i18n.locale = 'zh'
this.setLanguage('zh')
this.$updateDictionary()
await loginOut();
await this.$store.dispatch("user/logout");
this.$router.push(`/login`);
this.$i18n.locale = "zh";
this.setLanguage("zh");
this.$updateDictionary();
},
go(value) {
this.$router.push({ path: value })
this.$router.push({ path: value });
},
account() {
this.$router.push({ name: 'Account' })
}
}
}
this.$router.push({ name: "Account" });
},
},
};
</script>
<style lang="scss" scoped>
.trials-navbar{
.trials-navbar {
display: flex;
flex-direction: row;
justify-content: space-between;
@ -159,24 +189,25 @@ export default {
overflow: hidden;
background: #fff;
box-shadow: 0 1px 4px rgba(0, 21, 41, 0.08);
.el-breadcrumb__item{
.el-breadcrumb__item {
font-size: 16px;
}
.leftMenu{
.leftMenu {
display: flex;
align-items: center;
padding-left: 20px;
img{
img {
height: 28px;
margin-right: 10px;
}
span{
span {
font-size: 20px;
position: relative;
top: -1px;
}
}
.right-menu, .center-menu {
.right-menu,
.center-menu {
display: flex;
flex-direction: row;
justify-content: space-between;
@ -226,7 +257,7 @@ export default {
}
</style>
<style>
.el-menu--horizontal>.my_info.el-submenu .el-submenu__icon-arrow {
margin-top: 0;
}
.el-menu--horizontal > .my_info.el-submenu .el-submenu__icon-arrow {
margin-top: 0;
}
</style>

View File

@ -0,0 +1,260 @@
<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:hirVisit:button:editStudy") }}{{
$t("trials:globalReview:title:subject")
}}T0001132{{ $t("trials:studyList:table:visit") }}ZhangSan
</span>
<!--当前检查--->
<div class="topTable">
<div class="title">
<span>{{ $t("trials:hirVisit:titleMessage:currentStudy") }}</span>
<div class="btnBox">
<el-button type="primary" @click="submit">
{{ $t("trials:seletctedReviews:button:confirm") }}
</el-button>
<el-button @click="preview">
{{ $t("trials:readingPeriod:verify:title:preview") }}
</el-button>
</div>
</div>
<!--当前检查列表 @selection-change="handleSelectChange"--->
<el-table
ref="addTrialsList"
v-loading="topLoading"
:data="topList"
stripe
height="30vh"
>
<!-- <el-table-column type="selection" align="center" width="45" /> -->
<!--检查编号-->
<el-table-column
align="center"
prop="IsUrgent"
:label="$t('trials:audit:table:studyId')"
show-overflow-tooltip
></el-table-column>
<!--检查类型-->
<el-table-column
align="center"
prop="IsUrgent"
:label="$t('trials:audit:table:modality')"
show-overflow-tooltip
></el-table-column>
<!--序列数量-->
<el-table-column
align="center"
prop="IsUrgent"
:label="$t('trials:audit:table:seriesCount')"
show-overflow-tooltip
></el-table-column>
<!--检查日期-->
<el-table-column
align="center"
prop="IsUrgent"
:label="$t('trials:audit:table:studyDate')"
show-overflow-tooltip
></el-table-column>
<!--所属访视-->
<el-table-column
align="center"
prop="IsUrgent"
:label="$t('trials:hirVisit:table:ownershipVisit')"
show-overflow-tooltip
></el-table-column>
<!--操作-->
<el-table-column
:label="$t('common:action:action')"
width="300"
class-name="actionBox"
>
<template slot-scope="scope">
<!-- 查看 -->
<el-button type="text" @click.stop="detail(scope.row, 'top')">{{
$t("trials:enrolledReviews:button:view")
}}</el-button>
<!-- 移除 -->
<el-button type="text" @click.stop="remove(scope.row)">{{
$t("common:button:remove")
}}</el-button>
</template>
</el-table-column>
</el-table>
</div>
<!--可选检查-->
<div class="bottomTable">
<p>{{ $t("trials:hirVisit:titleMessage:optionalStudy") }}</p>
<div class="form">
<el-form :inline="true" class="base-search-form">
<!-- 检查编号 -->
<el-form-item :label="$t('trials:uploadMonitor:table:studyId')">
<el-input v-model="searchData.SubjectInfo" style="width: 100px" />
</el-form-item>
<!-- 检查日期 -->
<el-form-item :label="$t('trials:uploadedDicoms:table:studyDate')">
<el-date-picker
v-model="searchData.date"
type="daterange"
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期"
>
</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>
<el-button icon="el-icon-refresh" @click="addTrials">
{{ $t("trials:readingReport:button:refresh") }}
</el-button>
</div>
<el-table
ref="addTrialsList"
v-loading="bottomLoading"
v-adaptive="{ bottomOffset: 60 }"
:data="bottomList"
stripe
height="100"
@selection-change="handleSelectChange"
>
<el-table-column type="selection" align="center" width="45" />
<!--检查编号-->
<el-table-column
align="center"
prop="IsUrgent"
:label="$t('trials:audit:table:studyId')"
show-overflow-tooltip
></el-table-column>
<!--检查类型-->
<el-table-column
align="center"
prop="IsUrgent"
:label="$t('trials:audit:table:modality')"
show-overflow-tooltip
></el-table-column>
<!--序列数量-->
<el-table-column
align="center"
prop="IsUrgent"
:label="$t('trials:audit:table:seriesCount')"
show-overflow-tooltip
></el-table-column>
<!--检查日期-->
<el-table-column
align="center"
prop="IsUrgent"
:label="$t('trials:audit:table:studyDate')"
show-overflow-tooltip
></el-table-column>
<!--所属访视-->
<el-table-column
align="center"
prop="IsUrgent"
:label="$t('trials:hirVisit:table:ownershipVisit')"
show-overflow-tooltip
></el-table-column>
<!--操作-->
<el-table-column
:label="$t('common:action:action')"
width="300"
class-name="actionBox"
>
<template slot-scope="scope">
<!-- 查看 -->
<el-button type="text" @click.stop="detail(scope.row, 'bottom')">{{
$t("trials:enrolledReviews:button:view")
}}</el-button>
<!-- 添加 -->
<el-button type="text" @click.stop="add(scope.row)">{{
$t("common:button:add")
}}</el-button>
</template>
</el-table-column>
</el-table>
</div>
</el-dialog>
</template>
<script>
export default {
name: "editStudyList",
props: {
visible: {
require: true,
default: false,
},
},
data() {
return {
//
searchData: {},
//
bottomList: [{ IsUrgent: 2 }],
bottomLoading: false,
//
topList: [{ IsUrgent: 1 }],
topLoading: false,
};
},
methods: {
//
beforeCloseStudyDig() {
this.$emit("update:visible", false);
},
//
preview() {},
//
submit() {},
//
detail(item, key) {},
//
remove(item) {},
//
handleSearch() {},
//
handleReset() {},
//
handleSelectChange() {},
//
add(item) {},
},
};
</script>
<style lang="scss" scoped>
.topTable {
.title {
display: flex;
align-items: center;
justify-content: space-between;
}
}
.bottomTable {
.form {
width: 100%;
display: flex;
align-items: center;
justify-content: space-between;
}
}
</style>

View File

@ -0,0 +1,281 @@
<template>
<BaseContainer>
<!-- 搜索框 -->
<template slot="search-container">
<el-form :inline="true">
<!-- 受试者编号 -->
<el-form-item :label="$t('trials:crcQuestion:table:subjectId')">
<el-input v-model="searchData.SubjectInfo" style="width: 140px" />
</el-form-item>
<!-- 患者姓名 -->
<el-form-item :label="$t('trials:uploadDicomList:table:patientName')">
<el-input v-model="searchData.SubjectInfo" style="width: 140px" />
</el-form-item>
<!-- 患者性别 -->
<el-form-item :label="$t('trials:subject:table:gender')">
<el-select
v-model="searchData.SiteId"
clearable
filterable
style="width: 150px"
>
<el-option
v-for="item of $d.sex"
:key="item.id"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
<!-- 访视名称 -->
<el-form-item :label="$t('trials:globalReview:table:visitName')">
<el-select
v-model="searchData.SiteId"
clearable
filterable
style="width: 150px"
>
<el-option
v-for="item of visitOptions"
:key="item.SiteId"
:label="item.TrialSiteCode"
:value="item.SiteId"
/>
</el-select>
</el-form-item>
<!-- 状态 -->
<el-form-item :label="$t('trials:trials-list:table:status')">
<el-select
v-model="searchData.SiteId"
clearable
filterable
style="width: 150px"
>
<el-option
v-for="item of siteOptions"
:key="item.SiteId"
:label="item.TrialSiteCode"
:value="item.SiteId"
/>
</el-select>
</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 }"
:data="list"
stripe
height="100"
@sort-change="handleSortByColumn"
>
<el-table-column width="40">
<template>
<i
class="el-icon-warning-outline"
:title="$t('trials:hirVisit:tipMessage:tipOne')"
style="color: red"
></i>
</template>
</el-table-column>
<!-- 受试者编号 -->
<el-table-column
prop="StudyCode"
:label="$t('trials:uploadMonitor:table:subjectId')"
show-overflow-tooltip
/>
<!-- 患者编号 -->
<el-table-column
prop="StudyCode"
:label="$t('trials:uploadMonitor:table:subjectId')"
show-overflow-tooltip
/>
<!-- 患者姓名 -->
<el-table-column
prop="StudyCode"
:label="$t('trials:uploadDicomList:table:patientName')"
show-overflow-tooltip
/>
<!-- 性别 -->
<el-table-column
prop="StudyCode"
:label="$t('trials:subject:table:gender')"
show-overflow-tooltip
/>
<!-- 访视名称 -->
<el-table-column
prop="StudyCode"
:label="$t('trials:uploadMonitor:table:visitName')"
show-overflow-tooltip
/>
<!-- 数据收集 -->
<el-table-column
prop="StudyCode"
:label="$t('trials:crcUpload:table:dataCollected')"
show-overflow-tooltip
/>
<!-- 最早拍片日期 -->
<el-table-column
prop="StudyCode"
:label="$t('trials:trials-panel:table:EarliestScanDate')"
show-overflow-tooltip
sortable="custom"
/>
<!-- 最晚拍片日期 -->
<el-table-column
prop="StudyCode"
:label="$t('trials:linkedRP:table:latestScanDate')"
show-overflow-tooltip
sortable="custom"
/>
<!-- 状态 -->
<el-table-column
prop="StudyCode"
:label="$t('trials:trials-list:table:status')"
show-overflow-tooltip
sortable="custom"
/>
<!-- 提交时间 -->
<el-table-column
prop="StudyCode"
:label="$t('trials:crcUpload:table:submitTime')"
show-overflow-tooltip
sortable="custom"
/>
<!--操作-->
<el-table-column
:label="$t('common:action:action')"
min-width="100"
fixed="right"
v-if="
hasPermi(['trials:trials-panel:hirVisit:edit']) ||
hasPermi(['trials:trials-panel:hirVisit:submit']) ||
hasPermi(['trials:trials-panel:hirVisit:remove']) ||
hasPermi(['trials:trials-panel:hirVisit:result']) ||
hasPermi(['trials:trials-panel:hirVisit:downlaod'])
"
>
<template slot-scope="scope">
<!--修改检查-->
<el-button
type="text"
v-hasPermi="['trials:trials-panel:hirVisit:edit']"
@click="editStudy(scope.row)"
>{{ $t("trials:hirVisit:button:editStudy") }}</el-button
>
<!--提交-->
<el-button
type="text"
v-hasPermi="['trials:trials-panel:hirVisit:submit']"
@click="submit(scope.row)"
>{{ $t("common:button:submit") }}</el-button
>
<!--删除-->
<el-button
type="text"
v-hasPermi="['trials:trials-panel:hirVisit:remove']"
@click="remove(scope.row)"
>{{ $t("common:button:delete") }}</el-button
>
<!--评估结果-->
<el-button
type="text"
v-hasPermi="['trials:trials-panel:hirVisit:result']"
@click="result(scope.row)"
>{{ $t("trials:adReview:title:result") }}</el-button
>
<!--下载影像-->
<el-button
type="text"
v-hasPermi="['trials:trials-panel:hirVisit:download']"
@click="downloadImage(scope.row)"
>{{ $t("trials:reading:button:uploadImages") }}</el-button
>
<!--下载医疗报告-->
<el-button type="text" @click="downloadReport(scope.row)">{{
$t("trials:reading:button:uploadReport")
}}</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页组件 -->
<pagination
class="page"
:total="total"
:page.sync="searchData.PageIndex"
:limit.sync="searchData.PageSize"
@pagination="getList"
/>
</template>
<!--修改检查-->
<editStudyList :visible.sync="editStudyVisible" />
</BaseContainer>
</template>
<script>
import BaseContainer from "@/components/BaseContainer";
import Pagination from "@/components/Pagination";
import editStudyList from "./components/edit-study-list.vue";
export default {
name: "hirVisit",
components: { BaseContainer, Pagination, editStudyList },
data() {
return {
//
searchData: {},
visitOptions: [],
//
list: [
{
StudyCode: 1,
},
],
loading: false,
total: 0,
//
editStudyVisible: false,
};
},
methods: {
//
handleSearch() {},
//
handleSearch() {},
//
handleSortByColumn() {},
//
getList() {},
//
editStudy(item) {
this.editStudyVisible = true;
},
//
submit() {},
//
remove() {},
//
result() {},
//
downloadImage() {},
//
downloadReport() {},
},
};
</script>

View File

@ -0,0 +1,230 @@
<template>
<BaseContainer>
<!-- 搜索框 -->
<template slot="search-container">
<el-form :inline="true">
<!-- 受试者编号 -->
<el-form-item :label="$t('trials:crcQuestion:table:subjectId')">
<el-input v-model="searchData.SubjectInfo" style="width: 140px" />
</el-form-item>
<!-- 患者编号 -->
<el-form-item :label="$t('trials:uploadDicomList:table:pId')">
<el-input v-model="searchData.SubjectInfo" style="width: 140px" />
</el-form-item>
<!-- 患者姓名 -->
<el-form-item :label="$t('trials:uploadDicomList:table:patientName')">
<el-input v-model="searchData.SubjectInfo" style="width: 140px" />
</el-form-item>
<!-- 访视名称 -->
<el-form-item :label="$t('trials:globalReview:table:visitName')">
<el-select
v-model="searchData.SiteId"
clearable
filterable
style="width: 150px"
>
<el-option
v-for="item of visitOptions"
:key="item.SiteId"
:label="item.TrialSiteCode"
:value="item.SiteId"
/>
</el-select>
</el-form-item>
<!-- 任务状态 -->
<el-form-item :label="$t('trials:readTask:table:taskState')">
<el-select
v-model="searchData.SiteId"
clearable
filterable
style="width: 150px"
>
<el-option
v-for="item of visitOptions"
:key="item.SiteId"
:label="item.TrialSiteCode"
:value="item.SiteId"
/>
</el-select>
</el-form-item>
<!-- 阅片状态 -->
<el-form-item :label="$t('trials:readTask:table:readingTaskState')">
<el-select
v-model="searchData.SiteId"
clearable
filterable
style="width: 150px"
>
<el-option
v-for="item of visitOptions"
:key="item.SiteId"
:label="item.TrialSiteCode"
:value="item.SiteId"
/>
</el-select>
</el-form-item>
<!-- 阅片完成时间 -->
<el-form-item :label="$t('trials:reviewTrack:table:signTime')">
<el-date-picker
v-model="searchData.date"
type="daterange"
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期"
>
</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>
</template>
<!-- 阅片管理列表 -->
<template slot="main-container">
<el-table
v-loading="loading"
v-adaptive="{ bottomOffset: 60 }"
:data="list"
stripe
height="100"
@sort-change="handleSortByColumn"
>
<!-- 受试者编号 -->
<el-table-column
prop="StudyCode"
:label="$t('trials:uploadMonitor:table:subjectId')"
show-overflow-tooltip
/>
<!-- 患者编号 -->
<el-table-column
prop="StudyCode"
:label="$t('trials:uploadMonitor:table:subjectId')"
show-overflow-tooltip
/>
<!-- 患者姓名 -->
<el-table-column
prop="StudyCode"
:label="$t('trials:uploadDicomList:table:patientName')"
show-overflow-tooltip
/>
<!-- 访视名称 -->
<el-table-column
prop="StudyCode"
:label="$t('trials:uploadMonitor:table:visitName')"
show-overflow-tooltip
/>
<!-- 任务创建时间 -->
<el-table-column
prop="StudyCode"
:label="$t('trials:reviewTrack:table:createTime')"
show-overflow-tooltip
/>
<!-- 任务状态 -->
<el-table-column
prop="StudyCode"
:label="$t('trials:readTask:table:taskState')"
show-overflow-tooltip
sortable="custom"
/>
<!-- 阅片人 -->
<el-table-column
prop="StudyCode"
:label="$t('trials:reviewAssign:searchForm:reader')"
show-overflow-tooltip
sortable="custom"
/>
<!-- 阅片标准 -->
<el-table-column
prop="StudyCode"
:label="$t('trials:processCfg:form:criterion')"
show-overflow-tooltip
sortable="custom"
/>
<!-- 建议完成时间 -->
<el-table-column
prop="StudyCode"
:label="$t('trials:consistencyAnalysis:table:suggesteFinishedTime')"
show-overflow-tooltip
sortable="custom"
/>
<!--操作-->
<el-table-column
:label="$t('common:action:action')"
min-width="100"
fixed="right"
>
<template slot-scope="scope">
<!--阅片结果-->
<el-button type="text" @click="readResult(scope.row)">{{
$t("trials:hirVisit:button:editStudy")
}}</el-button>
<!--下载报告-->
<el-button type="text" @click="downloadReport(scope.row)">{{
$t("common:button:submit")
}}</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页组件 -->
<pagination
class="page"
:total="total"
:page.sync="searchData.PageIndex"
:limit.sync="searchData.PageSize"
@pagination="getList"
/>
</template>
</BaseContainer>
</template>
<script>
import BaseContainer from "@/components/BaseContainer";
import Pagination from "@/components/Pagination";
export default {
name: "readManagenent",
components: { BaseContainer, Pagination },
data() {
return {
//
searchData: {},
visitOptions: [],
//
list: [
{
StudyCode: 1,
},
],
loading: false,
total: 0,
//
editStudyVisible: false,
};
},
methods: {
//
handleSearch() {},
//
handleSearch() {},
//
handleSortByColumn() {},
//
getList() {},
//
downloadReport() {},
//
readResult() {},
},
};
</script>

File diff suppressed because it is too large Load Diff

View File

@ -1,208 +1,158 @@
<template>
<BaseContainer v-loading="loading" style="height:100%;background-color: #fff;">
<el-tabs v-if="TrialReadingCriterionId" v-model="TrialReadingCriterionId" type="border-card">
<el-tab-pane v-for="item of trialCriterionList" :key="item.TrialReadingCriterionId" :label="item.TrialReadingCriterionName" :name="item.TrialReadingCriterionId">
<div v-if="isReadingTaskViewInOrder && TrialReadingCriterionId === item.TrialReadingCriterionId">
<div slot="search-container">
<el-form :inline="true">
<!-- 受试者编号 -->
<el-form-item :label="$t('trials:pendingReadingTasks:table:subjectCode')">
<el-input
v-model="searchData.SubjectCode"
style="width:130px;"
clearable
/>
</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>
<div slot="main-container">
<el-table
v-adaptive="{bottomOffset:75}"
:data="list"
stripe
height="100"
@sort-change="handleSortChange"
>
<el-table-column type="index" width="40" align="left" />
<!-- 受试者编号 -->
<el-table-column
prop="SubjectCode"
min-width="100"
:label="$t('trials:pendingReadingTasks:table:subjectCode')"
show-overflow-tooltip
sortable="custom"
/>
<!-- 剩余阅片量 -->
<el-table-column
prop="UnReadCanReadTaskCount"
min-width="100"
:label="$t('trials:pendingReadingTasks:table:remainingReadingVolume')"
show-overflow-tooltip
sortable="custom"
/>
<!-- &lt;!&ndash; 未读任务数量 &ndash;&gt;-->
<!-- <el-table-column-->
<!-- prop="UnReadTaskCount"-->
<!-- min-width="100"-->
<!-- label="未读任务数量"-->
<!-- show-overflow-tooltip-->
<!-- />-->
<!-- &lt;!&ndash; 可读任务量 &ndash;&gt;-->
<!-- <el-table-column-->
<!-- prop="UnReadCanReadTaskCount"-->
<!-- min-width="100"-->
<!-- label="可读任务量"-->
<!-- show-overflow-tooltip-->
<!-- />-->
<!-- &lt;!&ndash; 已签名任务量 &ndash;&gt;-->
<!-- <el-table-column-->
<!-- prop="HaveReadTaskCount"-->
<!-- min-width="100"-->
<!-- label="已签名任务量"-->
<!-- show-overflow-tooltip-->
<!-- />-->
<!-- 建议完成时间 -->
<el-table-column
prop="SuggesteFinishedTime"
min-width="100"
:label="$t('trials:pendingReadingTasks:table:suggestedCompletionTime')"
show-overflow-tooltip
sortable="custom"
>
<template slot-scope="scope">
{{ scope.row.SuggesteFinishedTime? scope.row.SuggesteFinishedTime.split(':')[0] + ':00:00':'' }}
</template>
</el-table-column>
<!-- 当前领取人 -->
<el-table-column
prop="ClaimUserName"
min-width="100"
:label="$t('trials:pendingReadingTasks:table:recipient')"
show-overflow-tooltip
sortable="custom"
/>
<el-table-column
:label="$t('common:action:action')"
width="250"
fixed="right"
>
<template slot-scope="scope">
<!-- 阅片 -->
<el-button
:disabled="scope.row.ExistReadingApply || (scope.row.ClaimUserId && scope.row.ClaimUserId !== userId)"
circle
:title="scope.row.ExistReadingApply ? $t('trials:pendingReadingTasks:button:ExistReadingApply') : $t('trials:pendingReadingTasks:button:review')"
icon="el-icon-edit-outline"
@click="handleReadImage(scope.row)"
/>
<!-- 释放 -->
<el-button
:disabled="!scope.row.ClaimUserId || (scope.row.ClaimUserId && scope.row.ClaimUserId !== userId)"
circle
:title="$t('trials:pendingReadingTasks:button:release')"
icon="el-icon-s-release"
@click="handleReleaseTasks(scope.row)"
/>
</template>
</el-table-column>
</el-table>
<pagination class="page" :total="total" :page.sync="searchData.PageIndex" :limit.sync="searchData.PageSize" @pagination="getList" />
</div>
</div>
<div v-else-if="isReadingTaskViewInOrder === false && TrialReadingCriterionId === item.TrialReadingCriterionId">
<el-descriptions :column="2" border style="width:800px">
<!-- 剩余任务量 -->
<el-descriptions-item :label="$t('trials:pendingReadingTasks:table:remainingTaskVolume')" :label-style="{'width':'200px'}">
<el-tag size="small" type="danger">{{ randomReadInfo.UnReadTaskCount }}</el-tag>
</el-descriptions-item>
<!-- 剩余裁判量 -->
<!-- <el-descriptions-item :label="$t('trials:pendingReadingTasks:table:amountOfJudgesRemaining')" :label-style="{'width':'200px'}">
<el-tag size="small" type="danger">{{ randomReadInfo.UnReadJudgeTaskCount }}</el-tag>
</el-descriptions-item> -->
<!-- 已完成任务量 -->
<el-descriptions-item :label="$t('trials:pendingReadingTasks:table:amountOfCompletedTasks')" :label-style="{'width':'200px'}">
<el-tag size="small">{{ randomReadInfo.FinishTaskCount }}</el-tag>
</el-descriptions-item>
<!-- 已完成裁判量 -->
<!-- <el-descriptions-item :label="$t('trials:pendingReadingTasks:table:numberOfJudgesCompleted')" :label-style="{'width':'200px'}">
<el-tag size="small">{{ randomReadInfo.FinishJudgeTaskCount }}</el-tag>
</el-descriptions-item> -->
<el-descriptions-item>
<!-- 开始随机阅片 -->
<el-button
type="primary"
size="small"
:disabled="randomReadInfo.UnReadTaskCount ===0"
@click="handleOutOfOrderReading"
>
{{ $t('trials:pendingReadingTasks:button:beginRandomReview') }}
</el-button>
</el-descriptions-item>
</el-descriptions>
</div>
<!-- <template v-else-if="!isReadingTaskViewInOrder && isRender">
<el-tabs v-model="TrialReadingCriterionId" type="border-card">
<el-tab-pane v-for="i of trialCriterionList" :key="i.TrialReadingCriterionName" :label="i.TrialReadingCriterionName" :name="i.TrialReadingCriterionId">
<el-descriptions :column="2" border style="width:800px">
<el-descriptions-item label="剩余任务量" :label-style="{'width':'200px'}">
<el-tag size="small" type="danger">{{ randomReadInfo.UnReadTaskCount }}</el-tag>
</el-descriptions-item>
<el-descriptions-item label="剩余裁判量" :label-style="{'width':'200px'}">
<el-tag size="small" type="danger">{{ randomReadInfo.UnReadJudgeTaskCount }}</el-tag>
</el-descriptions-item>
<el-descriptions-item label="已完成任务量" :label-style="{'width':'200px'}">
<el-tag size="small">{{ randomReadInfo.FinishTaskCount }}</el-tag>
</el-descriptions-item>
<el-descriptions-item label="已完成裁判量" :label-style="{'width':'200px'}">
<el-tag size="small">{{ randomReadInfo.FinishJudgeTaskCount }}</el-tag>
</el-descriptions-item>
<el-descriptions-item>
<el-button
type="primary"
size="small"
:disabled="randomReadInfo.UnReadTaskCount+randomReadInfo.UnReadJudgeTaskCount ===0"
@click="handleOutOfOrderReading"
>
开始随机阅片
</el-button>
</el-descriptions-item>
</el-descriptions>
</el-tab-pane>
</el-tabs>
</template> -->
</el-tab-pane>
</el-tabs>
<BaseContainer
v-loading="loading"
style="height: 100%; background-color: #fff"
>
<div slot="search-container">
<el-form :inline="true">
<!-- 患者编号 -->
<el-form-item :label="$t('trials:uploadDicomList:table:pId')">
<el-input
v-model="searchData.SubjectCode"
style="width: 130px"
clearable
/>
</el-form-item>
<!-- 患者姓名 -->
<el-form-item :label="$t('trials:uploadDicomList:table:patientName')">
<el-input
v-model="searchData.SubjectCode"
style="width: 130px"
clearable
/>
</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>
<div slot="main-container">
<el-table
v-adaptive="{ bottomOffset: 75 }"
:data="list"
stripe
height="100"
@sort-change="handleSortChange"
>
<el-table-column type="index" width="40" align="left" />
<!-- 患者编号 -->
<el-table-column
prop="SubjectCode"
min-width="100"
:label="$t('trials:uploadDicomList:table:pId')"
show-overflow-tooltip
sortable="custom"
/>
<!-- 患者姓名 -->
<el-table-column
prop="SubjectCode"
min-width="100"
:label="$t('trials:uploadDicomList:table:patientName')"
show-overflow-tooltip
sortable="custom"
/>
<!-- 剩余阅片量 -->
<el-table-column
prop="UnReadCanReadTaskCount"
min-width="100"
:label="$t('trials:pendingReadingTasks:table:remainingReadingVolume')"
show-overflow-tooltip
sortable="custom"
/>
<!-- 建议完成时间 -->
<el-table-column
prop="SuggesteFinishedTime"
min-width="100"
:label="
$t('trials:pendingReadingTasks:table:suggestedCompletionTime')
"
show-overflow-tooltip
sortable="custom"
>
<template slot-scope="scope">
{{
scope.row.SuggesteFinishedTime
? scope.row.SuggesteFinishedTime.split(":")[0] + ":00:00"
: ""
}}
</template>
</el-table-column>
<!--操作-->
<el-table-column
:label="$t('common:action:action')"
width="250"
fixed="right"
>
<template slot-scope="scope">
<!-- 阅片 -->
<el-button
:disabled="
scope.row.ExistReadingApply ||
(scope.row.ClaimUserId && scope.row.ClaimUserId !== userId)
"
circle
:title="
scope.row.ExistReadingApply
? $t('trials:pendingReadingTasks:button:ExistReadingApply')
: $t('trials:pendingReadingTasks:button:review')
"
icon="el-icon-edit-outline"
@click="handleReadImage(scope.row)"
/>
<!-- 释放 -->
<el-button
:disabled="
!scope.row.ClaimUserId ||
(scope.row.ClaimUserId && scope.row.ClaimUserId !== userId)
"
circle
:title="$t('trials:pendingReadingTasks:button:release')"
icon="el-icon-s-release"
@click="handleReleaseTasks(scope.row)"
/>
</template>
</el-table-column>
</el-table>
<pagination
class="page"
:total="total"
:page.sync="searchData.PageIndex"
:limit.sync="searchData.PageSize"
@pagination="getList"
/>
</div>
</BaseContainer>
</template>
<script>
import { getIRUnReadSubjectTaskList, verifyReadingRestTime } from '@/api/trials'
import { getTrialCriterionList } from '@/api/trials/reading'
import { claimOrCancelSubject } from '@/api/reading'
import BaseContainer from '@/components/BaseContainer'
import Pagination from '@/components/Pagination'
import { getToken } from '@/utils/auth'
import {
getIRUnReadSubjectTaskList,
verifyReadingRestTime,
} from "@/api/trials";
import { getTrialCriterionList } from "@/api/trials/reading";
import { claimOrCancelSubject } from "@/api/reading";
import BaseContainer from "@/components/BaseContainer";
import Pagination from "@/components/Pagination";
import { getToken } from "@/utils/auth";
const searchDataDefault = () => {
return {
SubjectCode: '',
SubjectCode: "",
PageIndex: 1,
PageSize: 20
}
}
PageSize: 20,
};
};
export default {
name: 'ReadingTaskList',
name: "ReadingTaskList",
components: { BaseContainer, Pagination },
data() {
return {
@ -210,147 +160,175 @@ export default {
list: [],
total: 0,
loading: false,
trialId: '',
trialId: "",
isReadingTaskViewInOrder: null,
randomReadInfo: {},
isRender: false,
trialCriterionList: [],
TrialReadingCriterionId: '',
TrialReadingCriterionId: "",
isTableShow: true,
readingTool: null,
criterionType: null,
openWindow: null,
userId: zzSessionStorage.getItem('userId')
}
userId: zzSessionStorage.getItem("userId"),
};
},
watch: {
TrialReadingCriterionId(v) {
if (!v) return
this.getList()
}
if (!v) return;
this.getList();
},
},
mounted() {
window.addEventListener('message', this.receiveMsg)
this.trialId = this.$route.query.trialId
window.addEventListener("message", this.receiveMsg);
this.trialId = this.$route.query.trialId;
// this.getList()
this.getTrialCriterionList()
this.getTrialCriterionList();
},
beforeDestroy() {
window.removeEventListener('message', this.receiveMsg)
window.removeEventListener("message", this.receiveMsg);
if (this.openWindow) {
this.openWindow.close()
this.openWindow.close();
}
},
methods: {
getTrialCriterionList() {
getTrialCriterionList(this.trialId).then(res => {
this.trialCriterionList = res.Result
this.TrialReadingCriterionId = this.trialCriterionList[0].TrialReadingCriterionId
}).catch(() => {})
getTrialCriterionList(this.trialId)
.then((res) => {
this.trialCriterionList = res.Result;
this.TrialReadingCriterionId =
this.trialCriterionList[0].TrialReadingCriterionId;
})
.catch(() => {});
},
getList() {
this.loading = true
this.searchData.TrialId = this.trialId
this.searchData.TrialReadingCriterionId = this.TrialReadingCriterionId
this.isRender = false
getIRUnReadSubjectTaskList(this.searchData).then(res => {
this.isReadingTaskViewInOrder = res.OtherInfo.IsReadingTaskViewInOrder
this.readingTool = res.OtherInfo.ReadingTool
this.criterionType = res.OtherInfo.CriterionType
if (res.OtherInfo.IsReadingTaskViewInOrder) {
this.list = res.Result.CurrentPageData
this.total = res.Result.TotalCount
} else {
this.randomReadInfo = res.OtherInfo.RandomReadInfo
}
this.isRender = true
this.loading = false
}).catch(() => {
this.isRender = true
this.loading = false
})
this.loading = true;
this.searchData.TrialId = this.trialId;
this.searchData.TrialReadingCriterionId = this.TrialReadingCriterionId;
this.isRender = false;
getIRUnReadSubjectTaskList(this.searchData)
.then((res) => {
this.isReadingTaskViewInOrder =
res.OtherInfo.IsReadingTaskViewInOrder;
this.readingTool = res.OtherInfo.ReadingTool;
this.criterionType = res.OtherInfo.CriterionType;
if (res.OtherInfo.IsReadingTaskViewInOrder) {
this.list = res.Result.CurrentPageData;
this.total = res.Result.TotalCount;
} else {
this.randomReadInfo = res.OtherInfo.RandomReadInfo;
}
this.isRender = true;
this.loading = false;
})
.catch(() => {
this.isRender = true;
this.loading = false;
});
},
//
handleReleaseTasks(row) {
this.loading = true
this.loading = true;
var params = {
isInOrder: true,
subejctId: row.SubjectId,
isClaim: false,
trialReadingCriterionId: this.TrialReadingCriterionId
}
claimOrCancelSubject(params).then(res => {
// '!'
this.$message.success(this.$t('trials:pendingReadingTasks:message:released'))
this.loading = false
this.getList()
}).catch(() => { this.loading = false })
trialReadingCriterionId: this.TrialReadingCriterionId,
};
claimOrCancelSubject(params)
.then((res) => {
// '!'
this.$message.success(
this.$t("trials:pendingReadingTasks:message:released")
);
this.loading = false;
this.getList();
})
.catch(() => {
this.loading = false;
});
},
handleSearch() {
this.searchData.PageIndex = 1
this.getList()
this.searchData.PageIndex = 1;
this.getList();
},
handleReset() {
this.searchData = searchDataDefault()
this.getList()
this.searchData = searchDataDefault();
this.getList();
},
handleReadImage(row) {
if (this.openWindow) {
this.openWindow.close()
this.openWindow.close();
}
this.loading = true
verifyReadingRestTime().then(_ => {
this.loading = false
this.loading = true;
verifyReadingRestTime()
.then((_) => {
this.loading = false;
window.localStorage.setItem('TrialReadingCriterionId', this.TrialReadingCriterionId)
var token = getToken()
var path = ''
var criterionName = this.trialCriterionList.find(i => i.TrialReadingCriterionId === this.TrialReadingCriterionId).TrialReadingCriterionName
if (this.readingTool === 0) {
path = `/readingDicoms?TrialReadingCriterionId=${this.TrialReadingCriterionId}&trialId=${this.trialId}&subjectCode=${row.SubjectCode}&subjectId=${row.SubjectId}&isReadingTaskViewInOrder=${this.isReadingTaskViewInOrder}&criterionType=${this.criterionType}&criterionName=${criterionName}&readingTool=${this.readingTool}&TokenKey=${token}`
} else {
path = `/noneDicomReading?TrialReadingCriterionId=${this.TrialReadingCriterionId}&trialId=${this.trialId}&subjectCode=${row.SubjectCode}&subjectId=${row.SubjectId}&isReadingTaskViewInOrder=${this.isReadingTaskViewInOrder}&criterionType=${this.criterionType}&criterionName=${criterionName}&readingTool=${this.readingTool}&TokenKey=${token}`
}
var routeData = this.$router.resolve({ path })
window.localStorage.setItem(
"TrialReadingCriterionId",
this.TrialReadingCriterionId
);
var token = getToken();
var path = "";
var criterionName = this.trialCriterionList.find(
(i) => i.TrialReadingCriterionId === this.TrialReadingCriterionId
).TrialReadingCriterionName;
if (this.readingTool === 0) {
path = `/readingDicoms?TrialReadingCriterionId=${this.TrialReadingCriterionId}&trialId=${this.trialId}&subjectCode=${row.SubjectCode}&subjectId=${row.SubjectId}&isReadingTaskViewInOrder=${this.isReadingTaskViewInOrder}&criterionType=${this.criterionType}&criterionName=${criterionName}&readingTool=${this.readingTool}&TokenKey=${token}`;
} else {
path = `/noneDicomReading?TrialReadingCriterionId=${this.TrialReadingCriterionId}&trialId=${this.trialId}&subjectCode=${row.SubjectCode}&subjectId=${row.SubjectId}&isReadingTaskViewInOrder=${this.isReadingTaskViewInOrder}&criterionType=${this.criterionType}&criterionName=${criterionName}&readingTool=${this.readingTool}&TokenKey=${token}`;
}
var routeData = this.$router.resolve({ path });
this.openWindow = window.open(routeData.href, '_blank')
}).catch(() => { this.loading = false })
this.openWindow = window.open(routeData.href, "_blank");
})
.catch(() => {
this.loading = false;
});
},
handleOutOfOrderReading() {
if (this.openWindow) {
this.openWindow.close()
this.openWindow.close();
}
this.loading = true
verifyReadingRestTime().then(_ => {
this.loading = false
window.localStorage.setItem('TrialReadingCriterionId', this.TrialReadingCriterionId)
var token = getToken()
var path = ''
if (this.readingTool === 0) {
path = `/readingDicoms?TrialReadingCriterionId=${this.TrialReadingCriterionId}&trialId=${this.trialId}&isReadingTaskViewInOrder=${this.isReadingTaskViewInOrder}&criterionType=${this.criterionType}&readingTool=${this.readingTool}&TokenKey=${token}`
} else {
path = `/noneDicomReading?TrialReadingCriterionId=${this.TrialReadingCriterionId}&trialId=${this.trialId}&isReadingTaskViewInOrder=${this.isReadingTaskViewInOrder}&criterionType=${this.criterionType}&readingTool=${this.readingTool}&TokenKey=${token}`
}
var routeData = this.$router.resolve({ path })
this.openWindow = window.open(routeData.href, '_blank')
}).catch(() => { this.loading = false })
this.loading = true;
verifyReadingRestTime()
.then((_) => {
this.loading = false;
window.localStorage.setItem(
"TrialReadingCriterionId",
this.TrialReadingCriterionId
);
var token = getToken();
var path = "";
if (this.readingTool === 0) {
path = `/readingDicoms?TrialReadingCriterionId=${this.TrialReadingCriterionId}&trialId=${this.trialId}&isReadingTaskViewInOrder=${this.isReadingTaskViewInOrder}&criterionType=${this.criterionType}&readingTool=${this.readingTool}&TokenKey=${token}`;
} else {
path = `/noneDicomReading?TrialReadingCriterionId=${this.TrialReadingCriterionId}&trialId=${this.trialId}&isReadingTaskViewInOrder=${this.isReadingTaskViewInOrder}&criterionType=${this.criterionType}&readingTool=${this.readingTool}&TokenKey=${token}`;
}
var routeData = this.$router.resolve({ path });
this.openWindow = window.open(routeData.href, "_blank");
})
.catch(() => {
this.loading = false;
});
},
receiveMsg(event) {
if (event.data === 'refreshTaskList') {
this.getList()
if (event.data === "refreshTaskList") {
this.getList();
}
},
//
handleSortChange(column) {
if (column.order === 'ascending') {
this.searchData.Asc = true
if (column.order === "ascending") {
this.searchData.Asc = true;
} else {
this.searchData.Asc = false
this.searchData.Asc = false;
}
this.searchData.SortField = column.prop
this.searchData.PageIndex = 1
this.getList()
}
}
}
this.searchData.SortField = column.prop;
this.searchData.PageIndex = 1;
this.getList();
},
},
};
</script>

View File

@ -1,282 +1,426 @@
<template>
<BaseContainer>
<el-tabs v-model="TrialReadingCriterionId" type="border-card">
<el-tab-pane v-for="item of trialCriterionList" :key="item.TrialReadingCriterionId" :label="item.TrialReadingCriterionName" :name="item.TrialReadingCriterionId">
<div v-if="TrialReadingCriterionId === item.TrialReadingCriterionId">
<div slot="search-container">
<el-form :inline="true">
<!-- 中心编号 -->
<el-form-item :label="$t('trials:rereadTask:table:siteCode')">
<el-select v-model="searchData.SiteId" clearable filterable style="width:120px;">
<el-option
v-for="(i,index) of siteOptions"
:key="index"
:label="i.TrialSiteCode"
:value="i.SiteId"
/>
</el-select>
</el-form-item>
<!-- 受试者编号 -->
<el-form-item :label="$t('trials:rereadTask:table:subjectCode')">
<el-input v-model="searchData.SubjectCode" style="width:100px;" />
</el-form-item>
<!-- <el-form-item style="margin-bottom:10px" label="访视/阅片期名称">
<div slot="search-container">
<el-form :inline="true">
<!-- 中心编号 -->
<el-form-item :label="$t('trials:rereadTask:table:siteCode')">
<el-select
v-model="searchData.SiteId"
clearable
filterable
style="width: 120px"
>
<el-option
v-for="(i, index) of siteOptions"
:key="index"
:label="i.TrialSiteCode"
:value="i.SiteId"
/>
</el-select>
</el-form-item>
<!-- 受试者编号 -->
<el-form-item :label="$t('trials:rereadTask:table:subjectCode')">
<el-input v-model="searchData.SubjectCode" style="width: 100px" />
</el-form-item>
<!-- <el-form-item style="margin-bottom:10px" label="访视/阅片期名称">
<el-input
v-model="searchData.TaskName"
style="width:100px;"
clearable
/>
</el-form-item> -->
<!-- 任务编号 -->
<el-form-item :label="$t('trials:rereadTask:table:taskCode')">
<el-input
v-model="searchData.TaskCode"
style="width:130px;"
clearable
/>
</el-form-item>
<!-- 任务编号 -->
<el-form-item :label="$t('trials:rereadTask:table:taskCode')">
<el-input
v-model="searchData.TaskCode"
style="width: 130px"
clearable
/>
</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>
<div slot="main-container">
<el-table
v-adaptive="{bottomOffset:75}"
v-loading="loading"
:data="list"
stripe
height="100"
@sort-change="handleSortChange"
<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>
<div slot="main-container">
<el-table
v-adaptive="{ bottomOffset: 75 }"
v-loading="loading"
:data="list"
stripe
height="100"
@sort-change="handleSortChange"
>
<el-table-column type="index" width="40" align="left" />
<!-- 是否加急 -->
<el-table-column
prop="OriginalReReadingTask.IsUrgent"
:label="$t('trials:rereadTask:table:isUrgent')"
show-overflow-tooltip
sortable="custom"
min-width="100"
>
<template slot-scope="scope">
<el-tag
v-if="scope.row.OriginalReReadingTask.IsUrgent"
type="danger"
>{{
$fd("YesOrNo", scope.row.OriginalReReadingTask.IsUrgent)
}}</el-tag
>
<el-table-column type="index" width="40" align="left" />
<!-- 是否加急 -->
<el-table-column
prop="OriginalReReadingTask.IsUrgent"
:label="$t('trials:rereadTask:table:isUrgent')"
show-overflow-tooltip
sortable="custom"
min-width="100"
>
<template slot-scope="scope">
<el-tag v-if="scope.row.OriginalReReadingTask.IsUrgent" type="danger">{{ $fd('YesOrNo', scope.row.OriginalReReadingTask.IsUrgent) }}</el-tag>
<el-tag v-else type="primary">{{ $fd('YesOrNo', scope.row.OriginalReReadingTask.IsUrgent) }}</el-tag>
</template>
</el-table-column>
<!-- 任务编号 -->
<el-table-column
prop="OriginalReReadingTask.TaskCode"
min-width="100"
:label="$t('trials:rereadTask:table:taskCode')"
sortable="custom"
show-overflow-tooltip
/>
<!-- 中心编号 -->
<el-table-column
prop="OriginalReReadingTask.TrialSiteCode"
:label="$t('trials:rereadTask:table:siteCode')"
min-width="100"
sortable="custom"
show-overflow-tooltip
/>
<!-- 受试者编号 -->
<el-table-column
prop="OriginalReReadingTask.SubjectCode"
min-width="100"
:label="$t('trials:rereadTask:table:subjectCode')"
sortable="custom"
show-overflow-tooltip
/>
<el-tag v-else type="primary">{{
$fd("YesOrNo", scope.row.OriginalReReadingTask.IsUrgent)
}}</el-tag>
</template>
</el-table-column>
<!-- 任务编号 -->
<el-table-column
prop="OriginalReReadingTask.TaskCode"
min-width="100"
:label="$t('trials:rereadTask:table:taskCode')"
sortable="custom"
show-overflow-tooltip
/>
<!-- 中心编号 -->
<el-table-column
prop="OriginalReReadingTask.TrialSiteCode"
:label="$t('trials:rereadTask:table:siteCode')"
min-width="100"
sortable="custom"
show-overflow-tooltip
/>
<!-- 受试者编号 -->
<el-table-column
prop="OriginalReReadingTask.SubjectCode"
min-width="100"
:label="$t('trials:rereadTask:table:subjectCode')"
sortable="custom"
show-overflow-tooltip
/>
<!-- 任务名称 -->
<el-table-column
prop="OriginalReReadingTask.TaskName"
min-width="120"
:label="$t('trials:rereadTask:table:taskName')"
sortable="custom"
show-overflow-tooltip
/>
<!-- 阅片标准 -->
<el-table-column
prop="OriginalReReadingTask.TrialReadingCriterionName"
:label="$t('trials:rereadTask:table:criterionName')"
min-width="100"
show-overflow-tooltip
sortable="custom"
/>
<!-- 任务状态 -->
<el-table-column
prop="OriginalReReadingTask.TaskState"
:label="$t('trials:rereadTask:table:taskState')"
min-width="100"
sortable="custom"
show-overflow-tooltip
>
<template slot-scope="scope">
<el-tag v-if="scope.row.OriginalReReadingTask.TaskState === 0" type="primary">{{ $fd('TaskState', scope.row.OriginalReReadingTask.TaskState) }}</el-tag>
<el-tag v-if="scope.row.OriginalReReadingTask.TaskState === 1" type="info">{{ $fd('TaskState', scope.row.OriginalReReadingTask.TaskState) }}</el-tag>
<el-tag v-if="scope.row.OriginalReReadingTask.TaskState === 3" type="danger">{{ $fd('TaskState', scope.row.OriginalReReadingTask.TaskState) }}</el-tag>
<el-tag v-if="scope.row.OriginalReReadingTask.TaskState === 4" type="warning">{{ $fd('TaskState', scope.row.OriginalReReadingTask.TaskState) }}</el-tag>
<el-tag v-if="scope.row.OriginalReReadingTask.TaskState === 5" type="danger">{{ $fd('TaskState', scope.row.OriginalReReadingTask.TaskState) }}</el-tag>
</template>
</el-table-column>
<!-- 任务类型 -->
<el-table-column
prop="OriginalReReadingTask.ReadingCategory"
min-width="100"
:label="$t('trials:rereadTask:table:readingCategory')"
sortable="custom"
show-overflow-tooltip
>
<template slot-scope="scope">
<el-tag v-if="scope.row.OriginalReReadingTask.ReadingCategory === 1" type="primary">{{ $fd('ReadingCategory', scope.row.OriginalReReadingTask.ReadingCategory) }}</el-tag>
<el-tag v-if="scope.row.OriginalReReadingTask.ReadingCategory === 2" type="info">{{ $fd('ReadingCategory', scope.row.OriginalReReadingTask.ReadingCategory) }}</el-tag>
<el-tag v-if="scope.row.OriginalReReadingTask.ReadingCategory === 4" type="danger">{{ $fd('ReadingCategory', scope.row.OriginalReReadingTask.ReadingCategory) }}</el-tag>
<el-tag v-if="scope.row.OriginalReReadingTask.ReadingCategory === 5" type="warning">{{ $fd('ReadingCategory', scope.row.OriginalReReadingTask.ReadingCategory) }}</el-tag>
</template>
</el-table-column>
<!-- 完成阅片时间 -->
<el-table-column
prop="OriginalReReadingTask.SignTime"
min-width="120"
:label="$t('trials:rereadTask:table:signTime')"
sortable="custom"
show-overflow-tooltip
/>
<!-- 重阅申请类型 -->
<el-table-column
prop="RequestReReadingType"
min-width="100"
:label="$t('trials:rereadTask:table:requestReReadingType')"
sortable="custom"
show-overflow-tooltip
>
<template slot-scope="scope">
<div v-if="scope.row.RequestReReadingType">
<el-tag v-if="scope.row.RequestReReadingType === 2" type="danger">{{ $fd('RequestReReadingType', scope.row.RequestReReadingType) }}</el-tag>
<el-tag v-else type="primary">{{ $fd('RequestReReadingType', scope.row.RequestReReadingType) }}</el-tag>
</div>
</template>
</el-table-column>
<!-- 申请时间 -->
<el-table-column
prop="RequestReReadingTime"
min-width="100"
:label="$t('trials:rereadTask:table:requestReReadingTime')"
sortable="custom"
show-overflow-tooltip
/>
<!-- 申请退回原因 -->
<el-table-column
prop="RequestReReadingReason"
min-width="100"
:label="$t('trials:rereadTask:table:requestReReadingReason')"
show-overflow-tooltip
/>
<!-- 审批结果 -->
<el-table-column
prop="RequestReReadingResultEnum"
min-width="100"
:label="$t('trials:rereadTask:table:requestReReadingResultEnum')"
sortable="custom"
show-overflow-tooltip
>
<template slot-scope="scope">
<div v-if="scope.row.RequestReReadingResultEnum || scope.row.RequestReReadingResultEnum === 0">
<el-tooltip v-if="scope.row.RequestReReadingResultEnum === 2" class="item" effect="dark" placement="top">
<div slot="content">
{{ scope.row.RequestReReadingRejectReason }}
</div>
<el-tag type="danger">{{ $fd('RequestReReadingResult', scope.row.RequestReReadingResultEnum) }}</el-tag>
</el-tooltip>
<el-tag v-if="scope.row.RequestReReadingResultEnum === 1" type="primary">{{ $fd('RequestReReadingResult', scope.row.RequestReReadingResultEnum) }}</el-tag>
<el-tag v-if="scope.row.RequestReReadingResultEnum === 0" type="warning">{{ $fd('RequestReReadingResult', scope.row.RequestReReadingResultEnum) }}</el-tag>
</div>
</template>
</el-table-column>
<!-- 新任务编号 -->
<el-table-column
prop="ReReadingNewTaskCode"
:label="$t('trials:rereadTask:table:reReadingNewTaskCode')"
min-width="120"
sortable="custom"
show-overflow-tooltip
/>
</el-table>
<!-- 分页组件 -->
<pagination class="page" :total="total" :page.sync="searchData.PageIndex" :limit.sync="searchData.PageSize" @pagination="getList" />
<el-dialog
v-if="ConfirmReReadingVisible"
title="驳回"
:visible.sync="ConfirmReReadingVisible"
width="600px"
append-to-body
:close-on-click-modal="false"
custom-class="base-dialog-wrapper"
<!-- 任务名称 -->
<el-table-column
prop="OriginalReReadingTask.TaskName"
min-width="120"
:label="$t('trials:rereadTask:table:taskName')"
sortable="custom"
show-overflow-tooltip
/>
<!-- 阅片标准 -->
<el-table-column
prop="OriginalReReadingTask.TrialReadingCriterionName"
:label="$t('trials:rereadTask:table:criterionName')"
min-width="100"
show-overflow-tooltip
sortable="custom"
/>
<!-- 任务状态 -->
<el-table-column
prop="OriginalReReadingTask.TaskState"
:label="$t('trials:rereadTask:table:taskState')"
min-width="100"
sortable="custom"
show-overflow-tooltip
>
<template slot-scope="scope">
<el-tag
v-if="scope.row.OriginalReReadingTask.TaskState === 0"
type="primary"
>{{
$fd("TaskState", scope.row.OriginalReReadingTask.TaskState)
}}</el-tag
>
<div style="padding:10px;border: 1px solid #e0e0e0;max-height:650px;overflow-y: auto;">
<el-form
ref="reasonForm"
:rules="rules"
:model="ConfirmReReadingForm"
class="demo-ruleForm"
size="small"
label-width="120px"
>
<el-form-item label="驳回原因" prop="RequestReReadingRejectReason">
<el-input
v-model="ConfirmReReadingForm.RequestReReadingRejectReason"
type="textarea"
:autosize="{ minRows: 2, maxRows: 4}"
:placeholder="$t('common:ruleMessage:specify')"
maxlength="500"
show-word-limit
/>
</el-form-item>
</el-form>
</div>
<div slot="footer" class="dialog-footer">
<!-- 取消 -->
<el-button :disabled="btnLoading" size="small" type="primary" @click="ConfirmReReadingVisible = false;ConfirmReReadingForm = { RequestReReadingRejectReason: null }">
{{ $t('common:button:cancel') }}
</el-button>
<!-- 保存 -->
<el-button :loading="btnLoading" size="small" type="primary" @click="handleConfirmReReading(rowData, 2)">
{{ $t('common:button:save') }}
</el-button>
</div>
</el-dialog>
</div>
<el-tag
v-if="scope.row.OriginalReReadingTask.TaskState === 1"
type="info"
>{{
$fd("TaskState", scope.row.OriginalReReadingTask.TaskState)
}}</el-tag
>
<el-tag
v-if="scope.row.OriginalReReadingTask.TaskState === 3"
type="danger"
>{{
$fd("TaskState", scope.row.OriginalReReadingTask.TaskState)
}}</el-tag
>
<el-tag
v-if="scope.row.OriginalReReadingTask.TaskState === 4"
type="warning"
>{{
$fd("TaskState", scope.row.OriginalReReadingTask.TaskState)
}}</el-tag
>
<el-tag
v-if="scope.row.OriginalReReadingTask.TaskState === 5"
type="danger"
>{{
$fd("TaskState", scope.row.OriginalReReadingTask.TaskState)
}}</el-tag
>
</template>
</el-table-column>
<!-- 任务类型 -->
<el-table-column
prop="OriginalReReadingTask.ReadingCategory"
min-width="100"
:label="$t('trials:rereadTask:table:readingCategory')"
sortable="custom"
show-overflow-tooltip
>
<template slot-scope="scope">
<el-tag
v-if="scope.row.OriginalReReadingTask.ReadingCategory === 1"
type="primary"
>{{
$fd(
"ReadingCategory",
scope.row.OriginalReReadingTask.ReadingCategory
)
}}</el-tag
>
<el-tag
v-if="scope.row.OriginalReReadingTask.ReadingCategory === 2"
type="info"
>{{
$fd(
"ReadingCategory",
scope.row.OriginalReReadingTask.ReadingCategory
)
}}</el-tag
>
<el-tag
v-if="scope.row.OriginalReReadingTask.ReadingCategory === 4"
type="danger"
>{{
$fd(
"ReadingCategory",
scope.row.OriginalReReadingTask.ReadingCategory
)
}}</el-tag
>
<el-tag
v-if="scope.row.OriginalReReadingTask.ReadingCategory === 5"
type="warning"
>{{
$fd(
"ReadingCategory",
scope.row.OriginalReReadingTask.ReadingCategory
)
}}</el-tag
>
</template>
</el-table-column>
<!-- 完成阅片时间 -->
<el-table-column
prop="OriginalReReadingTask.SignTime"
min-width="120"
:label="$t('trials:rereadTask:table:signTime')"
sortable="custom"
show-overflow-tooltip
/>
<!-- 重阅申请类型 -->
<el-table-column
prop="RequestReReadingType"
min-width="100"
:label="$t('trials:rereadTask:table:requestReReadingType')"
sortable="custom"
show-overflow-tooltip
>
<template slot-scope="scope">
<div v-if="scope.row.RequestReReadingType">
<el-tag
v-if="scope.row.RequestReReadingType === 2"
type="danger"
>{{
$fd("RequestReReadingType", scope.row.RequestReReadingType)
}}</el-tag
>
<el-tag v-else type="primary">{{
$fd("RequestReReadingType", scope.row.RequestReReadingType)
}}</el-tag>
</div>
</template>
</el-table-column>
<!-- 申请时间 -->
<el-table-column
prop="RequestReReadingTime"
min-width="100"
:label="$t('trials:rereadTask:table:requestReReadingTime')"
sortable="custom"
show-overflow-tooltip
/>
<!-- 申请退回原因 -->
<el-table-column
prop="RequestReReadingReason"
min-width="100"
:label="$t('trials:rereadTask:table:requestReReadingReason')"
show-overflow-tooltip
/>
<!-- 审批结果 -->
<el-table-column
prop="RequestReReadingResultEnum"
min-width="100"
:label="$t('trials:rereadTask:table:requestReReadingResultEnum')"
sortable="custom"
show-overflow-tooltip
>
<template slot-scope="scope">
<div
v-if="
scope.row.RequestReReadingResultEnum ||
scope.row.RequestReReadingResultEnum === 0
"
>
<el-tooltip
v-if="scope.row.RequestReReadingResultEnum === 2"
class="item"
effect="dark"
placement="top"
>
<div slot="content">
{{ scope.row.RequestReReadingRejectReason }}
</div>
<el-tag type="danger">{{
$fd(
"RequestReReadingResult",
scope.row.RequestReReadingResultEnum
)
}}</el-tag>
</el-tooltip>
<el-tag
v-if="scope.row.RequestReReadingResultEnum === 1"
type="primary"
>{{
$fd(
"RequestReReadingResult",
scope.row.RequestReReadingResultEnum
)
}}</el-tag
>
<el-tag
v-if="scope.row.RequestReReadingResultEnum === 0"
type="warning"
>{{
$fd(
"RequestReReadingResult",
scope.row.RequestReReadingResultEnum
)
}}</el-tag
>
</div>
</template>
</el-table-column>
<!-- 新任务编号 -->
<el-table-column
prop="ReReadingNewTaskCode"
:label="$t('trials:rereadTask:table:reReadingNewTaskCode')"
min-width="120"
sortable="custom"
show-overflow-tooltip
/>
</el-table>
<!-- 分页组件 -->
<pagination
class="page"
:total="total"
:page.sync="searchData.PageIndex"
:limit.sync="searchData.PageSize"
@pagination="getList"
/>
<el-dialog
v-if="ConfirmReReadingVisible"
title="驳回"
:visible.sync="ConfirmReReadingVisible"
width="600px"
append-to-body
:close-on-click-modal="false"
custom-class="base-dialog-wrapper"
>
<div
style="
padding: 10px;
border: 1px solid #e0e0e0;
max-height: 650px;
overflow-y: auto;
"
>
<el-form
ref="reasonForm"
:rules="rules"
:model="ConfirmReReadingForm"
class="demo-ruleForm"
size="small"
label-width="120px"
>
<el-form-item label="驳回原因" prop="RequestReReadingRejectReason">
<el-input
v-model="ConfirmReReadingForm.RequestReReadingRejectReason"
type="textarea"
:autosize="{ minRows: 2, maxRows: 4 }"
:placeholder="$t('common:ruleMessage:specify')"
maxlength="500"
show-word-limit
/>
</el-form-item>
</el-form>
</div>
</el-tab-pane>
</el-tabs>
<div slot="footer" class="dialog-footer">
<!-- 取消 -->
<el-button
:disabled="btnLoading"
size="small"
type="primary"
@click="
ConfirmReReadingVisible = false;
ConfirmReReadingForm = { RequestReReadingRejectReason: null };
"
>
{{ $t("common:button:cancel") }}
</el-button>
<!-- 保存 -->
<el-button
:loading="btnLoading"
size="small"
type="primary"
@click="handleConfirmReReading(rowData, 2)"
>
{{ $t("common:button:save") }}
</el-button>
</div>
</el-dialog>
</div>
</BaseContainer>
</template>
<script>
import { getIRReReadingTaskList, getTrialSiteSelect } from '@/api/trials'
import { confirmReReading, getTrialCriterionList } from '@/api/trials/reading'
import BaseContainer from '@/components/BaseContainer'
import Pagination from '@/components/Pagination'
import { changeURLStatic } from '@/utils/history.js'
import { getIRReReadingTaskList, getTrialSiteSelect } from "@/api/trials";
import { confirmReReading, getTrialCriterionList } from "@/api/trials/reading";
import BaseContainer from "@/components/BaseContainer";
import Pagination from "@/components/Pagination";
import { changeURLStatic } from "@/utils/history.js";
const searchDataDefault = () => {
return {
SubjectCode: '',
TaskCode: '',
SubjectCode: "",
TaskCode: "",
PageIndex: 1,
PageSize: 20
}
}
PageSize: 20,
};
};
export default {
name: 'RereadTask',
name: "RereadTask",
components: { BaseContainer, Pagination },
data() {
return {
@ -285,146 +429,166 @@ export default {
siteOptions: [],
total: 0,
loading: false,
trialId: '',
trialId: "",
ConfirmReReadingForm: {
RequestReReadingRejectReason: null
RequestReReadingRejectReason: null,
},
rules: {
RequestReReadingRejectReason: [{ required: true, message: this.$t('common:ruleMessage:specify'), trigger: 'blur' }]
RequestReReadingRejectReason: [
{
required: true,
message: this.$t("common:ruleMessage:specify"),
trigger: "blur",
},
],
},
ConfirmReReadingVisible: false,
trialCriterionList: [],
TrialReadingCriterionId: '0'
}
TrialReadingCriterionId: "0",
};
},
watch: {
TrialReadingCriterionId(v) {
if (v) {
this.getList()
this.getList();
}
}
},
},
mounted() {
if (this.$route.query.SiteId) {
this.searchData.SiteId = this.$route.query.SiteId
this.searchData.SubjectCode = this.$route.query.SubjectCode
this.searchData.TaskName = this.$route.query.TaskName
changeURLStatic('SiteId', '')
changeURLStatic('SubjectCode', '')
changeURLStatic('TaskName', '')
this.searchData.SiteId = this.$route.query.SiteId;
this.searchData.SubjectCode = this.$route.query.SubjectCode;
this.searchData.TaskName = this.$route.query.TaskName;
changeURLStatic("SiteId", "");
changeURLStatic("SubjectCode", "");
changeURLStatic("TaskName", "");
}
this.trialId = this.$route.query.trialId
this.getSite()
this.trialId = this.$route.query.trialId;
this.getSite();
// this.getList()
this.getTrialCriterionList()
this.getTrialCriterionList();
},
methods: {
getTrialCriterionList() {
getTrialCriterionList(this.trialId).then(res => {
this.trialCriterionList = res.Result
this.TrialReadingCriterionId = this.trialCriterionList[0].TrialReadingCriterionId
}).catch(() => {})
getTrialCriterionList(this.trialId)
.then((res) => {
this.trialCriterionList = res.Result;
this.TrialReadingCriterionId =
this.trialCriterionList[0].TrialReadingCriterionId;
})
.catch(() => {});
},
getSite() {
getTrialSiteSelect(this.trialId).then(res => {
this.siteOptions = res.Result
})
getTrialSiteSelect(this.trialId).then((res) => {
this.siteOptions = res.Result;
});
},
getList() {
this.loading = true
this.searchData.TrialId = this.trialId
this.searchData.TrialReadingCriterionId = this.TrialReadingCriterionId
getIRReReadingTaskList(this.searchData).then(res => {
this.list = res.Result.CurrentPageData
this.total = res.Result.TotalCount
this.loading = false
}).catch(() => { this.loading = false })
this.loading = true;
this.searchData.TrialId = this.trialId;
this.searchData.TrialReadingCriterionId = this.TrialReadingCriterionId;
getIRReReadingTaskList(this.searchData)
.then((res) => {
this.list = res.Result.CurrentPageData;
this.total = res.Result.TotalCount;
this.loading = false;
})
.catch(() => {
this.loading = false;
});
},
handleSearch() {
this.searchData.PageIndex = 1
this.getList()
this.searchData.PageIndex = 1;
this.getList();
},
handleReset() {
this.searchData = searchDataDefault()
this.getList()
this.searchData = searchDataDefault();
this.getList();
},
handleConfirmReReading(row, type, open) {
if (open) {
this.rowData = { ...row }
this.ConfirmReReadingVisible = true
this.rowData = { ...row };
this.ConfirmReReadingVisible = true;
this.ConfirmReReadingForm = {
RequestReReadingRejectReason: null
}
return
RequestReReadingRejectReason: null,
};
return;
}
if (type === 2) {
this.$refs.reasonForm.validate((valid) => {
if (!valid) return
if (!valid) return;
var params = {
ConfirmReReadingList: [
{
Id: row.Id,
OriginalReReadingTaskId: row.OriginalReReadingTaskId,
RootReReadingTaskId: row.RootReReadingTaskId,
NewReReadingTaskId: row.NewReReadingTaskId
}
NewReReadingTaskId: row.NewReReadingTaskId,
},
],
RequestReReadingRejectReason: this.ConfirmReReadingForm.RequestReReadingRejectReason,
RequestReReadingRejectReason:
this.ConfirmReReadingForm.RequestReReadingRejectReason,
TrialId: this.$route.query.trialId,
RequestReReadingResultEnum: type
}
this.loading = true
this.btnLoading = true
confirmReReading(params).then(() => {
this.loading = false
this.btnLoading = false
this.$message.success(`${type === 1 ? '同意' : '拒绝'}申请成功`)
this.getList()
this.ConfirmReReadingVisible = false
}).catch(() => {
this.loading = false
this.btnLoading = false
})
})
return
RequestReReadingResultEnum: type,
};
this.loading = true;
this.btnLoading = true;
confirmReReading(params)
.then(() => {
this.loading = false;
this.btnLoading = false;
this.$message.success(`${type === 1 ? "同意" : "拒绝"}申请成功`);
this.getList();
this.ConfirmReReadingVisible = false;
})
.catch(() => {
this.loading = false;
this.btnLoading = false;
});
});
return;
}
this.$confirm(`确定${type === 1 ? '同意' : '拒绝'}该重阅申请?`).then(() => {
var params = {
ConfirmReReadingList: [
{
Id: row.Id,
OriginalReReadingTaskId: row.OriginalReReadingTaskId,
RootReReadingTaskId: row.RootReReadingTaskId,
NewReReadingTaskId: row.NewReReadingTaskId
}
],
TrialId: this.$route.query.trialId,
RequestReReadingResultEnum: type
this.$confirm(`确定${type === 1 ? "同意" : "拒绝"}该重阅申请?`).then(
() => {
var params = {
ConfirmReReadingList: [
{
Id: row.Id,
OriginalReReadingTaskId: row.OriginalReReadingTaskId,
RootReReadingTaskId: row.RootReReadingTaskId,
NewReReadingTaskId: row.NewReReadingTaskId,
},
],
TrialId: this.$route.query.trialId,
RequestReReadingResultEnum: type,
};
this.loading = true;
this.btnLoading = true;
confirmReReading(params)
.then(() => {
this.loading = false;
this.btnLoading = false;
this.$message.success(`${type === 1 ? "同意" : "拒绝"}申请成功`);
this.getList();
})
.catch(() => {
this.loading = false;
this.btnLoading = false;
});
}
this.loading = true
this.btnLoading = true
confirmReReading(params).then(() => {
this.loading = false
this.btnLoading = false
this.$message.success(`${type === 1 ? '同意' : '拒绝'}申请成功`)
this.getList()
}).catch(() => {
this.loading = false
this.btnLoading = false
})
})
);
},
//
handleSortChange(column) {
if (column.order === 'ascending') {
this.searchData.Asc = true
if (column.order === "ascending") {
this.searchData.Asc = true;
} else {
this.searchData.Asc = false
this.searchData.Asc = false;
}
this.searchData.SortField = column.prop
this.searchData.PageIndex = 1
this.getList()
}
}
}
this.searchData.SortField = column.prop;
this.searchData.PageIndex = 1;
this.getList();
},
},
};
</script>

View File

@ -0,0 +1,114 @@
<template>
<el-dialog
:visible.sync="visible"
:close-on-click-modal="false"
:title="`${$t('trials:study:button:editVisit')}(1 | 2 | 3)`"
width="500px"
custom-class="base-dialog-wrapper"
append-to-body
>
<el-form
ref="editVisitForm"
:model="form"
:rules="rules"
size="small"
label-width="100px"
>
<div class="base-dialog-body">
<!--患者姓名-->
<el-form-item
:label="$t('trials:uploadDicomList:table:patientName')"
prop="reason"
>
<el-input v-model="form.reason" disabled />
</el-form-item>
<!--访视-->
<el-form-item
:label="$t('trials:auditRecord:table:visit')"
prop="visit"
>
<el-select v-model="form.visit" clearable>
<el-option
v-for="item of $d.sex"
:key="item.id"
:label="item.label"
:value="item.value"
>
</el-option>
</el-select>
</el-form-item>
</div>
<div
class="base-dialog-footer"
style="text-align: right; margin-top: 10px"
>
<el-form-item style="text-align: right">
<el-button
size="small"
type="primary"
:disabled="btnLoading"
@click="handleCancel"
>
{{ $t("common:button:cancel") }}
</el-button>
<el-button
size="small"
type="primary"
:loading="btnLoading"
@click="handleSave"
>
{{ $t("common:button:save") }}
</el-button>
</el-form-item>
</div>
</el-form>
</el-dialog>
</template>
<script>
export default {
name: "editVisitDialog",
props: {
visible: {
require: true,
default: false,
},
},
data() {
return {
form: {
visit: null,
},
rules: {
visit: [
{
required: true,
message: this.$t("trials:study:formRlue:selectVisit"),
trigger: "blur",
},
],
},
btnLoading: false,
};
},
methods: {
//
handleCancel() {
this.$emit("update:visible", false);
},
//
async handleSave() {
try {
let validate = await this.$refs.editVisitForm.validate();
if (!validate) return;
} catch (err) {
console.log(err);
}
},
},
};
</script>
<style lang="scss" scoped>
::v-deep .el-select {
width: 100%;
}
</style>

View File

@ -3,28 +3,16 @@
<!-- 搜索框 -->
<template slot="search-container">
<el-form :inline="true">
<!-- Site -->
<el-form-item :label="$t('trials:studyList:table:siteId')">
<el-select
v-model="searchData.SiteId"
clearable
filterable
style="width:150px"
>
<el-option
v-for="item of siteOptions"
:key="item.SiteId"
:label="item.TrialSiteCode"
:value="item.SiteId"
/>
</el-select>
<!-- 受试者编号 -->
<el-form-item :label="$t('trials:subject:table:subjectId')">
<el-input v-model="searchData.SubjectInfo" style="width: 140px" />
</el-form-item>
<!-- Subject -->
<el-form-item :label="$t('trials:studyList:table:subject')">
<el-input v-model="searchData.SubjectInfo" style="width:140px" />
<!-- 患者姓名 -->
<el-form-item :label="$t('trials:uploadDicomList:table:patientName')">
<el-input v-model="searchData.SubjectInfo" style="width: 140px" />
</el-form-item>
<!-- Visit -->
<el-form-item :label="$t('trials:studyList:table:visit')">
<!-- 性别 -->
<el-form-item :label="$t('trials:subject:table:gender')">
<el-select
v-model="searchData.VisitPlanArray"
clearable
@ -33,253 +21,231 @@
collapse-tags
>
<el-option
v-for="(item, index) of visitPlanOptions"
:key="index"
:label="item.VisitName"
:value="item.VisitNum"
v-for="item of $d.sex"
:key="item.id"
:label="item.label"
:value="item.value"
>
<span style="float: left">{{ item.VisitName }}</span>
</el-option>
</el-select>
</el-form-item>
<!-- 申请号 -->
<el-form-item :label="$t('trials:study:form:accessionNumber')">
<el-input v-model="searchData.SubjectInfo" style="width: 140px" />
</el-form-item>
<!-- 检查设备 -->
<el-form-item :label="$t('trials:studyList:table:modality')">
<el-select
v-model="searchData.VisitPlanArray"
clearable
filterable
multiple
collapse-tags
>
<el-option
key="Other"
label="Out of Plan"
value="1.11"
/>
v-for="item of $d.sex"
:key="item.id"
:label="item.label"
:value="item.value"
>
</el-option>
</el-select>
</el-form-item>
<!-- 检查类型 -->
<el-form-item :label="$t('trials:seletctedReviews:form:modality')">
<el-select
v-model="searchData.VisitPlanArray"
clearable
filterable
multiple
collapse-tags
>
<el-option
v-for="item of $d.sex"
:key="item.id"
:label="item.label"
:value="item.value"
>
</el-option>
</el-select>
</el-form-item>
<!-- 检查日期 -->
<el-form-item :label="$t('trials:audit:table:studyDate')">
<el-date-picker
v-model="searchData.date"
type="daterange"
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期"
>
</el-date-picker>
</el-form-item>
<!-- 状态 -->
<el-form-item :label="$t('trials:seletctedReviews:table:status')">
<el-select
v-model="searchData.VisitPlanArray"
clearable
filterable
multiple
collapse-tags
>
<el-option
v-for="item of $d.sex"
:key="item.id"
:label="item.label"
:value="item.value"
>
</el-option>
</el-select>
</el-form-item>
<el-form-item>
<!-- 查询 -->
<el-button type="primary" icon="el-icon-search" @click="handleSearch">
{{ $t('common:button:search') }}
{{ $t("common:button:search") }}
</el-button>
<!-- 重置 -->
<el-button type="primary" icon="el-icon-refresh-left" @click="handleReset">
{{ $t('common:button:reset') }}
<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}"
v-adaptive="{ bottomOffset: 60 }"
:data="list"
stripe
height="100"
@sort-change="handleSortByColumn"
>
<el-table-column type="index" width="40" />
<!-- Study ID -->
<!-- 受试者编号 -->
<el-table-column
prop="StudyCode"
:label="$t('trials:studyList:table:studyId')"
:label="$t('trials:subject:table:subjectId')"
show-overflow-tooltip
sortable="custom"
min-width="100"
/>
<!-- Image Type -->
<!-- 患者编号 -->
<el-table-column
prop="IsDicom"
:label="$t('trials:studyList:table:imageType')"
prop="StudyCode"
:label="$t('trials:uploadDicomList:table:pId')"
show-overflow-tooltip
sortable="custom"
min-width="100"
>
<template slot-scope="scope">
<el-tag v-if="scope.row.IsDicom" type="primary">DICOM</el-tag>
<el-tag v-else type="danger">Non-DICOM</el-tag>
</template>
</el-table-column>
<el-table-column
prop="StudyTime"
sortable="custom"
min-width="200"
show-overflow-tooltip
>
<template slot="header">
<el-tooltip placement="top">
<!-- Modality,Body Part Examined,Count,Study Date -->
<!-- Study Info -->
<div slot="content">
{{ `${$t('trials:studyList:table:modality')}, ${$t('trials:studyList:table:bodyPart')}, ${$t('trials:studyList:table:studyDate')}, ${$t('trials:studyList:table:count')}` }}
</div>
<span>{{ $t('trials:studyList:table:studyInfo') }}</span>
</el-tooltip>
</template>
<template slot-scope="scope">
<div style="display: flex;align-items: center">
<div v-if="scope.row.Modalities">{{ scope.row.Modalities }}({{ scope.row.Count }}), </div>
<div v-else style="color:#f44336;">N/A, </div>
<div v-if="scope.row.Bodypart" style="margin:0 3px;">{{ getBodyPart(scope.row.Bodypart) }}, </div>
<div v-else style="color:#f44336;margin:0 3px;">N/A, </div>
<div v-if="scope.row.StudyTime">{{ moment(scope.row.StudyTime).format('YYYY-MM-DD') }} </div>
<div v-else style="color:#f44336;">N/A </div>
<div>
<!-- <el-popover v-if="scope.row.Count && scope.row.IsDicom" trigger="click" placement="bottom">
<el-table v-loading="seriesLoading" :data="seriesList" height="200" size="small" class="seriesListOfStudy">
<el-table-column
prop="SeriesNumber"
:label="$t('trials:studyList:table:seriesNum')"
width="120"
/>
<el-table-column prop="Modality" :label="$t('trials:studyList:table:modality')" width="120" />
<el-table-column
prop="Description"
:label="$t('trials:studyList:table:description')"
width="150"
show-overflow-tooltip
/>
<el-table-column
prop="SliceThickness"
:label="$t('trials:studyList:table:sliceThickness')"
width="120"
/>
<el-table-column
prop="InstanceCount"
:label="$t('trials:studyList:table:instanceCount')"
width="120"
/>
<el-table-column :label="$t('common:action:action')" width="80">
<template slot-scope="series">
<router-link
style="color: #428bca; padding: 2px 5px"
tag="a"
:to="{
path: `/showdicom?studyId=${scope.row.Id}&studyCode=${scope.row.StudyCode}&modality=${scope.row.Modalities}&description=${scope.row.Description}&series=${JSON.stringify(series.row)}&type=Series&TokenKey=${tokenKey}`,
}"
target="_blank"
>
{{ $t('trials:studyList:button:view') }}
</router-link>
</template>
</el-table-column>
</el-table>
<div slot="reference" class="name-wrapper">
<span style="color:#428bca;cursor:pointer;" @click="handleGetseriesList(scope.row)">
{{ `${scope.row.Count}` }}
</span>
</div>
</el-popover>
<el-button
v-else-if="scope.row.Count && !scope.row.IsDicom"
type="text"
@click.native.prevent="handlePreviewNonDicom(scope.row)"
>
{{ scope.row.Count }}
</el-button> -->
<!-- <span>({{ scope.row.Count }})</span> -->
<!-- <span v-else style="color:#f44336;">N/A</span> -->
</div>
</div>
</template>
</el-table-column>
<el-table-column
min-width="100"
show-overflow-tooltip
>
<template slot="header">
<el-tooltip placement="top">
<div slot="content">
{{ `${$t('trials:studyList:table:visitName')}, ${$t('trials:studyList:table:visitNum')}` }}<br>
</div>
<span>{{ $t('trials:studyList:table:visit') }}</span>
</el-tooltip>
</template>
<template slot-scope="scope">
<span v-if="scope.row.VisitName">{{ scope.row.VisitName }}, </span>
<span v-else style="color:#f44336;">N/A, </span>
<span>{{ scope.row.VisitNum }}</span>
</template>
</el-table-column>
<el-table-column
prop="SubjectCode"
:label="$t('trials:studyList:table:subject')"
sortable="custom"
show-overflow-tooltip
/>
<!-- 患者姓名 -->
<el-table-column
min-width="100"
prop="StudyCode"
:label="$t('trials:uploadDicomList:table:patientName')"
show-overflow-tooltip
>
<template slot="header">
<el-tooltip placement="top">
<div slot="content">
{{ `${$t('trials:studyList:table:siteId')}, ${$t('trials:studyList:table:siteName')}` }}
</div>
<span>{{ $t('trials:studyList:table:site') }}</span>
</el-tooltip>
</template>
<template slot-scope="scope">
<span v-if="scope.row.TrialSiteCode">{{ scope.row.TrialSiteCode }}, </span>
<span v-else style="color:#f44336;">N/A, </span>
<span v-if="scope.row.TrialSiteAliasName">{{ scope.row.TrialSiteAliasName }}</span>
<span v-else style="color:#f44336;">N/A</span>
</template>
</el-table-column>
sortable="custom"
min-width="100"
/>
<!-- 性别 -->
<el-table-column
prop="Uploader"
:label="$t('trials:studyList:table:uploader')"
prop="StudyCode"
:label="$t('trials:subject:table:gender')"
show-overflow-tooltip
sortable="custom"
min-width="100"
/>
<!-- 申请号 -->
<el-table-column
prop="StudyCode"
:label="$t('trials:study:form:accessionNumber')"
show-overflow-tooltip
sortable="custom"
min-width="100"
/>
<!-- 检查设备 -->
<el-table-column
prop="StudyCode"
:label="$t('trials:studyList:table:modality')"
show-overflow-tooltip
sortable="custom"
min-width="100"
/>
<!-- 检查类型 -->
<el-table-column
prop="StudyCode"
:label="$t('trials:audit:table:modality')"
show-overflow-tooltip
sortable="custom"
min-width="100"
/>
<!-- 检查日期 -->
<el-table-column
prop="StudyCode"
:label="$t('trials:audit:table:studyDate')"
show-overflow-tooltip
sortable="custom"
min-width="100"
/>
<!-- 访视 -->
<el-table-column
prop="StudyCode"
:label="$t('trials:auditRecord:table:visit')"
show-overflow-tooltip
sortable="custom"
min-width="100"
/>
<el-table-column
prop="UploadTime"
:label="$t('trials:studyList:table:uploadTime')"
show-overflow-tooltip
sortable="custom"
min-width="120"
/>
<el-table-column :label="$t('common:action:action')" min-width="100" fixed="right">
:label="$t('common:action:action')"
min-width="100"
fixed="right"
>
<template slot-scope="scope">
<!-- 查看 -->
<el-button
:disabled="!scope.row.Count"
circle
:title="$t('trials:studyList:button:view')"
icon="el-icon-view"
type="text"
@click="handleViewStudy(scope.row)"
/>
<!-- 分享检查 -->
<el-button
v-hasPermi="['trials:trials-panel:study:share']"
:disabled="!(scope.row.Count > 0 && scope.row.IsDicom)"
circle
:title="$t('trials:studyList:action:share')"
icon="el-icon-share"
@click="handleShareImage(scope.row)"
/>
>{{ $t("trials:studyList:button:view") }}</el-button
>
<!-- 修改访视 -->
<el-button type="text" @click="editVisitFn(scope.row)">{{
$t("trials:study:button:editVisit")
}}</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页组件 -->
<pagination class="page" :total="total" :page.sync="searchData.PageIndex" :limit.sync="searchData.PageSize" @pagination="getList" />
<pagination
class="page"
:total="total"
:page.sync="searchData.PageIndex"
:limit.sync="searchData.PageSize"
@pagination="getList"
/>
</template>
<base-model :config="share_model">
<template slot="dialog-body">
<div>
<i style="color:#428bca;" class="el-icon-success" />
<i style="color: #428bca" class="el-icon-success" />
<span>成功创建分享链接</span>
</div>
<div style="margin:10px 0;">
链接<el-input v-model="shareLink" readonly style="width:420px;" />
<div style="margin: 10px 0">
链接<el-input v-model="shareLink" readonly style="width: 420px" />
</div>
<div style="margin-bottom:20px;">
提取码 <el-input v-model="extractionCode" style="width:100px;" readonly />
<div style="margin-bottom: 20px">
提取码
<el-input v-model="extractionCode" style="width: 100px" readonly />
</div>
<div>
<el-button type="primary" round @click="copyCode"></el-button>
<el-button type="primary" round @click="copyCode"
>复制链接及提取码</el-button
>
</div>
</template>
</base-model>
@ -293,11 +259,17 @@
append-to-body
custom-class="base-dialog-wrapper"
>
<div class="base-modal-body" style="border:2px solid #ccc;padding: 10px">
<NonDicomPreview v-if="previewNonDicomVisible" :none-dicom-id="rowData.Id" />
<div
class="base-modal-body"
style="border: 2px solid #ccc; padding: 10px"
>
<NonDicomPreview
v-if="previewNonDicomVisible"
:none-dicom-id="rowData.Id"
/>
</div>
</el-dialog>
<editVisit :visible.sync="editVisitVisible" />
</BaseContainer>
</template>
<script>
@ -306,29 +278,35 @@ import {
getTrialSiteSelect,
getSeriesList,
getTrialVisitStageSelect,
getNoneDicomStudyFileList
} from '@/api/trials'
import { createImageShare } from '@/api/share'
import BaseContainer from '@/components/BaseContainer'
import Pagination from '@/components/Pagination'
import BaseModel from '@/components/BaseModel'
import NonDicomPreview from './components/nonDicomPreview'
import moment from 'moment'
import { getToken } from '@/utils/auth'
getNoneDicomStudyFileList,
} from "@/api/trials";
import { createImageShare } from "@/api/share";
import BaseContainer from "@/components/BaseContainer";
import Pagination from "@/components/Pagination";
import BaseModel from "@/components/BaseModel";
import NonDicomPreview from "./components/nonDicomPreview";
import editVisit from "./components/edit-visit";
import moment from "moment";
import { getToken } from "@/utils/auth";
const searchDataDefault = () => {
return {
SubjectInfo: '',
SubjectInfo: "",
VisitPlanArray: [],
Status: '',
SiteId: '',
Status: "",
SiteId: "",
PageIndex: 1,
PageSize: 20
}
}
PageSize: 20,
};
};
export default {
name: 'StudyList',
components: { BaseContainer, Pagination, BaseModel, NonDicomPreview },
name: "StudyList",
components: {
BaseContainer,
Pagination,
BaseModel,
NonDicomPreview,
editVisit,
},
data() {
return {
searchData: searchDataDefault(),
@ -340,191 +318,213 @@ export default {
seriesList: [],
nonDicomfilesList: [],
rowData: {},
userTypeEnumInt: zzSessionStorage.getItem('userTypeEnumInt') * 1,
share_model: { visible: false, title: '影像分享', showClose: true, width: '500px' },
shareLink: '',
extractionCode: '',
userTypeEnumInt: zzSessionStorage.getItem("userTypeEnumInt") * 1,
share_model: {
visible: false,
title: "影像分享",
showClose: true,
width: "500px",
},
shareLink: "",
extractionCode: "",
moment,
filesLoading: '',
seriesLoading: '',
filesLoading: "",
seriesLoading: "",
previewNonDicomVisible: false,
trialId: this.$route.query.trialId,
tokenKey: getToken(),
openWindow: null
}
openWindow: null,
editVisitVisible: false,
};
},
mounted() {
this.getSite()
this.getVisitPlanOptions()
this.getList()
this.getSite();
this.getVisitPlanOptions();
this.getList();
},
methods: {
// 访
editVisitFn() {
this.editVisitVisible = true;
},
//
getList() {
this.loading = true
this.searchData.TrialId = this.trialId
this.loading = true;
this.searchData.TrialId = this.trialId;
getDicomAndNoneDicomStudyList(this.searchData)
.then((res) => {
this.loading = false
this.list = res.Result.CurrentPageData
this.total = res.Result.TotalCount
this.loading = false;
this.list = res.Result.CurrentPageData;
this.total = res.Result.TotalCount;
})
.catch(() => {
this.loading = false
})
this.loading = false;
});
},
// Dicom
handleGetseriesList(row) {
this.seriesLoading = true
this.seriesList = []
getSeriesList(row.Id).then((res) => {
this.seriesLoading = false
this.seriesList = res.Result
}).catch(() => {
this.seriesLoading = false
})
this.seriesLoading = true;
this.seriesList = [];
getSeriesList(row.Id)
.then((res) => {
this.seriesLoading = false;
this.seriesList = res.Result;
})
.catch(() => {
this.seriesLoading = false;
});
},
// Dicom
handleGetFilesList(id) {
this.filesLoading = true
getNoneDicomStudyFileList(id).then(res => {
this.nonDicomfilesList = res.Result
this.filesLoading = false
}).catch(() => { this.filesLoading = false })
this.filesLoading = true;
getNoneDicomStudyFileList(id)
.then((res) => {
this.nonDicomfilesList = res.Result;
this.filesLoading = false;
})
.catch(() => {
this.filesLoading = false;
});
},
//
handleViewStudy(row) {
if (this.openWindow) {
this.openWindow.close()
this.openWindow.close();
}
if (row.IsDicom) {
const routeData = this.$router.resolve({
path: `/showdicom?studyId=${row.Id}&TokenKey=${this.tokenKey}&type=Study`
})
this.openWindow = window.open(routeData.href, '_blank')
path: `/showdicom?studyId=${row.Id}&TokenKey=${this.tokenKey}&type=Study`,
});
this.openWindow = window.open(routeData.href, "_blank");
} else {
// this.rowData = { ...row }
// this.previewNonDicomVisible = true
const routeData = this.$router.resolve({
path: `/showNoneDicoms?subjectVisitId=${row.SubjectVisitId}&studyId=${row.Id}&TokenKey=${this.tokenKey}`
})
this.openWindow = window.open(routeData.href, '_blank')
path: `/showNoneDicoms?subjectVisitId=${row.SubjectVisitId}&studyId=${row.Id}&TokenKey=${this.tokenKey}`,
});
this.openWindow = window.open(routeData.href, "_blank");
}
},
handlePreviewNonDicom(row) {
if (this.openWindow) {
this.openWindow.close()
this.openWindow.close();
}
const routeData = this.$router.resolve({
path: `/showNoneDicoms?subjectVisitId=${row.SubjectVisitId}&studyId=${row.Id}&TokenKey=${this.tokenKey}`
})
this.openWindow = window.open(routeData.href, '_blank')
path: `/showNoneDicoms?subjectVisitId=${row.SubjectVisitId}&studyId=${row.Id}&TokenKey=${this.tokenKey}`,
});
this.openWindow = window.open(routeData.href, "_blank");
},
//
handlePreview(row) {
if (this.openWindow) {
this.openWindow.close()
this.openWindow.close();
}
this.openWindow = window.open(row.FullFilePath, '_blank')
this.openWindow = window.open(row.FullFilePath, "_blank");
},
//
studyStatusFormatter(StudyStatus) {
if (StudyStatus === 5) return 'Uploaded'
else if (StudyStatus === 1) return 'Uploading'
else if (StudyStatus === 7) return 'QA Requested'
else if (StudyStatus === 10) return 'In QA'
else if (StudyStatus === 25) return 'QA-Passed'
else if (StudyStatus === 26) return 'QA-Failed'
else if (StudyStatus === 28) return 'Anonymizing'
else if (StudyStatus === 30) return 'Anonymized'
else if (StudyStatus === 32) return 'Anonymizing Failed'
else if (StudyStatus === 34) return 'Forwarding'
else if (StudyStatus === 36) return 'Forwarded'
else if (StudyStatus === 38) return 'Forwarding Failed'
else return ''
if (StudyStatus === 5) return "Uploaded";
else if (StudyStatus === 1) return "Uploading";
else if (StudyStatus === 7) return "QA Requested";
else if (StudyStatus === 10) return "In QA";
else if (StudyStatus === 25) return "QA-Passed";
else if (StudyStatus === 26) return "QA-Failed";
else if (StudyStatus === 28) return "Anonymizing";
else if (StudyStatus === 30) return "Anonymized";
else if (StudyStatus === 32) return "Anonymizing Failed";
else if (StudyStatus === 34) return "Forwarding";
else if (StudyStatus === 36) return "Forwarded";
else if (StudyStatus === 38) return "Forwarding Failed";
else return "";
},
// site
getSite() {
getTrialSiteSelect(this.trialId).then((res) => {
this.siteOptions = res.Result
})
this.siteOptions = res.Result;
});
},
// visit
getVisitPlanOptions() {
getTrialVisitStageSelect(this.trialId)
.then((res) => {
this.visitPlanOptions = res.Result
})
getTrialVisitStageSelect(this.trialId).then((res) => {
this.visitPlanOptions = res.Result;
});
},
//
handleShareImage(row) {
this.shareLink = ''
this.extractionCode = ''
this.shareLink = "";
this.extractionCode = "";
const params = {
TrialId: row.TrialId,
SiteId: row.SiteId,
SubjectId: row.SubjectId,
StudyId: row.Id
}
this.loading = true
createImageShare(params).then((res) => {
this.loading = false
if (res.IsSuccess) {
// this.shareLink = `${window.location.origin}${window.location.pathname}#/imagesShare?id=${res.Result.ResourceId}`
this.shareLink = `${window.location.origin}/imagesShare?id=${res.Result.ResourceId}`
this.extractionCode = res.Result.Password
this.share_model.visible = true
}
}).catch(() => { this.loading = false })
StudyId: row.Id,
};
this.loading = true;
createImageShare(params)
.then((res) => {
this.loading = false;
if (res.IsSuccess) {
// this.shareLink = `${window.location.origin}${window.location.pathname}#/imagesShare?id=${res.Result.ResourceId}`
this.shareLink = `${window.location.origin}/imagesShare?id=${res.Result.ResourceId}`;
this.extractionCode = res.Result.Password;
this.share_model.visible = true;
}
})
.catch(() => {
this.loading = false;
});
},
getBodyPart(bodyPart) {
if (!bodyPart) return ''
var separator = ','
if (bodyPart.indexOf('|') > -1) {
separator = '|'
} else if (bodyPart.indexOf(',') > -1) {
separator = ','
} else if (bodyPart.indexOf('') > -1) {
separator = ''
if (!bodyPart) return "";
var separator = ",";
if (bodyPart.indexOf("|") > -1) {
separator = "|";
} else if (bodyPart.indexOf(",") > -1) {
separator = ",";
} else if (bodyPart.indexOf("") > -1) {
separator = "";
}
var arr = bodyPart.split(separator)
var newArr = arr.map(i => {
return this.$fd('Bodypart', i.trim())
})
return newArr.join(' | ')
var arr = bodyPart.split(separator);
var newArr = arr.map((i) => {
return this.$fd("Bodypart", i.trim());
});
return newArr.join(" | ");
},
//
copyCode() {
this.$copyText(`链接: ${this.shareLink} 提取码: ${this.extractionCode}`).then(
res => {
this.$message.success('复制成功')
}
).catch(() => { this.$alert('复制失败') })
this.$copyText(`链接: ${this.shareLink} 提取码: ${this.extractionCode}`)
.then((res) => {
this.$message.success("复制成功");
})
.catch(() => {
this.$alert("复制失败");
});
},
onCopyError() {
this.$alert('复制失败')
this.$alert("复制失败");
},
//
handleSearch() {
this.searchData.PageIndex = 1
this.getList()
this.searchData.PageIndex = 1;
this.getList();
},
//
handleReset() {
this.searchData = searchDataDefault()
this.getList()
this.searchData = searchDataDefault();
this.getList();
},
//
handleSortByColumn(column) {
if (column.order === 'ascending') {
this.searchData.Asc = true
if (column.order === "ascending") {
this.searchData.Asc = true;
} else {
this.searchData.Asc = false
this.searchData.Asc = false;
}
this.searchData.SortField = column.prop
this.searchData.PageIndex = 1
this.getList()
}
}
}
this.searchData.SortField = column.prop;
this.searchData.PageIndex = 1;
this.getList();
},
},
};
</script>

View File

@ -7,7 +7,7 @@
:before-close="beforeCloseStudyDig"
>
<span slot="title"
>{{ $t("trials:inspection:button:addTrials") }}{{
>{{ $t("trials:subject:title:addSubject") }}{{
$t("trials:uploadDicomList:table:patientInfo")
}}T0001132ZhangSan</span
>
@ -15,7 +15,7 @@
<el-form
:inline="true"
:model="submitMessage"
class="demo-form-inline"
class="demo-form-inline topForm"
:rules="rules"
>
<!--受试者编号-->
@ -25,24 +25,27 @@
>
<el-input v-model="submitMessage.subjectId"></el-input>
</el-form-item>
<el-button type="primary" @click="addTrials">
{{ $t("trials:addRP:button:confirmAddPR") }}
</el-button>
</el-form>
</div>
<div class="search">
<p>{{ $t("trials:inspection:message:checkAddTrials") }}</p>
<p>{{ $t("trials:subject:messge:selectPatient") }}</p>
<div class="form">
<el-form :inline="true" class="base-search-form">
<!-- 研究方案编号 -->
<el-form-item :label="$t('trials:trials-list:table:researchNumber')">
<!-- 患者编号 -->
<el-form-item :label="$t('trials:uploadDicomList:table:pId')">
<el-input v-model="searchData.SubjectInfo" style="width: 100px" />
</el-form-item>
<!-- 研究名称 -->
<el-form-item :label="$t('trials:trials-list:table:researchName')">
<!-- 患者姓名 -->
<el-form-item :label="$t('trials:uploadDicomList:table:patientName')">
<el-input v-model="searchData.SubjectInfo" style="width: 100px" />
</el-form-item>
<!-- 申办方 -->
<!-- DICOM AE -->
<el-form-item
class="my_multiple"
:label="$t('trials:trials-list:table:sponsor')"
:label="$t('trials:inspection:table:DICOMAE')"
>
<el-select
v-model="searchData.VisitPlanArray"
@ -59,6 +62,17 @@
</el-option>
</el-select>
</el-form-item>
<!-- 检查日期 -->
<el-form-item :label="$t('trials:uploadedDicoms:table:studyDate')">
<el-date-picker
v-model="searchData.date"
type="daterange"
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期"
>
</el-date-picker>
</el-form-item>
<el-form-item>
<!-- 查询 -->
<el-button
@ -78,9 +92,6 @@
</el-button>
</el-form-item>
</el-form>
<el-button type="primary" @click="addTrials">
{{ $t("trials:addRP:button:confirmAddPR") }}
</el-button>
</div>
</div>
<!--可加入项目列表-->
@ -95,53 +106,61 @@
@selection-change="handleSelectChange"
>
<el-table-column type="selection" align="center" width="45" />
<!--项目类型-->
<!--患者编号-->
<el-table-column
align="center"
prop="IsUrgent"
:label="$t('trials:trials-list:form:trialType')"
:label="$t('trials:uploadDicomList:table:pId')"
show-overflow-tooltip
min-width="140"
></el-table-column>
<!--研究方案号-->
<!--患者姓名-->
<el-table-column
align="center"
prop="IsUrgent"
:label="$t('trials:trials-list:table:researchNumber')"
:label="$t('trials:uploadDicomList:table:patientName')"
show-overflow-tooltip
min-width="140"
></el-table-column>
<!--研究名称-->
<!--出生日期-->
<el-table-column
align="center"
prop="IsUrgent"
:label="$t('trials:trials-list:table:researchName')"
:label="$t('trials:inspection:table:birthdate')"
show-overflow-tooltip
min-width="140"
></el-table-column>
<!--申办方-->
<!--性别-->
<el-table-column
align="center"
prop="IsUrgent"
:label="$t('trials:trials-list:table:sponsor')"
:label="$t('trials:subject:table:gender')"
show-overflow-tooltip
min-width="140"
></el-table-column>
<!--状态-->
<!--检查时间-->
<el-table-column
align="center"
prop="IsUrgent"
:label="$t('trials:trials-list:table:status')"
:label="$t('trials:audit:table:studyDate')"
show-overflow-tooltip
min-width="140"
></el-table-column>
<!--创建日期-->
<!--DiCOM AE-->
<el-table-column
align="center"
prop="IsUrgent"
:label="$t('trials:trials-list:table:createDate')"
:label="$t('trials:inspection:table:DICOMAE')"
show-overflow-tooltip
></el-table-column>
<!--检查数-->
<el-table-column
align="center"
prop="IsUrgent"
:label="$t('trials:studyList:table:count')"
show-overflow-tooltip
></el-table-column>
<!--最新接收时间-->
<el-table-column
align="center"
prop="IsUrgent"
:label="$t('trials:inspection:table:latestReceiveTime')"
show-overflow-tooltip
min-width="140"
></el-table-column>
</el-table>
@ -193,7 +212,7 @@ export default {
beforeCloseStudyDig() {
this.$emit("update:visible", false);
},
//
//
addTrials() {
this.$emit("update:visible", false);
this.$emit("handleOpenDialog", {}, "confirm");
@ -215,6 +234,12 @@ export default {
display: flex;
align-items: center;
justify-content: space-between;
.topForm {
display: flex;
align-items: center;
justify-content: space-between;
width: 100%;
}
}
.search {
display: flex;

View File

@ -70,7 +70,7 @@
v-hasPermi="['trials:trials-panel:subject:new']"
type="primary"
icon="el-icon-plus"
@click="handleAdd"
@click="handleOpenDialog({}, 'addSubject')"
>
{{ $t("common:button:new") }}
</el-button>
@ -269,7 +269,12 @@
/>
</el-dialog>
<!--添加受试者-->
<addSubject :visible.sync="addSubjectVsible" />
<addSubject
:visible.sync="addSubjectTrialsVisible"
@handleOpenDialog="handleOpenDialog"
/>
<!--确认访视-->
<confirmVisitList :visible.sync="confirmTrialsVisible" />
</BaseContainer>
</template>
<script>
@ -286,6 +291,7 @@ import SubjectStatusForm from "./components/SubjectStatusForm";
import MessageTable from "./components/MessageTable";
import moment from "moment";
import addSubject from "./components/add-subject.vue";
import confirmVisitList from "../../../trials-inspection/components/confirm-visit-list.vue";
const searchDataDefault = () => {
return {
Code: "",
@ -305,6 +311,7 @@ export default {
SubjectStatusForm,
MessageTable,
addSubject,
confirmVisitList,
},
data() {
return {
@ -325,7 +332,10 @@ export default {
trialId: "",
hasCrcRoute: false,
hasQCRoute: false,
addSubjectVsible: false,
//
addSubjectTrialsVisible: false,
// 访
confirmTrialsVisible: false,
};
},
watch: {
@ -377,11 +387,9 @@ export default {
});
},
//
handleAdd() {
this.addSubjectVsible = true;
// this.rowData = {};
// this.editDialog.title = this.$t("trials:subject:dialogTitle:new");
// this.editDialog.visible = true;
//
handleOpenDialog(item, key) {
this[`${key}TrialsVisible`] = true;
},
//
handleEdit(row) {