新增及修改页面

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-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-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-tabs v-if="!item.tabHiddn" v-model="trialsTabChild" @tab-click="clickTab">
<el-tab-pane <template v-for="item1 of item.children">
v-for="item1 of item.children" <el-tab-pane
v-if="TrialConfig && isShow(item1.path)" v-if="TrialConfig && isShow(item1.path)"
:key="`tab1${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'))" :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)" :label="$t(item1.LanguageMark)"
:name="item1.path" :name="item1.path"
/> />
</template>
</el-tabs> </el-tabs>
</el-tab-pane> </el-tab-pane>
</el-tabs> </el-tabs>

View File

@ -120,7 +120,10 @@
<el-table-column <el-table-column
label="Action" label="Action"
width="150" 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"> <template slot-scope="scope">
<el-button <el-button

View File

@ -1,11 +1,11 @@
<template> <template>
<div style="display: flex;justify-content: center"> <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;"> <div class="trial-myinfo-head" style="font-size: 30px;line-height: 120px;">
<!-- 首次登录修改密码 --> <!-- 首次登录修改密码 -->
{{ $t('recompose:title:init') }} {{ $t('recompose:title:init') }}
</div> </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-form-item :label="$t('recompose:form:email')" prop="Email">
<el-input v-model="password.Email" disabled /> <el-input v-model="password.Email" disabled />
@ -18,15 +18,6 @@
<el-form-item :label="$t('recompose:form:userName')" prop="NewUserName"> <el-form-item :label="$t('recompose:form:userName')" prop="NewUserName">
<el-input v-model="password.NewUserName" /> <el-input v-model="password.NewUserName" />
</el-form-item> </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-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" /> <el-input v-model="password.NewPassWord" type="password" show-password auto-complete="new-password" />

View File

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

View File

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

View File

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

View File

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

View File

@ -1,11 +1,11 @@
<template> <template>
<div class="trials-navbar" style="position: relative"> <div class="trials-navbar" style="position: relative">
<div class="leftMenu"> <div class="leftMenu">
<img v-if="language === 'zh'" src="@/assets/zzlogo2.png" alt=""> <img v-if="language === 'zh'" src="@/assets/zzlogo2.png" alt="" />
<img v-else src="@/assets/zzlogo3.png" alt=""> <img v-else src="@/assets/zzlogo3.png" alt="" />
<span> <span>
<!-- 中心影像系统EICS --> <!-- 中心影像系统EICS -->
{{ $t('trials:trials:title:eics') }} {{ $t("trials:trials:title:eics") }}
</span> </span>
</div> </div>
<div class="center-menu"> <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"> <!-- <el-menu-item v-if="!hasPermi(['role:air', 'role:rpm', 'role:radmin', 'role:rcrc', 'role:rir'])" index="1">
<i class="el-icon-odometer" /> --> <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> -->
<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" /> <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>
<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" /> <i class="el-icon-box" />
<!-- 我的项目 --> <!-- 我的项目 -->
<span slot="title"> <span slot="title">
{{ $t('trials:tab:trials') }} {{ $t("trials:tab:trials") }}
</span> </span>
</el-menu-item> </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" /> <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-menu-item>
<el-submenu index="4" class="my_info"> <el-submenu index="4" class="my_info">
@ -49,109 +65,123 @@
<span v="userTypeShortName">({{ userTypeShortName }})</span> <span v="userTypeShortName">({{ userTypeShortName }})</span>
</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-submenu>
</el-menu> </el-menu>
<!-- <TopLang />--> <!-- <TopLang />-->
</div> </div>
</div> </div>
</template> </template>
<script> <script>
import { loginOut } from '@/api/user' import { loginOut } from "@/api/user";
import { mapGetters, mapMutations } from 'vuex' import { mapGetters, mapMutations } from "vuex";
import TopLang from './topLang' import TopLang from "./topLang";
import NoticeMarquee from './noticeMarquee' import NoticeMarquee from "./noticeMarquee";
export default { export default {
components: { TopLang, NoticeMarquee }, components: { TopLang, NoticeMarquee },
data() { data() {
return { return {
activeIndex: '2', activeIndex: "2",
isReviewer: false, isReviewer: false,
userTypeShortName: zzSessionStorage.getItem('userTypeShortName'), userTypeShortName: zzSessionStorage.getItem("userTypeShortName"),
notice: '' notice: "",
} };
}, },
computed: { computed: {
...mapGetters(['sidebar', 'name', 'userName', 'device', 'TotalNeedSignSystemDocCount', 'language']) ...mapGetters([
"sidebar",
"name",
"userName",
"device",
"TotalNeedSignSystemDocCount",
"language",
]),
}, },
watch: { watch: {
$route(v) { $route(v) {
this.changeRoute(v) this.changeRoute(v);
} },
}, },
created() { created() {
this.isReviewer = JSON.parse(zzSessionStorage.getItem('IsReviewer')) this.isReviewer = JSON.parse(zzSessionStorage.getItem("IsReviewer"));
this.changeRoute(this.$route) this.changeRoute(this.$route);
}, },
methods: { methods: {
...mapMutations({ setLanguage: 'lang/setLanguage' }), ...mapMutations({ setLanguage: "lang/setLanguage" }),
changeRoute(v) { changeRoute(v) {
if (v.path === '/trials/trials-inspection') { if (v.path === "/trials/trials-inspection") {
this.activeIndex = '1' this.activeIndex = "1";
} }
if (v.path === '/trials/trials-list' || ~v.path.indexOf('/trials/trials-panel')) { if (
this.activeIndex = '2' v.path === "/trials/trials-list" ||
~v.path.indexOf("/trials/trials-panel")
) {
this.activeIndex = "2";
} }
if (v.path === '/trials/trials-notice') { if (v.path === "/trials/trials-notice") {
this.activeIndex = '3' this.activeIndex = "3";
} }
if (v.path === '/trials/trials-myinfo') { if (v.path === "/trials/trials-myinfo") {
this.activeIndex = '4-2' this.activeIndex = "4-2";
} }
}, },
handleSelect(key, keyPath) { handleSelect(key, keyPath) {
switch (key) { switch (key) {
case '4-2': case "4-2":
this.go('/trials/trials-myinfo') this.go("/trials/trials-myinfo");
break break;
case '4-3': case "4-3":
this.logout() this.logout();
break break;
case '1': case "1":
this.go('/trials/trials-inspection') this.go("/trials/trials-inspection");
break break;
case '2': case "2":
if (~this.$route.path.indexOf('/trials/trials-panel')) { if (~this.$route.path.indexOf("/trials/trials-panel")) {
return return;
} }
var lastWorkbench = zzSessionStorage.getItem('lastWorkbench') var lastWorkbench = zzSessionStorage.getItem("lastWorkbench");
if (lastWorkbench) { if (lastWorkbench) {
this.go(lastWorkbench) this.go(lastWorkbench);
} else { } else {
this.go('/trials/trials-list') this.go("/trials/trials-list");
} }
break break;
case '3': case "3":
this.go('/trials/trials-notice') this.go("/trials/trials-notice");
break break;
} }
}, },
toggleSideBar() { toggleSideBar() {
this.$store.dispatch('app/toggleSideBar') this.$store.dispatch("app/toggleSideBar");
}, },
async logout() { async logout() {
await loginOut() await loginOut();
await this.$store.dispatch('user/logout') await this.$store.dispatch("user/logout");
this.$router.push(`/login`) this.$router.push(`/login`);
this.$i18n.locale = 'zh' this.$i18n.locale = "zh";
this.setLanguage('zh') this.setLanguage("zh");
this.$updateDictionary() this.$updateDictionary();
}, },
go(value) { go(value) {
this.$router.push({ path: value }) this.$router.push({ path: value });
}, },
account() { account() {
this.$router.push({ name: 'Account' }) this.$router.push({ name: "Account" });
} },
} },
} };
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.trials-navbar{ .trials-navbar {
display: flex; display: flex;
flex-direction: row; flex-direction: row;
justify-content: space-between; justify-content: space-between;
@ -159,24 +189,25 @@ export default {
overflow: hidden; overflow: hidden;
background: #fff; background: #fff;
box-shadow: 0 1px 4px rgba(0, 21, 41, 0.08); box-shadow: 0 1px 4px rgba(0, 21, 41, 0.08);
.el-breadcrumb__item{ .el-breadcrumb__item {
font-size: 16px; font-size: 16px;
} }
.leftMenu{ .leftMenu {
display: flex; display: flex;
align-items: center; align-items: center;
padding-left: 20px; padding-left: 20px;
img{ img {
height: 28px; height: 28px;
margin-right: 10px; margin-right: 10px;
} }
span{ span {
font-size: 20px; font-size: 20px;
position: relative; position: relative;
top: -1px; top: -1px;
} }
} }
.right-menu, .center-menu { .right-menu,
.center-menu {
display: flex; display: flex;
flex-direction: row; flex-direction: row;
justify-content: space-between; justify-content: space-between;
@ -226,7 +257,7 @@ export default {
} }
</style> </style>
<style> <style>
.el-menu--horizontal>.my_info.el-submenu .el-submenu__icon-arrow { .el-menu--horizontal > .my_info.el-submenu .el-submenu__icon-arrow {
margin-top: 0; margin-top: 0;
} }
</style> </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> <template>
<BaseContainer v-loading="loading" style="height:100%;background-color: #fff;"> <BaseContainer
<el-tabs v-if="TrialReadingCriterionId" v-model="TrialReadingCriterionId" type="border-card"> v-loading="loading"
<el-tab-pane v-for="item of trialCriterionList" :key="item.TrialReadingCriterionId" :label="item.TrialReadingCriterionName" :name="item.TrialReadingCriterionId"> style="height: 100%; background-color: #fff"
<div v-if="isReadingTaskViewInOrder && TrialReadingCriterionId === item.TrialReadingCriterionId"> >
<div slot="search-container"> <div slot="search-container">
<el-form :inline="true"> <el-form :inline="true">
<!-- 受试者编号 --> <!-- 患者编号 -->
<el-form-item :label="$t('trials:pendingReadingTasks:table:subjectCode')"> <el-form-item :label="$t('trials:uploadDicomList:table:pId')">
<el-input <el-input
v-model="searchData.SubjectCode" v-model="searchData.SubjectCode"
style="width:130px;" style="width: 130px"
clearable clearable
/> />
</el-form-item> </el-form-item>
<!-- 患者姓名 -->
<el-form-item> <el-form-item :label="$t('trials:uploadDicomList:table:patientName')">
<!-- 查询 --> <el-input
<el-button type="primary" icon="el-icon-search" @click="handleSearch"> v-model="searchData.SubjectCode"
{{ $t('common:button:search') }} style="width: 130px"
</el-button> clearable
<!-- 重置 --> />
<el-button type="primary" icon="el-icon-refresh-left" @click="handleReset"> </el-form-item>
{{ $t('common:button:reset') }} <el-form-item>
</el-button> <!-- 查询 -->
</el-form-item> <el-button type="primary" icon="el-icon-search" @click="handleSearch">
</el-form> {{ $t("common:button:search") }}
</div> </el-button>
<div slot="main-container"> <!-- 重置 -->
<el-table <el-button
v-adaptive="{bottomOffset:75}" type="primary"
:data="list" icon="el-icon-refresh-left"
stripe @click="handleReset"
height="100" >
@sort-change="handleSortChange" {{ $t("common:button:reset") }}
> </el-button>
<el-table-column type="index" width="40" align="left" /> </el-form-item>
<!-- 受试者编号 --> </el-form>
<el-table-column </div>
prop="SubjectCode" <div slot="main-container">
min-width="100" <el-table
:label="$t('trials:pendingReadingTasks:table:subjectCode')" v-adaptive="{ bottomOffset: 75 }"
show-overflow-tooltip :data="list"
sortable="custom" stripe
/> height="100"
<!-- 剩余阅片量 --> @sort-change="handleSortChange"
<el-table-column >
prop="UnReadCanReadTaskCount" <el-table-column type="index" width="40" align="left" />
min-width="100" <!-- 患者编号 -->
:label="$t('trials:pendingReadingTasks:table:remainingReadingVolume')" <el-table-column
show-overflow-tooltip prop="SubjectCode"
sortable="custom" min-width="100"
/> :label="$t('trials:uploadDicomList:table:pId')"
<!-- &lt;!&ndash; 未读任务数量 &ndash;&gt;--> show-overflow-tooltip
<!-- <el-table-column--> sortable="custom"
<!-- prop="UnReadTaskCount"--> />
<!-- min-width="100"--> <!-- 患者姓名 -->
<!-- label="未读任务数量"--> <el-table-column
<!-- show-overflow-tooltip--> prop="SubjectCode"
<!-- />--> min-width="100"
<!-- &lt;!&ndash; 可读任务量 &ndash;&gt;--> :label="$t('trials:uploadDicomList:table:patientName')"
<!-- <el-table-column--> show-overflow-tooltip
<!-- prop="UnReadCanReadTaskCount"--> sortable="custom"
<!-- min-width="100"--> />
<!-- label="可读任务量"--> <!-- 剩余阅片量 -->
<!-- show-overflow-tooltip--> <el-table-column
<!-- />--> prop="UnReadCanReadTaskCount"
<!-- &lt;!&ndash; 已签名任务量 &ndash;&gt;--> min-width="100"
<!-- <el-table-column--> :label="$t('trials:pendingReadingTasks:table:remainingReadingVolume')"
<!-- prop="HaveReadTaskCount"--> show-overflow-tooltip
<!-- min-width="100"--> sortable="custom"
<!-- label="已签名任务量"--> />
<!-- show-overflow-tooltip--> <!-- 建议完成时间 -->
<!-- />--> <el-table-column
<!-- 建议完成时间 --> prop="SuggesteFinishedTime"
<el-table-column min-width="100"
prop="SuggesteFinishedTime" :label="
min-width="100" $t('trials:pendingReadingTasks:table:suggestedCompletionTime')
:label="$t('trials:pendingReadingTasks:table:suggestedCompletionTime')" "
show-overflow-tooltip show-overflow-tooltip
sortable="custom" sortable="custom"
> >
<template slot-scope="scope"> <template slot-scope="scope">
{{ scope.row.SuggesteFinishedTime? scope.row.SuggesteFinishedTime.split(':')[0] + ':00:00':'' }} {{
</template> scope.row.SuggesteFinishedTime
</el-table-column> ? scope.row.SuggesteFinishedTime.split(":")[0] + ":00:00"
<!-- 当前领取人 --> : ""
<el-table-column }}
prop="ClaimUserName" </template>
min-width="100" </el-table-column>
:label="$t('trials:pendingReadingTasks:table:recipient')" <!--操作-->
show-overflow-tooltip <el-table-column
sortable="custom" :label="$t('common:action:action')"
/> width="250"
fixed="right"
<el-table-column >
:label="$t('common:action:action')" <template slot-scope="scope">
width="250" <!-- 阅片 -->
fixed="right" <el-button
> :disabled="
<template slot-scope="scope"> scope.row.ExistReadingApply ||
<!-- 阅片 --> (scope.row.ClaimUserId && scope.row.ClaimUserId !== userId)
<el-button "
:disabled="scope.row.ExistReadingApply || (scope.row.ClaimUserId && scope.row.ClaimUserId !== userId)" circle
circle :title="
:title="scope.row.ExistReadingApply ? $t('trials:pendingReadingTasks:button:ExistReadingApply') : $t('trials:pendingReadingTasks:button:review')" scope.row.ExistReadingApply
icon="el-icon-edit-outline" ? $t('trials:pendingReadingTasks:button:ExistReadingApply')
@click="handleReadImage(scope.row)" : $t('trials:pendingReadingTasks:button:review')
/> "
<!-- 释放 --> icon="el-icon-edit-outline"
<el-button @click="handleReadImage(scope.row)"
:disabled="!scope.row.ClaimUserId || (scope.row.ClaimUserId && scope.row.ClaimUserId !== userId)" />
circle <!-- 释放 -->
:title="$t('trials:pendingReadingTasks:button:release')" <el-button
icon="el-icon-s-release" :disabled="
@click="handleReleaseTasks(scope.row)" !scope.row.ClaimUserId ||
/> (scope.row.ClaimUserId && scope.row.ClaimUserId !== userId)
"
</template> circle
</el-table-column> :title="$t('trials:pendingReadingTasks:button:release')"
</el-table> icon="el-icon-s-release"
<pagination class="page" :total="total" :page.sync="searchData.PageIndex" :limit.sync="searchData.PageSize" @pagination="getList" /> @click="handleReleaseTasks(scope.row)"
</div> />
</div> </template>
<div v-else-if="isReadingTaskViewInOrder === false && TrialReadingCriterionId === item.TrialReadingCriterionId"> </el-table-column>
<el-descriptions :column="2" border style="width:800px"> </el-table>
<!-- 剩余任务量 --> <pagination
<el-descriptions-item :label="$t('trials:pendingReadingTasks:table:remainingTaskVolume')" :label-style="{'width':'200px'}"> class="page"
<el-tag size="small" type="danger">{{ randomReadInfo.UnReadTaskCount }}</el-tag> :total="total"
</el-descriptions-item> :page.sync="searchData.PageIndex"
<!-- 剩余裁判量 --> :limit.sync="searchData.PageSize"
<!-- <el-descriptions-item :label="$t('trials:pendingReadingTasks:table:amountOfJudgesRemaining')" :label-style="{'width':'200px'}"> @pagination="getList"
<el-tag size="small" type="danger">{{ randomReadInfo.UnReadJudgeTaskCount }}</el-tag> />
</el-descriptions-item> --> </div>
<!-- 已完成任务量 -->
<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> </BaseContainer>
</template> </template>
<script> <script>
import { getIRUnReadSubjectTaskList, verifyReadingRestTime } from '@/api/trials' import {
import { getTrialCriterionList } from '@/api/trials/reading' getIRUnReadSubjectTaskList,
import { claimOrCancelSubject } from '@/api/reading' verifyReadingRestTime,
import BaseContainer from '@/components/BaseContainer' } from "@/api/trials";
import Pagination from '@/components/Pagination' import { getTrialCriterionList } from "@/api/trials/reading";
import { getToken } from '@/utils/auth' import { claimOrCancelSubject } from "@/api/reading";
import BaseContainer from "@/components/BaseContainer";
import Pagination from "@/components/Pagination";
import { getToken } from "@/utils/auth";
const searchDataDefault = () => { const searchDataDefault = () => {
return { return {
SubjectCode: '', SubjectCode: "",
PageIndex: 1, PageIndex: 1,
PageSize: 20 PageSize: 20,
} };
} };
export default { export default {
name: 'ReadingTaskList', name: "ReadingTaskList",
components: { BaseContainer, Pagination }, components: { BaseContainer, Pagination },
data() { data() {
return { return {
@ -210,147 +160,175 @@ export default {
list: [], list: [],
total: 0, total: 0,
loading: false, loading: false,
trialId: '', trialId: "",
isReadingTaskViewInOrder: null, isReadingTaskViewInOrder: null,
randomReadInfo: {}, randomReadInfo: {},
isRender: false, isRender: false,
trialCriterionList: [], trialCriterionList: [],
TrialReadingCriterionId: '', TrialReadingCriterionId: "",
isTableShow: true, isTableShow: true,
readingTool: null, readingTool: null,
criterionType: null, criterionType: null,
openWindow: null, openWindow: null,
userId: zzSessionStorage.getItem('userId') userId: zzSessionStorage.getItem("userId"),
} };
}, },
watch: { watch: {
TrialReadingCriterionId(v) { TrialReadingCriterionId(v) {
if (!v) return if (!v) return;
this.getList() this.getList();
} },
}, },
mounted() { mounted() {
window.addEventListener('message', this.receiveMsg) window.addEventListener("message", this.receiveMsg);
this.trialId = this.$route.query.trialId this.trialId = this.$route.query.trialId;
// this.getList() // this.getList()
this.getTrialCriterionList() this.getTrialCriterionList();
}, },
beforeDestroy() { beforeDestroy() {
window.removeEventListener('message', this.receiveMsg) window.removeEventListener("message", this.receiveMsg);
if (this.openWindow) { if (this.openWindow) {
this.openWindow.close() this.openWindow.close();
} }
}, },
methods: { methods: {
getTrialCriterionList() { getTrialCriterionList() {
getTrialCriterionList(this.trialId).then(res => { getTrialCriterionList(this.trialId)
this.trialCriterionList = res.Result .then((res) => {
this.TrialReadingCriterionId = this.trialCriterionList[0].TrialReadingCriterionId this.trialCriterionList = res.Result;
}).catch(() => {}) this.TrialReadingCriterionId =
this.trialCriterionList[0].TrialReadingCriterionId;
})
.catch(() => {});
}, },
getList() { getList() {
this.loading = true this.loading = true;
this.searchData.TrialId = this.trialId this.searchData.TrialId = this.trialId;
this.searchData.TrialReadingCriterionId = this.TrialReadingCriterionId this.searchData.TrialReadingCriterionId = this.TrialReadingCriterionId;
this.isRender = false this.isRender = false;
getIRUnReadSubjectTaskList(this.searchData).then(res => { getIRUnReadSubjectTaskList(this.searchData)
this.isReadingTaskViewInOrder = res.OtherInfo.IsReadingTaskViewInOrder .then((res) => {
this.readingTool = res.OtherInfo.ReadingTool this.isReadingTaskViewInOrder =
this.criterionType = res.OtherInfo.CriterionType res.OtherInfo.IsReadingTaskViewInOrder;
if (res.OtherInfo.IsReadingTaskViewInOrder) { this.readingTool = res.OtherInfo.ReadingTool;
this.list = res.Result.CurrentPageData this.criterionType = res.OtherInfo.CriterionType;
this.total = res.Result.TotalCount if (res.OtherInfo.IsReadingTaskViewInOrder) {
} else { this.list = res.Result.CurrentPageData;
this.randomReadInfo = res.OtherInfo.RandomReadInfo this.total = res.Result.TotalCount;
} } else {
this.isRender = true this.randomReadInfo = res.OtherInfo.RandomReadInfo;
this.loading = false }
}).catch(() => { this.isRender = true;
this.isRender = true this.loading = false;
this.loading = false })
}) .catch(() => {
this.isRender = true;
this.loading = false;
});
}, },
// //
handleReleaseTasks(row) { handleReleaseTasks(row) {
this.loading = true this.loading = true;
var params = { var params = {
isInOrder: true, isInOrder: true,
subejctId: row.SubjectId, subejctId: row.SubjectId,
isClaim: false, isClaim: false,
trialReadingCriterionId: this.TrialReadingCriterionId trialReadingCriterionId: this.TrialReadingCriterionId,
} };
claimOrCancelSubject(params).then(res => { claimOrCancelSubject(params)
// '!' .then((res) => {
this.$message.success(this.$t('trials:pendingReadingTasks:message:released')) // '!'
this.loading = false this.$message.success(
this.getList() this.$t("trials:pendingReadingTasks:message:released")
}).catch(() => { this.loading = false }) );
this.loading = false;
this.getList();
})
.catch(() => {
this.loading = false;
});
}, },
handleSearch() { handleSearch() {
this.searchData.PageIndex = 1 this.searchData.PageIndex = 1;
this.getList() this.getList();
}, },
handleReset() { handleReset() {
this.searchData = searchDataDefault() this.searchData = searchDataDefault();
this.getList() this.getList();
}, },
handleReadImage(row) { handleReadImage(row) {
if (this.openWindow) { if (this.openWindow) {
this.openWindow.close() this.openWindow.close();
} }
this.loading = true this.loading = true;
verifyReadingRestTime().then(_ => { verifyReadingRestTime()
this.loading = false .then((_) => {
this.loading = false;
window.localStorage.setItem('TrialReadingCriterionId', this.TrialReadingCriterionId) window.localStorage.setItem(
var token = getToken() "TrialReadingCriterionId",
var path = '' this.TrialReadingCriterionId
var criterionName = this.trialCriterionList.find(i => i.TrialReadingCriterionId === this.TrialReadingCriterionId).TrialReadingCriterionName );
if (this.readingTool === 0) { var token = getToken();
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}` var path = "";
} else { var criterionName = this.trialCriterionList.find(
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}` (i) => i.TrialReadingCriterionId === this.TrialReadingCriterionId
} ).TrialReadingCriterionName;
var routeData = this.$router.resolve({ path }) 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') this.openWindow = window.open(routeData.href, "_blank");
}).catch(() => { this.loading = false }) })
.catch(() => {
this.loading = false;
});
}, },
handleOutOfOrderReading() { handleOutOfOrderReading() {
if (this.openWindow) { if (this.openWindow) {
this.openWindow.close() this.openWindow.close();
} }
this.loading = true this.loading = true;
verifyReadingRestTime().then(_ => { verifyReadingRestTime()
this.loading = false .then((_) => {
window.localStorage.setItem('TrialReadingCriterionId', this.TrialReadingCriterionId) this.loading = false;
var token = getToken() window.localStorage.setItem(
var path = '' "TrialReadingCriterionId",
if (this.readingTool === 0) { this.TrialReadingCriterionId
path = `/readingDicoms?TrialReadingCriterionId=${this.TrialReadingCriterionId}&trialId=${this.trialId}&isReadingTaskViewInOrder=${this.isReadingTaskViewInOrder}&criterionType=${this.criterionType}&readingTool=${this.readingTool}&TokenKey=${token}` );
} else { var token = getToken();
path = `/noneDicomReading?TrialReadingCriterionId=${this.TrialReadingCriterionId}&trialId=${this.trialId}&isReadingTaskViewInOrder=${this.isReadingTaskViewInOrder}&criterionType=${this.criterionType}&readingTool=${this.readingTool}&TokenKey=${token}` var path = "";
} if (this.readingTool === 0) {
var routeData = this.$router.resolve({ path }) path = `/readingDicoms?TrialReadingCriterionId=${this.TrialReadingCriterionId}&trialId=${this.trialId}&isReadingTaskViewInOrder=${this.isReadingTaskViewInOrder}&criterionType=${this.criterionType}&readingTool=${this.readingTool}&TokenKey=${token}`;
this.openWindow = window.open(routeData.href, '_blank') } else {
}).catch(() => { this.loading = false }) 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) { receiveMsg(event) {
if (event.data === 'refreshTaskList') { if (event.data === "refreshTaskList") {
this.getList() this.getList();
} }
}, },
// //
handleSortChange(column) { handleSortChange(column) {
if (column.order === 'ascending') { if (column.order === "ascending") {
this.searchData.Asc = true this.searchData.Asc = true;
} else { } else {
this.searchData.Asc = false this.searchData.Asc = false;
} }
this.searchData.SortField = column.prop this.searchData.SortField = column.prop;
this.searchData.PageIndex = 1 this.searchData.PageIndex = 1;
this.getList() this.getList();
} },
} },
} };
</script> </script>

View File

@ -1,282 +1,426 @@
<template> <template>
<BaseContainer> <BaseContainer>
<el-tabs v-model="TrialReadingCriterionId" type="border-card"> <div slot="search-container">
<el-tab-pane v-for="item of trialCriterionList" :key="item.TrialReadingCriterionId" :label="item.TrialReadingCriterionName" :name="item.TrialReadingCriterionId"> <el-form :inline="true">
<div v-if="TrialReadingCriterionId === item.TrialReadingCriterionId"> <!-- 中心编号 -->
<div slot="search-container"> <el-form-item :label="$t('trials:rereadTask:table:siteCode')">
<el-form :inline="true"> <el-select
<!-- 中心编号 --> v-model="searchData.SiteId"
<el-form-item :label="$t('trials:rereadTask:table:siteCode')"> clearable
<el-select v-model="searchData.SiteId" clearable filterable style="width:120px;"> filterable
<el-option style="width: 120px"
v-for="(i,index) of siteOptions" >
:key="index" <el-option
:label="i.TrialSiteCode" v-for="(i, index) of siteOptions"
:value="i.SiteId" :key="index"
/> :label="i.TrialSiteCode"
</el-select> :value="i.SiteId"
</el-form-item> />
<!-- 受试者编号 --> </el-select>
<el-form-item :label="$t('trials:rereadTask:table:subjectCode')"> </el-form-item>
<el-input v-model="searchData.SubjectCode" style="width:100px;" /> <!-- 受试者编号 -->
</el-form-item> <el-form-item :label="$t('trials:rereadTask:table:subjectCode')">
<!-- <el-form-item style="margin-bottom:10px" label="访视/阅片期名称"> <el-input v-model="searchData.SubjectCode" style="width: 100px" />
</el-form-item>
<!-- <el-form-item style="margin-bottom:10px" label="访视/阅片期名称">
<el-input <el-input
v-model="searchData.TaskName" v-model="searchData.TaskName"
style="width:100px;" style="width:100px;"
clearable clearable
/> />
</el-form-item> --> </el-form-item> -->
<!-- 任务编号 --> <!-- 任务编号 -->
<el-form-item :label="$t('trials:rereadTask:table:taskCode')"> <el-form-item :label="$t('trials:rereadTask:table:taskCode')">
<el-input <el-input
v-model="searchData.TaskCode" v-model="searchData.TaskCode"
style="width:130px;" style="width: 130px"
clearable clearable
/> />
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<!-- 查询 --> <!-- 查询 -->
<el-button type="primary" icon="el-icon-search" @click="handleSearch"> <el-button type="primary" icon="el-icon-search" @click="handleSearch">
{{ $t('common:button:search') }} {{ $t("common:button:search") }}
</el-button> </el-button>
<!-- 重置 --> <!-- 重置 -->
<el-button type="primary" icon="el-icon-refresh-left" @click="handleReset"> <el-button
{{ $t('common:button:reset') }} type="primary"
</el-button> icon="el-icon-refresh-left"
</el-form-item> @click="handleReset"
</el-form> >
</div> {{ $t("common:button:reset") }}
<div slot="main-container"> </el-button>
<el-table </el-form-item>
v-adaptive="{bottomOffset:75}" </el-form>
v-loading="loading" </div>
:data="list" <div slot="main-container">
stripe <el-table
height="100" v-adaptive="{ bottomOffset: 75 }"
@sort-change="handleSortChange" 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-tag v-else type="primary">{{
<!-- 是否加急 --> $fd("YesOrNo", scope.row.OriginalReReadingTask.IsUrgent)
<el-table-column }}</el-tag>
prop="OriginalReReadingTask.IsUrgent" </template>
:label="$t('trials:rereadTask:table:isUrgent')" </el-table-column>
show-overflow-tooltip <!-- 任务编号 -->
sortable="custom" <el-table-column
min-width="100" prop="OriginalReReadingTask.TaskCode"
> min-width="100"
<template slot-scope="scope"> :label="$t('trials:rereadTask:table:taskCode')"
<el-tag v-if="scope.row.OriginalReReadingTask.IsUrgent" type="danger">{{ $fd('YesOrNo', scope.row.OriginalReReadingTask.IsUrgent) }}</el-tag> sortable="custom"
<el-tag v-else type="primary">{{ $fd('YesOrNo', scope.row.OriginalReReadingTask.IsUrgent) }}</el-tag> show-overflow-tooltip
</template> />
</el-table-column> <!-- 中心编号 -->
<!-- 任务编号 --> <el-table-column
<el-table-column prop="OriginalReReadingTask.TrialSiteCode"
prop="OriginalReReadingTask.TaskCode" :label="$t('trials:rereadTask:table:siteCode')"
min-width="100" min-width="100"
:label="$t('trials:rereadTask:table:taskCode')" sortable="custom"
sortable="custom" show-overflow-tooltip
show-overflow-tooltip />
/> <!-- 受试者编号 -->
<!-- 中心编号 --> <el-table-column
<el-table-column prop="OriginalReReadingTask.SubjectCode"
prop="OriginalReReadingTask.TrialSiteCode" min-width="100"
:label="$t('trials:rereadTask:table:siteCode')" :label="$t('trials:rereadTask:table:subjectCode')"
min-width="100" sortable="custom"
sortable="custom" show-overflow-tooltip
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 <el-table-column
prop="OriginalReReadingTask.TaskName" prop="OriginalReReadingTask.TaskName"
min-width="120" min-width="120"
:label="$t('trials:rereadTask:table:taskName')" :label="$t('trials:rereadTask:table:taskName')"
sortable="custom" sortable="custom"
show-overflow-tooltip show-overflow-tooltip
/> />
<!-- 阅片标准 --> <!-- 阅片标准 -->
<el-table-column <el-table-column
prop="OriginalReReadingTask.TrialReadingCriterionName" prop="OriginalReReadingTask.TrialReadingCriterionName"
:label="$t('trials:rereadTask:table:criterionName')" :label="$t('trials:rereadTask:table:criterionName')"
min-width="100" min-width="100"
show-overflow-tooltip show-overflow-tooltip
sortable="custom" sortable="custom"
/> />
<!-- 任务状态 --> <!-- 任务状态 -->
<el-table-column <el-table-column
prop="OriginalReReadingTask.TaskState" prop="OriginalReReadingTask.TaskState"
:label="$t('trials:rereadTask:table:taskState')" :label="$t('trials:rereadTask:table:taskState')"
min-width="100" min-width="100"
sortable="custom" sortable="custom"
show-overflow-tooltip show-overflow-tooltip
> >
<template slot-scope="scope"> <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
<el-tag v-if="scope.row.OriginalReReadingTask.TaskState === 1" type="info">{{ $fd('TaskState', scope.row.OriginalReReadingTask.TaskState) }}</el-tag> v-if="scope.row.OriginalReReadingTask.TaskState === 0"
<el-tag v-if="scope.row.OriginalReReadingTask.TaskState === 3" type="danger">{{ $fd('TaskState', scope.row.OriginalReReadingTask.TaskState) }}</el-tag> type="primary"
<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> $fd("TaskState", scope.row.OriginalReReadingTask.TaskState)
</template> }}</el-tag
</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-tag
<el-form v-if="scope.row.OriginalReReadingTask.TaskState === 1"
ref="reasonForm" type="info"
:rules="rules" >{{
:model="ConfirmReReadingForm" $fd("TaskState", scope.row.OriginalReReadingTask.TaskState)
class="demo-ruleForm" }}</el-tag
size="small" >
label-width="120px" <el-tag
> v-if="scope.row.OriginalReReadingTask.TaskState === 3"
<el-form-item label="驳回原因" prop="RequestReReadingRejectReason"> type="danger"
<el-input >{{
v-model="ConfirmReReadingForm.RequestReReadingRejectReason" $fd("TaskState", scope.row.OriginalReReadingTask.TaskState)
type="textarea" }}</el-tag
:autosize="{ minRows: 2, maxRows: 4}" >
:placeholder="$t('common:ruleMessage:specify')" <el-tag
maxlength="500" v-if="scope.row.OriginalReReadingTask.TaskState === 4"
show-word-limit type="warning"
/> >{{
</el-form-item> $fd("TaskState", scope.row.OriginalReReadingTask.TaskState)
</el-form> }}</el-tag
</div> >
<div slot="footer" class="dialog-footer"> <el-tag
<!-- 取消 --> v-if="scope.row.OriginalReReadingTask.TaskState === 5"
<el-button :disabled="btnLoading" size="small" type="primary" @click="ConfirmReReadingVisible = false;ConfirmReReadingForm = { RequestReReadingRejectReason: null }"> type="danger"
{{ $t('common:button:cancel') }} >{{
</el-button> $fd("TaskState", scope.row.OriginalReReadingTask.TaskState)
<!-- 保存 --> }}</el-tag
<el-button :loading="btnLoading" size="small" type="primary" @click="handleConfirmReReading(rowData, 2)"> >
{{ $t('common:button:save') }} </template>
</el-button> </el-table-column>
</div> <!-- 任务类型 -->
</el-dialog> <el-table-column
</div> 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> </div>
</el-tab-pane> <div slot="footer" class="dialog-footer">
</el-tabs> <!-- 取消 -->
<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> </BaseContainer>
</template> </template>
<script> <script>
import { getIRReReadingTaskList, getTrialSiteSelect } from '@/api/trials' import { getIRReReadingTaskList, getTrialSiteSelect } from "@/api/trials";
import { confirmReReading, getTrialCriterionList } from '@/api/trials/reading' import { confirmReReading, getTrialCriterionList } from "@/api/trials/reading";
import BaseContainer from '@/components/BaseContainer' import BaseContainer from "@/components/BaseContainer";
import Pagination from '@/components/Pagination' import Pagination from "@/components/Pagination";
import { changeURLStatic } from '@/utils/history.js' import { changeURLStatic } from "@/utils/history.js";
const searchDataDefault = () => { const searchDataDefault = () => {
return { return {
SubjectCode: '', SubjectCode: "",
TaskCode: '', TaskCode: "",
PageIndex: 1, PageIndex: 1,
PageSize: 20 PageSize: 20,
} };
} };
export default { export default {
name: 'RereadTask', name: "RereadTask",
components: { BaseContainer, Pagination }, components: { BaseContainer, Pagination },
data() { data() {
return { return {
@ -285,146 +429,166 @@ export default {
siteOptions: [], siteOptions: [],
total: 0, total: 0,
loading: false, loading: false,
trialId: '', trialId: "",
ConfirmReReadingForm: { ConfirmReReadingForm: {
RequestReReadingRejectReason: null RequestReReadingRejectReason: null,
}, },
rules: { 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, ConfirmReReadingVisible: false,
trialCriterionList: [], trialCriterionList: [],
TrialReadingCriterionId: '0' TrialReadingCriterionId: "0",
} };
}, },
watch: { watch: {
TrialReadingCriterionId(v) { TrialReadingCriterionId(v) {
if (v) { if (v) {
this.getList() this.getList();
} }
} },
}, },
mounted() { mounted() {
if (this.$route.query.SiteId) { if (this.$route.query.SiteId) {
this.searchData.SiteId = this.$route.query.SiteId this.searchData.SiteId = this.$route.query.SiteId;
this.searchData.SubjectCode = this.$route.query.SubjectCode this.searchData.SubjectCode = this.$route.query.SubjectCode;
this.searchData.TaskName = this.$route.query.TaskName this.searchData.TaskName = this.$route.query.TaskName;
changeURLStatic('SiteId', '') changeURLStatic("SiteId", "");
changeURLStatic('SubjectCode', '') changeURLStatic("SubjectCode", "");
changeURLStatic('TaskName', '') changeURLStatic("TaskName", "");
} }
this.trialId = this.$route.query.trialId this.trialId = this.$route.query.trialId;
this.getSite() this.getSite();
// this.getList() // this.getList()
this.getTrialCriterionList() this.getTrialCriterionList();
}, },
methods: { methods: {
getTrialCriterionList() { getTrialCriterionList() {
getTrialCriterionList(this.trialId).then(res => { getTrialCriterionList(this.trialId)
this.trialCriterionList = res.Result .then((res) => {
this.TrialReadingCriterionId = this.trialCriterionList[0].TrialReadingCriterionId this.trialCriterionList = res.Result;
}).catch(() => {}) this.TrialReadingCriterionId =
this.trialCriterionList[0].TrialReadingCriterionId;
})
.catch(() => {});
}, },
getSite() { getSite() {
getTrialSiteSelect(this.trialId).then(res => { getTrialSiteSelect(this.trialId).then((res) => {
this.siteOptions = res.Result this.siteOptions = res.Result;
}) });
}, },
getList() { getList() {
this.loading = true this.loading = true;
this.searchData.TrialId = this.trialId this.searchData.TrialId = this.trialId;
this.searchData.TrialReadingCriterionId = this.TrialReadingCriterionId this.searchData.TrialReadingCriterionId = this.TrialReadingCriterionId;
getIRReReadingTaskList(this.searchData).then(res => { getIRReReadingTaskList(this.searchData)
this.list = res.Result.CurrentPageData .then((res) => {
this.total = res.Result.TotalCount this.list = res.Result.CurrentPageData;
this.loading = false this.total = res.Result.TotalCount;
}).catch(() => { this.loading = false }) this.loading = false;
})
.catch(() => {
this.loading = false;
});
}, },
handleSearch() { handleSearch() {
this.searchData.PageIndex = 1 this.searchData.PageIndex = 1;
this.getList() this.getList();
}, },
handleReset() { handleReset() {
this.searchData = searchDataDefault() this.searchData = searchDataDefault();
this.getList() this.getList();
}, },
handleConfirmReReading(row, type, open) { handleConfirmReReading(row, type, open) {
if (open) { if (open) {
this.rowData = { ...row } this.rowData = { ...row };
this.ConfirmReReadingVisible = true this.ConfirmReReadingVisible = true;
this.ConfirmReReadingForm = { this.ConfirmReReadingForm = {
RequestReReadingRejectReason: null RequestReReadingRejectReason: null,
} };
return return;
} }
if (type === 2) { if (type === 2) {
this.$refs.reasonForm.validate((valid) => { this.$refs.reasonForm.validate((valid) => {
if (!valid) return if (!valid) return;
var params = { var params = {
ConfirmReReadingList: [ ConfirmReReadingList: [
{ {
Id: row.Id, Id: row.Id,
OriginalReReadingTaskId: row.OriginalReReadingTaskId, OriginalReReadingTaskId: row.OriginalReReadingTaskId,
RootReReadingTaskId: row.RootReReadingTaskId, RootReReadingTaskId: row.RootReReadingTaskId,
NewReReadingTaskId: row.NewReReadingTaskId NewReReadingTaskId: row.NewReReadingTaskId,
} },
], ],
RequestReReadingRejectReason: this.ConfirmReReadingForm.RequestReReadingRejectReason, RequestReReadingRejectReason:
this.ConfirmReReadingForm.RequestReReadingRejectReason,
TrialId: this.$route.query.trialId, TrialId: this.$route.query.trialId,
RequestReReadingResultEnum: type RequestReReadingResultEnum: type,
} };
this.loading = true this.loading = true;
this.btnLoading = true this.btnLoading = true;
confirmReReading(params).then(() => { confirmReReading(params)
this.loading = false .then(() => {
this.btnLoading = false this.loading = false;
this.$message.success(`${type === 1 ? '同意' : '拒绝'}申请成功`) this.btnLoading = false;
this.getList() this.$message.success(`${type === 1 ? "同意" : "拒绝"}申请成功`);
this.ConfirmReReadingVisible = false this.getList();
}).catch(() => { this.ConfirmReReadingVisible = false;
this.loading = false })
this.btnLoading = false .catch(() => {
}) this.loading = false;
}) this.btnLoading = false;
return });
});
return;
} }
this.$confirm(`确定${type === 1 ? '同意' : '拒绝'}该重阅申请?`).then(() => { this.$confirm(`确定${type === 1 ? "同意" : "拒绝"}该重阅申请?`).then(
var params = { () => {
ConfirmReReadingList: [ var params = {
{ ConfirmReReadingList: [
Id: row.Id, {
OriginalReReadingTaskId: row.OriginalReReadingTaskId, Id: row.Id,
RootReReadingTaskId: row.RootReReadingTaskId, OriginalReReadingTaskId: row.OriginalReReadingTaskId,
NewReReadingTaskId: row.NewReReadingTaskId RootReReadingTaskId: row.RootReReadingTaskId,
} NewReReadingTaskId: row.NewReReadingTaskId,
], },
TrialId: this.$route.query.trialId, ],
RequestReReadingResultEnum: type 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) { handleSortChange(column) {
if (column.order === 'ascending') { if (column.order === "ascending") {
this.searchData.Asc = true this.searchData.Asc = true;
} else { } else {
this.searchData.Asc = false this.searchData.Asc = false;
} }
this.searchData.SortField = column.prop this.searchData.SortField = column.prop;
this.searchData.PageIndex = 1 this.searchData.PageIndex = 1;
this.getList() this.getList();
} },
} },
} };
</script> </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"> <template slot="search-container">
<el-form :inline="true"> <el-form :inline="true">
<!-- Site --> <!-- 受试者编号 -->
<el-form-item :label="$t('trials:studyList:table:siteId')"> <el-form-item :label="$t('trials:subject:table:subjectId')">
<el-select <el-input v-model="searchData.SubjectInfo" style="width: 140px" />
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>
<!-- Subject --> <!-- 患者姓名 -->
<el-form-item :label="$t('trials:studyList:table:subject')"> <el-form-item :label="$t('trials:uploadDicomList:table:patientName')">
<el-input v-model="searchData.SubjectInfo" style="width:140px" /> <el-input v-model="searchData.SubjectInfo" style="width: 140px" />
</el-form-item> </el-form-item>
<!-- Visit --> <!-- 性别 -->
<el-form-item :label="$t('trials:studyList:table:visit')"> <el-form-item :label="$t('trials:subject:table:gender')">
<el-select <el-select
v-model="searchData.VisitPlanArray" v-model="searchData.VisitPlanArray"
clearable clearable
@ -33,253 +21,231 @@
collapse-tags collapse-tags
> >
<el-option <el-option
v-for="(item, index) of visitPlanOptions" v-for="item of $d.sex"
:key="index" :key="item.id"
:label="item.VisitName" :label="item.label"
:value="item.VisitNum" :value="item.value"
> >
<span style="float: left">{{ item.VisitName }}</span>
</el-option> </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 <el-option
key="Other" v-for="item of $d.sex"
label="Out of Plan" :key="item.id"
value="1.11" :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-select>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<!-- 查询 --> <!-- 查询 -->
<el-button type="primary" icon="el-icon-search" @click="handleSearch"> <el-button type="primary" icon="el-icon-search" @click="handleSearch">
{{ $t('common:button:search') }} {{ $t("common:button:search") }}
</el-button> </el-button>
<!-- 重置 --> <!-- 重置 -->
<el-button type="primary" icon="el-icon-refresh-left" @click="handleReset"> <el-button
{{ $t('common:button:reset') }} type="primary"
icon="el-icon-refresh-left"
@click="handleReset"
>
{{ $t("common:button:reset") }}
</el-button> </el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
</template> </template>
<!-- 检查列表 --> <!-- 检查列表 -->
<template slot="main-container"> <template slot="main-container">
<el-table <el-table
v-loading="loading" v-loading="loading"
v-adaptive="{bottomOffset:60}" v-adaptive="{ bottomOffset: 60 }"
:data="list" :data="list"
stripe stripe
height="100" height="100"
@sort-change="handleSortByColumn" @sort-change="handleSortByColumn"
> >
<el-table-column type="index" width="40" /> <el-table-column type="index" width="40" />
<!-- Study ID --> <!-- 受试者编号 -->
<el-table-column <el-table-column
prop="StudyCode" prop="StudyCode"
:label="$t('trials:studyList:table:studyId')" :label="$t('trials:subject:table:subjectId')"
show-overflow-tooltip show-overflow-tooltip
sortable="custom" sortable="custom"
min-width="100" min-width="100"
/> />
<!-- Image Type --> <!-- 患者编号 -->
<el-table-column <el-table-column
prop="IsDicom" prop="StudyCode"
:label="$t('trials:studyList:table:imageType')" :label="$t('trials:uploadDicomList:table:pId')"
show-overflow-tooltip
sortable="custom" sortable="custom"
min-width="100" 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 <el-table-column
min-width="100" prop="StudyCode"
:label="$t('trials:uploadDicomList:table:patientName')"
show-overflow-tooltip show-overflow-tooltip
> sortable="custom"
<template slot="header"> min-width="100"
<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>
<el-table-column <el-table-column
prop="Uploader" prop="StudyCode"
:label="$t('trials:studyList:table:uploader')" :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 show-overflow-tooltip
sortable="custom" sortable="custom"
min-width="100" min-width="100"
/> />
<el-table-column <el-table-column
prop="UploadTime" :label="$t('common:action:action')"
:label="$t('trials:studyList:table:uploadTime')" min-width="100"
show-overflow-tooltip fixed="right"
sortable="custom" >
min-width="120"
/>
<el-table-column :label="$t('common:action:action')" min-width="100" fixed="right">
<template slot-scope="scope"> <template slot-scope="scope">
<!-- 查看 --> <!-- 查看 -->
<el-button <el-button
:disabled="!scope.row.Count" :disabled="!scope.row.Count"
circle type="text"
:title="$t('trials:studyList:button:view')"
icon="el-icon-view"
@click="handleViewStudy(scope.row)" @click="handleViewStudy(scope.row)"
/> >{{ $t("trials:studyList:button:view") }}</el-button
<!-- 分享检查 --> >
<el-button <!-- 修改访视 -->
v-hasPermi="['trials:trials-panel:study:share']" <el-button type="text" @click="editVisitFn(scope.row)">{{
:disabled="!(scope.row.Count > 0 && scope.row.IsDicom)" $t("trials:study:button:editVisit")
circle }}</el-button>
:title="$t('trials:studyList:action:share')"
icon="el-icon-share"
@click="handleShareImage(scope.row)"
/>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </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> </template>
<base-model :config="share_model"> <base-model :config="share_model">
<template slot="dialog-body"> <template slot="dialog-body">
<div> <div>
<i style="color:#428bca;" class="el-icon-success" /> <i style="color: #428bca" class="el-icon-success" />
<span>成功创建分享链接</span> <span>成功创建分享链接</span>
</div> </div>
<div style="margin:10px 0;"> <div style="margin: 10px 0">
链接<el-input v-model="shareLink" readonly style="width:420px;" /> 链接<el-input v-model="shareLink" readonly style="width: 420px" />
</div> </div>
<div style="margin-bottom:20px;"> <div style="margin-bottom: 20px">
提取码 <el-input v-model="extractionCode" style="width:100px;" readonly /> 提取码
<el-input v-model="extractionCode" style="width: 100px" readonly />
</div> </div>
<div> <div>
<el-button type="primary" round @click="copyCode"></el-button> <el-button type="primary" round @click="copyCode"
>复制链接及提取码</el-button
>
</div> </div>
</template> </template>
</base-model> </base-model>
@ -293,11 +259,17 @@
append-to-body append-to-body
custom-class="base-dialog-wrapper" custom-class="base-dialog-wrapper"
> >
<div class="base-modal-body" style="border:2px solid #ccc;padding: 10px"> <div
<NonDicomPreview v-if="previewNonDicomVisible" :none-dicom-id="rowData.Id" /> class="base-modal-body"
style="border: 2px solid #ccc; padding: 10px"
>
<NonDicomPreview
v-if="previewNonDicomVisible"
:none-dicom-id="rowData.Id"
/>
</div> </div>
</el-dialog> </el-dialog>
<editVisit :visible.sync="editVisitVisible" />
</BaseContainer> </BaseContainer>
</template> </template>
<script> <script>
@ -306,29 +278,35 @@ import {
getTrialSiteSelect, getTrialSiteSelect,
getSeriesList, getSeriesList,
getTrialVisitStageSelect, getTrialVisitStageSelect,
getNoneDicomStudyFileList getNoneDicomStudyFileList,
} from "@/api/trials";
} from '@/api/trials' import { createImageShare } from "@/api/share";
import { createImageShare } from '@/api/share' import BaseContainer from "@/components/BaseContainer";
import BaseContainer from '@/components/BaseContainer' import Pagination from "@/components/Pagination";
import Pagination from '@/components/Pagination' import BaseModel from "@/components/BaseModel";
import BaseModel from '@/components/BaseModel' import NonDicomPreview from "./components/nonDicomPreview";
import NonDicomPreview from './components/nonDicomPreview' import editVisit from "./components/edit-visit";
import moment from 'moment' import moment from "moment";
import { getToken } from '@/utils/auth' import { getToken } from "@/utils/auth";
const searchDataDefault = () => { const searchDataDefault = () => {
return { return {
SubjectInfo: '', SubjectInfo: "",
VisitPlanArray: [], VisitPlanArray: [],
Status: '', Status: "",
SiteId: '', SiteId: "",
PageIndex: 1, PageIndex: 1,
PageSize: 20 PageSize: 20,
} };
} };
export default { export default {
name: 'StudyList', name: "StudyList",
components: { BaseContainer, Pagination, BaseModel, NonDicomPreview }, components: {
BaseContainer,
Pagination,
BaseModel,
NonDicomPreview,
editVisit,
},
data() { data() {
return { return {
searchData: searchDataDefault(), searchData: searchDataDefault(),
@ -340,191 +318,213 @@ export default {
seriesList: [], seriesList: [],
nonDicomfilesList: [], nonDicomfilesList: [],
rowData: {}, rowData: {},
userTypeEnumInt: zzSessionStorage.getItem('userTypeEnumInt') * 1, userTypeEnumInt: zzSessionStorage.getItem("userTypeEnumInt") * 1,
share_model: { visible: false, title: '影像分享', showClose: true, width: '500px' }, share_model: {
shareLink: '', visible: false,
extractionCode: '', title: "影像分享",
showClose: true,
width: "500px",
},
shareLink: "",
extractionCode: "",
moment, moment,
filesLoading: '', filesLoading: "",
seriesLoading: '', seriesLoading: "",
previewNonDicomVisible: false, previewNonDicomVisible: false,
trialId: this.$route.query.trialId, trialId: this.$route.query.trialId,
tokenKey: getToken(), tokenKey: getToken(),
openWindow: null openWindow: null,
}
editVisitVisible: false,
};
}, },
mounted() { mounted() {
this.getSite() this.getSite();
this.getVisitPlanOptions() this.getVisitPlanOptions();
this.getList() this.getList();
}, },
methods: { methods: {
// 访
editVisitFn() {
this.editVisitVisible = true;
},
// //
getList() { getList() {
this.loading = true this.loading = true;
this.searchData.TrialId = this.trialId this.searchData.TrialId = this.trialId;
getDicomAndNoneDicomStudyList(this.searchData) getDicomAndNoneDicomStudyList(this.searchData)
.then((res) => { .then((res) => {
this.loading = false this.loading = false;
this.list = res.Result.CurrentPageData this.list = res.Result.CurrentPageData;
this.total = res.Result.TotalCount this.total = res.Result.TotalCount;
}) })
.catch(() => { .catch(() => {
this.loading = false this.loading = false;
}) });
}, },
// Dicom // Dicom
handleGetseriesList(row) { handleGetseriesList(row) {
this.seriesLoading = true this.seriesLoading = true;
this.seriesList = [] this.seriesList = [];
getSeriesList(row.Id).then((res) => { getSeriesList(row.Id)
this.seriesLoading = false .then((res) => {
this.seriesList = res.Result this.seriesLoading = false;
}).catch(() => { this.seriesList = res.Result;
this.seriesLoading = false })
}) .catch(() => {
this.seriesLoading = false;
});
}, },
// Dicom // Dicom
handleGetFilesList(id) { handleGetFilesList(id) {
this.filesLoading = true this.filesLoading = true;
getNoneDicomStudyFileList(id).then(res => { getNoneDicomStudyFileList(id)
this.nonDicomfilesList = res.Result .then((res) => {
this.filesLoading = false this.nonDicomfilesList = res.Result;
}).catch(() => { this.filesLoading = false }) this.filesLoading = false;
})
.catch(() => {
this.filesLoading = false;
});
}, },
// //
handleViewStudy(row) { handleViewStudy(row) {
if (this.openWindow) { if (this.openWindow) {
this.openWindow.close() this.openWindow.close();
} }
if (row.IsDicom) { if (row.IsDicom) {
const routeData = this.$router.resolve({ const routeData = this.$router.resolve({
path: `/showdicom?studyId=${row.Id}&TokenKey=${this.tokenKey}&type=Study` path: `/showdicom?studyId=${row.Id}&TokenKey=${this.tokenKey}&type=Study`,
}) });
this.openWindow = window.open(routeData.href, '_blank') this.openWindow = window.open(routeData.href, "_blank");
} else { } else {
// this.rowData = { ...row } // this.rowData = { ...row }
// this.previewNonDicomVisible = true // this.previewNonDicomVisible = true
const routeData = this.$router.resolve({ const routeData = this.$router.resolve({
path: `/showNoneDicoms?subjectVisitId=${row.SubjectVisitId}&studyId=${row.Id}&TokenKey=${this.tokenKey}` path: `/showNoneDicoms?subjectVisitId=${row.SubjectVisitId}&studyId=${row.Id}&TokenKey=${this.tokenKey}`,
}) });
this.openWindow = window.open(routeData.href, '_blank') this.openWindow = window.open(routeData.href, "_blank");
} }
}, },
handlePreviewNonDicom(row) { handlePreviewNonDicom(row) {
if (this.openWindow) { if (this.openWindow) {
this.openWindow.close() this.openWindow.close();
} }
const routeData = this.$router.resolve({ const routeData = this.$router.resolve({
path: `/showNoneDicoms?subjectVisitId=${row.SubjectVisitId}&studyId=${row.Id}&TokenKey=${this.tokenKey}` path: `/showNoneDicoms?subjectVisitId=${row.SubjectVisitId}&studyId=${row.Id}&TokenKey=${this.tokenKey}`,
}) });
this.openWindow = window.open(routeData.href, '_blank') this.openWindow = window.open(routeData.href, "_blank");
}, },
// //
handlePreview(row) { handlePreview(row) {
if (this.openWindow) { 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) { studyStatusFormatter(StudyStatus) {
if (StudyStatus === 5) return 'Uploaded' if (StudyStatus === 5) return "Uploaded";
else if (StudyStatus === 1) return 'Uploading' else if (StudyStatus === 1) return "Uploading";
else if (StudyStatus === 7) return 'QA Requested' else if (StudyStatus === 7) return "QA Requested";
else if (StudyStatus === 10) return 'In QA' else if (StudyStatus === 10) return "In QA";
else if (StudyStatus === 25) return 'QA-Passed' else if (StudyStatus === 25) return "QA-Passed";
else if (StudyStatus === 26) return 'QA-Failed' else if (StudyStatus === 26) return "QA-Failed";
else if (StudyStatus === 28) return 'Anonymizing' else if (StudyStatus === 28) return "Anonymizing";
else if (StudyStatus === 30) return 'Anonymized' else if (StudyStatus === 30) return "Anonymized";
else if (StudyStatus === 32) return 'Anonymizing Failed' else if (StudyStatus === 32) return "Anonymizing Failed";
else if (StudyStatus === 34) return 'Forwarding' else if (StudyStatus === 34) return "Forwarding";
else if (StudyStatus === 36) return 'Forwarded' else if (StudyStatus === 36) return "Forwarded";
else if (StudyStatus === 38) return 'Forwarding Failed' else if (StudyStatus === 38) return "Forwarding Failed";
else return '' else return "";
}, },
// site // site
getSite() { getSite() {
getTrialSiteSelect(this.trialId).then((res) => { getTrialSiteSelect(this.trialId).then((res) => {
this.siteOptions = res.Result this.siteOptions = res.Result;
}) });
}, },
// visit // visit
getVisitPlanOptions() { getVisitPlanOptions() {
getTrialVisitStageSelect(this.trialId) getTrialVisitStageSelect(this.trialId).then((res) => {
.then((res) => { this.visitPlanOptions = res.Result;
this.visitPlanOptions = res.Result });
})
}, },
// //
handleShareImage(row) { handleShareImage(row) {
this.shareLink = '' this.shareLink = "";
this.extractionCode = '' this.extractionCode = "";
const params = { const params = {
TrialId: row.TrialId, TrialId: row.TrialId,
SiteId: row.SiteId, SiteId: row.SiteId,
SubjectId: row.SubjectId, SubjectId: row.SubjectId,
StudyId: row.Id StudyId: row.Id,
} };
this.loading = true this.loading = true;
createImageShare(params).then((res) => { createImageShare(params)
this.loading = false .then((res) => {
if (res.IsSuccess) { this.loading = false;
// this.shareLink = `${window.location.origin}${window.location.pathname}#/imagesShare?id=${res.Result.ResourceId}` if (res.IsSuccess) {
this.shareLink = `${window.location.origin}/imagesShare?id=${res.Result.ResourceId}` // this.shareLink = `${window.location.origin}${window.location.pathname}#/imagesShare?id=${res.Result.ResourceId}`
this.extractionCode = res.Result.Password this.shareLink = `${window.location.origin}/imagesShare?id=${res.Result.ResourceId}`;
this.share_model.visible = true this.extractionCode = res.Result.Password;
} this.share_model.visible = true;
}).catch(() => { this.loading = false }) }
})
.catch(() => {
this.loading = false;
});
}, },
getBodyPart(bodyPart) { getBodyPart(bodyPart) {
if (!bodyPart) return '' if (!bodyPart) return "";
var separator = ',' var separator = ",";
if (bodyPart.indexOf('|') > -1) { if (bodyPart.indexOf("|") > -1) {
separator = '|' separator = "|";
} else if (bodyPart.indexOf(',') > -1) { } else if (bodyPart.indexOf(",") > -1) {
separator = ',' separator = ",";
} else if (bodyPart.indexOf('') > -1) { } else if (bodyPart.indexOf("") > -1) {
separator = '' separator = "";
} }
var arr = bodyPart.split(separator) var arr = bodyPart.split(separator);
var newArr = arr.map(i => { var newArr = arr.map((i) => {
return this.$fd('Bodypart', i.trim()) return this.$fd("Bodypart", i.trim());
}) });
return newArr.join(' | ') return newArr.join(" | ");
}, },
// //
copyCode() { copyCode() {
this.$copyText(`链接: ${this.shareLink} 提取码: ${this.extractionCode}`).then( this.$copyText(`链接: ${this.shareLink} 提取码: ${this.extractionCode}`)
res => { .then((res) => {
this.$message.success('复制成功') this.$message.success("复制成功");
} })
).catch(() => { this.$alert('复制失败') }) .catch(() => {
this.$alert("复制失败");
});
}, },
onCopyError() { onCopyError() {
this.$alert('复制失败') this.$alert("复制失败");
}, },
// //
handleSearch() { handleSearch() {
this.searchData.PageIndex = 1 this.searchData.PageIndex = 1;
this.getList() this.getList();
}, },
// //
handleReset() { handleReset() {
this.searchData = searchDataDefault() this.searchData = searchDataDefault();
this.getList() this.getList();
}, },
// //
handleSortByColumn(column) { handleSortByColumn(column) {
if (column.order === 'ascending') { if (column.order === "ascending") {
this.searchData.Asc = true this.searchData.Asc = true;
} else { } else {
this.searchData.Asc = false this.searchData.Asc = false;
} }
this.searchData.SortField = column.prop this.searchData.SortField = column.prop;
this.searchData.PageIndex = 1 this.searchData.PageIndex = 1;
this.getList() this.getList();
} },
} },
} };
</script> </script>

View File

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

View File

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